欢迎光临
我们一直在努力
"

ThinkPHP request函数远程代码执行

payload:


 

直接动态调试吧,漏洞调用链是这样的。

先看看 app.php:139 位置,其中var_pathino 默认值为s,也就是说我们通过 s 参数注册了一个 \think\captcha\CaptchaController 的路由,至于为什么会是这样,可以翻一翻我之前的Thinkphp-5-0远程代码执行漏洞,里面针对路由怎么调用进行了详细的说明。

而在 vendor/topthink/think-captcha/src/helper.php 文件中针对captcha这个功能进行了路由注册,所以才能够调用。

而这里的返回type为什么是method,需要考究一下。在 app.php:116 处的 routeCheck 函数处下一个断点,跟进 routeCheck ,在 thinkphp/library/think/App.php:643 处调用 check 函数,跟进 check 函数 thinkphp/library/think/Route.php:857 调用了 method 函数。而 method 函数之前我们说过存在变量覆盖的问题,通过覆盖之后使得 $method=get ,然后再取出 self::$rules[\$method] 的值给 $rules 。

然后继续往下走 thinkphp/library/think/Route.php:873 ,此时使得$rules[$item]的值为captcha路由数组,就可以进一步调用到self::parseRule函数。

跟进一下此时传递进来的 $route 的值为 \think\captcha\CaptchaController@index ,经过处理之后 routeCheck函数处理之后 type=method 。

前面我们传入的 type 为 method ,所以进入到 app:exec() 中,会选择 method 这个 case 进行逻辑处理,而这个 case 正好调用了 param 这个函数,那么后面的流程自然就和 0x02部分 一样了。

目前来看,漏洞触发需要两个前置条件,一种情况下如果采用thinkphp原生框架,需要在debug模式下才能够触发。另一种情况是找到一些第三方组件,并且该组件注册了thinkphp的路由,因为这步操作的影响就是改变了上文提到的self::$rules的值,而thinkphp自带的一些第三方组件下,好像也只有captcha这个组件,学习了。

和同事在讨论过程中,发现下面这个poc用来验证比较准确点。

转载请注明: 转载自Legend‘s BLog

本文链接地址: ThinkPHP request函数远程代码执行



未经允许不得转载:Legend‘s BLog » ThinkPHP request函数远程代码执行

分享到:更多 ()

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

无觅相关文章插件,快速提升流量