ThinkPHP命令执行分析

漏洞分析

method调用任意方法导致的RCE

漏洞触发点位于\thinkphp\library\think\Request.php中的filterValue方法,如下

该处存在可利用的call_user_func,继续寻找何处调用了filterValue方法,在同类中的input方法中调用了此方法

继续向上回溯,在同类中的param方法调用了input方法

接着来注意到method方法

在这里$this->method的值为POST键值为_method的值

那么在这里通过$this->{$this->method}($_POST);调用Request类的任意方法,接着注意到此类中的__construct方法

该方法中可以进行变量的覆盖,那么到这里我们就可以使用method方法来给类中的变量赋值,为达到命令执行的目的我们需要控制$data$filter的值,向上回溯后发现需要控制$this->get$this->filter的值

接着需要弄清楚如何调用methodparam方法,在位于thinkphp\library\think\App.php中的app类中的exec方法,当$dispatch['type']controllermethod时,就会触发无参数的param方法在param方法中会调用method方法,接着向上看,程序执行时会自动调用run方法

run方法中调用了exec方法,重要的是$dispatch['type']的值,我们只要找到个存在的路由就可以满足条件,默认存在着?s=captcha验证码路由,我们只要post注册路由的方法即可