XXE漏洞

发布时间 2023-09-16 19:53:17作者: Eddie_Murphy

来自:

[NCTF2019]Fake XML cookbook

在moectf2023中也有一道题知识点是XXE漏洞,只不过那道更明显一点。

XXE漏洞全称XML External Entity Injection 即XML外部实体注入。

XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件和代码,造成任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等危害。

XXE漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。

XXE常见利用方式

与SQL相似,XXE漏洞也分为有回显和无回显

有回显,可以直接在页面中看到payload的执行结果或现象。

无回显,又称为blind xxe,可以使用外带数据(OOB)通道提取数据。即可以引用远程服务器上的XML文件读取文件。

解析xml在php库libxml,libxml>=2.9.0的版本中没有XXE漏洞。

(来自:https://blog.csdn.net/qq_52907838/article/details/118030007

 

打开就是一个登录页面,一般正常人想到的都是SQL注入,但是这里没用。也没有什么注册按钮,那常规外网渗透也渗不了。

打开源码,看到最后有个地方:

最后有个error: function(XMLHttpRequest, textStatus, errorThrown),这里就可以初见端倪,应该就是相关XML的一个XXE漏洞。

我们随便输一个账号密码,然后bp抓包:

发现最后这个位置是XML/HTML格式,这里就可以XXE外部实体注入了。

里面存在一个XML实体,我们可以构造恶意实体,尝试读取文件:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
  <!ENTITY admin SYSTEM "file:///etc/passwd">
  ]>
<user><username>&admin;</username><password>111</password></user>

成功获取。

(一般我们都会用file:///etc/passwd来测试是否可以文件包含、路径穿越这些)

接着尝试读取flag,一般在根目录:

 

payload解释:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 称为 XML prolog ,用于声明XML文档的版本和编码,是可选的,必须放在文档开头。

standalone值是yes的时候表示DTD仅用于验证文档结构,从而外部实体将被禁用,但它的默认值是no,而且有些parser会直接忽略这一项。

按实体有无参分类,实体分为一般实体和参数实体,

一般实体的声明:<!ENTITY 实体名称 "实体内容">,引用一般实体的方法:&实体名称;

外部实体,用来引入外部资源。有SYSTEM和PUBLIC两个关键字,表示实体来自本地计算机还是公共计算机。

因为将file:///flag命名为admin,所以下面用&admin。