1. XXE简介
XXE(XML external entity injection,XML外部实体注入)是一种web安全漏洞,允许攻击者干扰应用程序对XML数据的处理。它通常允许攻击者查看应用程序服务器文件系统上的文件,并与应用程序本身可以访问的任何后端或外部系统进行交互。
在某些情况下,攻击者可以利用XXE漏洞执行服务器端请求伪造(SSRF)攻击【dss】,从而升级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 (element1, element2)><!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. 攻击思路
攻击者通常首先扫描目标系统,寻找存在安全漏洞的XML文档。然后,构造恶意的外部实体引用,并将其插入到目标XML文档中。最后,通过发送带有恶意实体引用的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请求,截图如下
2、检测XML是否被解析及是否支持DTD引用外部实体,有回显或者报错
首先在XML声明和stockCheck元素之间插入以下外部实体定义:<!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
,然后将productId编号替换为对外部实体的引用:&xxe;
。响应应包含“Invalid product ID:”,后跟/etc/passwd
文件的内容。
完整的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. 参考
[1] https://portswigger.net/web-security/xxe
前期回顾
「 典型安全漏洞系列 」04.服务器端请求伪造SSRF详解
「 典型安全漏洞系列 」03.跨站请求伪造CSRF详解
「 典型安全漏洞系列 」02.SQL注入详解
「 典型安全漏洞系列 」01.跨站脚本攻击XSS详解