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 中不含以下过滤,即可使用此漏洞)

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

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

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

接下来做了一个判断,error_reporting() & $errno
第二个条件需要我们传参的时候将error
设置为一个不为 0 的数
通过条件后就会throw $exception
,TP 定义了throw
执行的方法

接着定位到appException
方法

首先判断是否属于 Exception,这毫无疑问是的,因为
class ErrorException extends Exception
主要看第 52 行代码,跟进render
方法

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

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

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

b用莫得