发布于 

ThinkPHP命令执行分析

漏洞分析

method调用任意方法导致的RCE

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

1

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

2

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

3

接着来注意到method方法

4

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

5

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

6

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

7

8

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

10

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


本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本站由 @yemoli 创建,使用 Stellar 作为主题。