XML是一种可扩展性语言,经常被用来传输和存储数据。
XML包括XML声明、DTD文档类型定义、文档元素。DTD文档类型定义即可以在XML内部声明,也可以是外部引用。
内部声明:<!DOCTYOE test any >
外部声明:<!DOCTYOE test SYSTEM '' >
XXE漏洞即为XML外部实体注入
看看漏洞是如何产生的?
代码为
<?php
$xml=<<<ABC
<?xml version="1.0" ?>
<!DOCTYPE AND [
<!ENTITY xxe SYSTEM "file:///C:/windows/win.ini">
]>
<note>
<name>&xxe;</name>
<sex>boy</sex>
</note>
ABC;
$data=simplexml_load_string($xml);
//把XML字符串载入对象中
print_r($data);
?>
simplexml_load_string函数将XML字符串进行执行,隐藏在XML文件里DTD外部引用成功得到执行,漏洞由此产生。
漏洞利用
读取任意文件内容
源代码
进行访问,可获取到win.ini文件内容
win.ini
我们来验证一下
win.ini
当没有回显的时候,只要能够被正确解析,依然可以利用。
a.php
把数据发送至远端服务器。
evil.dtd
依然可以读取文件
ok
探测内网端口
我这里开一台kali虚拟机进行测试,修改源码为
xxe.php
再次访问
探测出端口开放
实验操作
访问http://testhtml5.vulnweb.com/ 网站,点击login----forgot pwd ,进行实验
抓包,进行漏洞利用
注入
漏洞的利用至少满足两个条件:XML文件能成功解析、参数可控成功注入。
更多的实验和细节,参考