thinkphp5.0.23 rce

/ 0评 / 0

攻击者以可通过向缓存文件写入PHP代码,来进行远程代码执行。由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下完成getshell

漏洞原理

从入口 app::run 开始,跟进 run() 函数

找到后面的路由检测函数,跟进 routeCheck() 函数

跟进 routeCheck 中的 check 方法

在check中有 获取当前方法 的method()函数

下面再 method函数 中会获取 var_method 这个伪变量,则会就是我们通过post传进来的 _method ,这里面进入判断之后会将我们的post的值当作Requests类的调用,这里我们的poc 是传入的 __construct ,这样就会调用它的构造方法,并且参数是post

继续跟进构造方法 __construct ,这里的foreach会遍历所有变量,将存在的参数全部覆盖掉,在我们传入的参数中的filter,就把之前的覆盖了, 并且在这里传入的method为get的原因在于之前注册路由使用的是GET方法,所以这里要把请求的method方法覆盖成get,避免报错。

这里调用完成之后 routeCheck 将返回 method 赋值给 dispatch。之后会继续在 run 函数里面执行 exec函数。由于type为method执行的相应的分支。这里的 param方法能获取参数,并且和URL中的参数合并。这里得到的参数就是post数据中的 get[]=dir

它的返回调用了 input 方法,跟进input

input最后将参数和filter一起传入array_walk_recursive中。其中参数中有我们传入的dir,filter通过getFilter有我们传入的system

在getFilter 中会调用 array_walk——recursive会用filterValue来处理数据,在这知中用call_user_func

这里的 system 和 dir 分别是 filter和value 的值,构造在一起就成功触发命令执行了

复现过程

参考链接

https://www.dazhuanlan.com/2019/12/05/5de818364c3ac/

https://blog.csdn.net/weixin_43071873/article/details/110084577

 

发表评论

电子邮件地址不会被公开。