Kali的IP地址:192.168.127.139
靶机的IP地址:192.168.127.130
网上看到了好多xxe靶机通关的文章,但是没人写为什么可以实现文件读取,为什么是XXE漏洞,我在这里简单写一下,一来方便自己以后看,二来对还没有接触过xxe漏洞的朋友来说也比较友好
目录
一、信息搜集
1.1、扫描主机口
1.2、扫描端口
发现开放了俩个端口,一个80(http),一个5355端口(llmnr),所以我们访问80端口
1.3、访问端口
访问web服务发现为apache默认页面,猜测存在隐藏目录
1.4、扫描目录
扫到一个robots.txt文件
接着我们访问 http://192.168.127.130/robots.txt 发现是一个/xxe/目录,有个后台页面
接着访问XXE目录 http://192.168.127.130/xxe/
xxe登录框,弱密码尝试失败。直接burp抓包看看
可以看到用户名密码是通过xml传递给后端的
二、漏洞挖掘
首先我们要知道,xml是具有存储功能的,而且当我们输入一个错误的用户名的时候,错误信息就会在name标签那里展现出来,如下图:
这是为什么呢?这里就涉及到xml的特性了,我们先来看看xml的文本结构:
第一个:
<?xml version="1.0" encoding="UTF-8"?>
这部分是xml声明
第二个:
<!DOCTYPE 文件名 [
<!ENTITY实体名 "实体内容">
]>
这部分是xml的定义文档类型的DTD
第三个:
<元素名称 category=“属性”>
文本或其他元素
</元素名称>
这部分是文档元素
这三块上下连在一起就构成了xml文本的整体结构。
这里的漏洞就出现在DTD中,在xml中,可以在DTD中定义应用外部DTD以供xml来解析,其本意是为了方便在各个文档中创建共享的公共引用(这一点与文件包含比较相似)。而且,在引用外部实体之后,xml会自动将引用的外部实体内容体现在xml正文中(注意正文中引用的test的格式一定要写对,前面&后面;)。如果我们可以随意修改引用的外部实体,就有可能造成任意文件读取。
例如:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY test SYSTEM "file:///etc/passwd">
]>
<name>&test;</name>
上面的代码中,xml外部实体test被赋值为/etc/passwd,跟文章上面说的一样,xml读取的时候会直接将被读取的/etc/passwd内容显示在页面上
要注意在name标签里面的格式一定要正确,前面加&后面加; 而且都要注意是英文。
知道了上述思路之后,再看burp拦截出来的包就很简单了:
直接写一段xml通过报错读到/etc/passwd
三、漏洞利用
我们尝试构造xml的payload
直接构造外部实体注入的payload,修改post体,读取/etc/password/目录下的内容,发现能读出来,证明肯定存在xxe漏洞
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY admin SYSTEM "file:///etc/passwd">
]>
<root><name>&admin;</name><password>1</password></root>
前面还有个admin.php没有看到,可以读一下php的源码
用php://filter/read=convert.base64-encode/resource=admin.php来获取base64编码之后的网页源码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY admin SYSTEM "php://filter/read=convert.base64-encode/resource=admin.php">
]>
<root><name>&admin;</name><password>admin</password></root>
返回包进行了加密,无法直接找到flag,我们直接在bp的decode模块解密(非常好用)
base64解码:找到用户名密码
用户名:administhebest 密码:e6e061838856bf47e1de730719fb2609
编码之后密码显示MD5继续解码:
获得密码:admin@123
登录xxe那个登录框不行
继续登录/xxe/admin.php的登录框,输入用户名密码回车之后出现了一个flag按钮
点击flag,很高兴,但是发现什么也没有
但是刚才的思路,我们是可以读取它的源码的,直接读取flag文件的源码,可以继续读flagmeout的PHP页面,去base64解密后,发现文件源码明文内容
看到出现一串base64加密的字符,继续在decoder模块中解密
这又是一段base32加密的,在线base32解密:
JQZFMMCZPE4HKWTNPBUFU6JVO5QUQQJ5
又是一串base64加密的
L2V0Yy8uZmxhZy5waHA=
是一个路径
打开这个路径
继续base64解密后
返回出来的结果很熟悉,是php变形的webshell,但是这个webshell没有添加php头。
要想知道文件内容也很简单,浏览器可以访问并识别php文件,linux也自带php识别功能,也可以直接找在线运行网站,但是要记着写这个php文件的时候要添加<?php ?>
我们找个PHP在线运行的网站试试
https://code.y444.cn/php
成功拿到flag。
总结:
首先xxe是xml外部实体注入漏洞,可通过进入外部实体进行攻击,例如读取敏感文件,扫描端口等等,实战中感觉出现几率不是很大