来自:
[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。
PHP引用外部实体,常见的利用协议: file://文件绝对路径 如:file:///etc/passwd http://url/file.txt php://filter/read=convert.base64-encode/resource=xxx.php标签:XML,文件,XXE,实体,漏洞,file From: https://www.cnblogs.com/EddieMurphy-blogs/p/17707198.html