xxe漏洞可以做什么
XXE(XML External Entity)漏洞能直接读取服务器上的任意文件。2019年,某大型电商平台就因为这个漏洞,导致攻击者拿到了/etc/passwd,进而摸清了整台服务器的用户结构。这不是个例,XXE的危害远不止读个文件那么简单。
要理解XXE能做什么,得先看它怎么工作。XML解析器在处理文档时,会解析外部实体声明。如果开发者没关掉这个功能,攻击者就能在XML里定义一个指向本地文件或远程URL的实体。解析器一执行,文件内容或远程响应就被塞进XML里返回给攻击者。整个过程服务器毫无察觉。
读文件是最基础的利用方式。攻击者构造一个SYSTEM实体,指向file:///etc/passwd或file:///c:/windows/win.ini,服务器解析后就把文件内容吐出来。这招在Linux和Windows上都管用。有些场景下,攻击者甚至能读取Web应用的配置文件,比如数据库连接字符串,直接拿到数据库密码。
但XXE能做的远不止读文件。如果目标服务器支持外部DTD加载,攻击者可以搭建一个恶意DTD,让服务器发起HTTP请求。这就变成了SSRF。通过XXE做SSRF,攻击者能探测内网服务,比如访问http://192.168.1.1:8080/admin,看看内网里有什么东西。很多企业内网没有严格隔离,一台Web服务器往往能访问内部管理系统、Redis、Elasticsearch等。XXE就成了跳板。
更狠的是盲注场景。有些应用不直接返回XML解析结果,攻击者看不到文件内容。这时候可以用带外通道。攻击者把文件内容拼接到一个外部实体的URL里,比如http://attacker.com/?data=文件内容,服务器解析时就会向攻击者的服务器发起请求。攻击者看自己服务器的访问日志,文件内容就躺在URL参数里。这种方式能绕过很多限制,只要服务器能出网就行。
拒绝服务也是XXE的拿手好戏。经典的Billion Laughs攻击,通过嵌套实体让XML解析器消耗大量内存和CPU。一个几KB的XML文档就能让服务器内存耗尽,服务直接挂掉。2018年,某在线文档协作平台就因为这个漏洞,被一个简单的XML文档打瘫了半小时。
命令执行呢?XXE本身不直接执行命令,但在特定环境下可以。比如PHP的expect扩展,如果服务器装了,攻击者可以用expect://id这样的实体来执行系统命令。Java环境下,如果存在某些特定的库,也可能通过XXE触发反序列化,进而RCE。这种组合利用比较少见,但一旦成功,危害极大。
实际渗透测试中,XXE的利用往往比想象中灵活。我见过一个案例,目标应用只接受SOAP请求,但返回的XML里过滤了敏感字符。攻击者用CDATA包裹文件内容,绕过了过滤。还有一次,目标服务器没有回显,但攻击者通过XXE让服务器向内网DNS发起请求,用DNS日志外带数据。方法总比困难多。
防御XXE其实不复杂。禁用外部实体解析,用disallow-doctype-decl或者直接关掉DTD处理。很多语言和框架都提供了配置选项。但现实是,大量老旧系统、第三方组件、甚至某些云服务,默认配置就是开启的。开发者图省事,安全就没了。
XXE漏洞能做什么?读文件、SSRF、端口扫描、DoS、甚至RCE。它像一把瑞士军刀,取决于目标环境允许你做什么。一个看似无害的XML解析功能,背后可能藏着通往内网和系统权限的钥匙。









