目录

ThinkPHP < 5.0.23 Debug 下任意文件读取

目录

今下午,卷群里发了个 ThinkPHP 5.x 任意文件读取的漏洞,睡醒之后发现点神已经分析出来了。很久没有审计代码了,就当作康复训练也上手一下子

?s=index/think\Error/appError&errno=1&errstr=1&errline=1&errfile=文件路径

搭好 TP 环境,我使用的是 ThinkPHP 5.0.22(经测试只要 /thinkphp/library/think/App.php 中不含以下过滤,即可使用此漏洞)

https://cdn.bingbingzi.cn/blog/202207172236027.png

原因是 ThinkPHP 在 5.0.23 中修正控制器名获取

https://cdn.bingbingzi.cn/blog/202207172237164.png

定位到漏洞方法,首先会new一个ErrorException

https://cdn.bingbingzi.cn/blog/202207172242322.png

查看一下ErrorException的构造方法,它的作用是对$exception定义数据

https://cdn.bingbingzi.cn/blog/202207172243165.png

接下来做了一个判断,error_reporting() & $errno第二个条件需要我们传参的时候将error设置为一个不为 0 的数

通过条件后就会throw $exception,TP 定义了throw执行的方法

https://cdn.bingbingzi.cn/blog/202207172252901.png

接着定位到appException方法

https://cdn.bingbingzi.cn/blog/202207172253410.png

首先判断是否属于 Exception,这毫无疑问是的,因为

1
class ErrorException extends Exception

主要看第 52 行代码,跟进render方法

https://cdn.bingbingzi.cn/blog/202207172257896.png

这里的$this->render此时为空,所以不执行上面的if语句块,同时$e属于ErrorException也不满足下面第一个if,直接进入convertExceptionToResponse

https://cdn.bingbingzi.cn/blog/202207172301893.png

看到getSourceCode,这就是读取文件的方法

https://cdn.bingbingzi.cn/blog/202207172306314.png

而且可以发现,读取的内容是跟我们传入的errline有关,也就是可以遍历整个文件的所有内容,当超出内容后会没有数据返回

https://cdn.bingbingzi.cn/blog/202207172309919.png

b用莫得