有很多网站采用的是ThinkPHP V5.0.12框架,其核心类Requests对变量属性校验不严,可以通过变量覆盖属性并结合框架特性对任意函数调用,实现任意代码执行。
漏洞分析
代码流程
首先在开启debug的时候会直接在下面的箭头处触发RCE,这里先关掉debug。

跟进routeCheck()
这里会调用Route类的check方法:

继续跟进check方法
这里会调用Request类的method方法:

跟进method方法
POST可以接收_method参数。根据接收到的参数值调用方法的核心漏洞点就在此:由于没有对参数进行严格限制,可以调用_construct,初始化filter变量。

继续跟进_construct方法

但此处只是设置了filter值,还需要进一步调用。
最终导致RCE的位置在filterValue中:

此方法被input()调用,input()又被多个方法进一步调用:

若开启debug,1处可以直接触发RCE:

未开启debug时,需要进一步跟进exec()。
此方法中调用了module方法:

module方法中会加载控制器:

controller会反射一个类:

invokeClass()调用bindParams方法:

最终调用param()触发RCE:

调用堆栈

漏洞复现
POC
1 2
| POST /?s=index/index s=whoami&_method=_construct&method=POST&filter[]=system
|
利用
