在看代码审计知识星球时,学到了一种新的XXE的利用方式:Error Based XXE,一般在无回显的情况下使用
先来说报错XXE的前提条件:目标服务器开启了报错(报错XXE当然要报错了)
漏洞环境:https://github.com/vulhub/vulhub/tree/master/php/php_xxe
首先贴出来Error Based XXE的Poc
1 |
|
ext.dtd的内容如下,开启http服务将其暴露在公网
1 |
|
看到上面的Poc,和我们无回显XXE的Poc非常相似,只是http/ftp协议被替换成了file协议,通过FileNotFound异常将我们读取到的内容回显出来,并且使用file协议并不会因为换行的原因无法读取多行文件
这种情况明显是在出网的情况下,而在不出网的情况下,也有解决办法
首先将ext.dtd引入进来,替换掉%ext,并且将其中的%进行Unicode编码
1 |
|
可以看到我们的路径已经爆出来了<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 |
|
