ThinkPHP命令执行分析
2020-12-22 10:43:26
漏洞分析
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
的值
接着需要弄清楚如何调用method
和param
方法,在位于thinkphp\library\think\App.php
中的app类中的exec方法,当$dispatch['type']
为controller
或method
时,就会触发无参数的param
方法在param
方法中会调用method
方法,接着向上看,程序执行时会自动调用run
方法
run
方法中调用了exec
方法,重要的是$dispatch['type']
的值,我们只要找到个存在的路由就可以满足条件,默认存在着?s=captcha
验证码路由,我们只要post
注册路由的方法即可