「 典型安全漏洞系列 」05.XML外部实体注入XXE详解

admin 2024年7月14日19:03:38评论34 views字数 2180阅读7分16秒阅读模式

前期回顾:

1. XXE简介

XXE(XML external entity injection,XML外部实体注入)是一种web安全漏洞,允许攻击者干扰应用程序对XML数据的处理。它通常允许攻击者查看应用程序服务器文件系统上的文件,并与应用程序本身可以访问的任何后端或外部系统进行交互。

在某些情况下,攻击者可以利用XXE漏洞执行服务器端请求伪造(SSRF)攻击,从而升级XXE攻击以破坏底层服务器或其他后端基础设施。

「 典型安全漏洞系列 」05.XML外部实体注入XXE详解
XXE攻击原理图

1.1. XML介绍

可扩展标记语言(Extensible Markup Language,XML)有两个关键要点:

  • 标记:指计算机能理解的信息符号(标签),通过这些标签,计算机之间可以处理包含各种信息的HTML、文章等;
  • 可扩展性:使用者可以根据需要自行定义标签。

下面是一个包含XML声明、文档类型定义(Document Type Definition,DTD)的XML文件样例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
  <!ELEMENT root (element1element2)>
  <!ELEMENT element1 (#PCDATA)>
  <!ELEMENT element2 (#PCDATA)>
]>


<root>
  <element1>Value 1</element1>
  <element2>Value 2</element2>
  <attribute name="attr1">Value A</attribute>
</root>

Note:DTD用于定论XML文档的结构,它作为XML文件的一部分位于XML声明和文档元素(样例中<root>节点下的元素)之间。

外部实体语法格式:<!ENTITY 实体名 SYSTEM "URL/URI",这里的URL可以使用file://协议,因此可以从XML文件中加载外部实体。

2. 攻击原理

一些应用程序使用XML格式在浏览器和服务器之间传输数据。这样做的应用程序实际上总是使用标准库或平台API来处理服务器上的XML数据。XXE漏洞的出现是因为XML规范包含各种潜在的危险功能,而标准解析器支持这些功能,即使应用程序通常不使用这些功能

XML外部实体是一种自定义XML实体,其定义的值是从声明它们的DTD外部加载的。从安全角度来看,外部实体特别有趣,因为它们允许根据文件路径或URL的内容定义实体。

3. 攻击思路

攻击者通常采用如下三个步骤执行攻击:

  • Step 1:扫描目标系统,寻找存在安全漏洞的XML文档。
  • Step 2:构造恶意的外部实体引用,并将其插入到目标XML文档中。
  • Step 3:通过发送带有恶意实体引用的XML文档给目标系统的用户,诱使用户打开这个文档,从而实现远程代码执行或本地文件读取等攻击目的。

4. 防御方法

  • 禁用外部实体:实际上,所有XXE漏洞都是由于应用程序的XML解析库支持应用程序不需要或不打算使用的潜在危险的XML功能而产生的。防止XXE攻击的最简单、最有效的方法是禁用这些功能或方法;
  • 输入过滤:过滤用户提交的XML数据,关键词<!DOCTYPE、<!ENTITY SYSTEM、PUBLIC

Note:通常,禁用外部实体的解析和禁用对XInclude的支持就足够了。这通常可以通过配置选项或通过编程重写默认行为来完成。有关如何禁用不必要的功能的详细信息,请参阅XML解析库或API的文档。

5. 攻击案例

5.1. 环境介绍

攻击者利用XXE漏洞,通过回显获取系统敏感信息,环境地址:https://portswigger.net/web-security/xxe/lab-exploiting-xxe-to-retrieve-files

5.2. 攻击细节

1. 发现请求参数包含XML格式数据

访问产品页面,单击“检查库存”,并在Burp Suite中拦截生成的POST请求,截图如下「 典型安全漏洞系列 」05.XML外部实体注入XXE详解

2. 检测XML是否被解析及是否支持DTD引用外部实体,有回显或者报错

首先在XML声明和stockCheck元素之间插入以下外部实体定义:<!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>,然后将productId编号替换为对外部实体的引用:&xxe;。响应应包含“Invalid product ID:”,后跟/etc/passwd文件的内容。

「 典型安全漏洞系列 」05.XML外部实体注入XXE详解

完整的payload如下:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>

<stockCheck><productId>&xxe;</productId><storeId>1</storeId></stockCheck>

6. 参考链接

  • https://portswigger.net/web-security/xxe
「 典型安全漏洞系列 」05.XML外部实体注入XXE详解

原文始发于微信公众号(筑梦之月):「 典型安全漏洞系列 」05.XML外部实体注入XXE详解

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年7月14日19:03:38
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   「 典型安全漏洞系列 」05.XML外部实体注入XXE详解https://cn-sec.com/archives/2949702.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息