如何分析并复现ThinkPHP 5.x版本中的远程命令执行漏洞?
- 内容介绍
- 文章标签
- 相关推荐
本文共计576个文字,预计阅读时间需要3分钟。
在修复前,程序未对控制器进行过滤,导致攻击者可以通过注入+符号来调用任意类方法。
其中使用了 $this->app->controller 方法来实例化控制器,然后调用实例中的方法。跟进 controller 方法:
其中通过 parseModuleAndClass 方法解析出 $module 和 $class,然后实例化 $class。
而 parseModuleAndClass 方法中,当 $name 以反斜线 \ 开始时直接将其作为类名。利用命名空间的特点,如果可以控制此处的 $name(即路由中的 controller 部分),那么就可以实例化任何一个类。
接着,我们再往回看路由解析的代码。其中 route/dispatch/Url.php:: parseUrl 方法调用了 route/Rule.php:: parseUrlPath 来解析 pathinfo 中的路由信息
代码比较简单,就是使用 / 对 $url 进行分割,未进行任何过滤。
其中的路由 url 从 Request::path () 中获取
由于 var_pathinfo 的默认配置为 s,我们可利用 $_GET ['s'] 来传递路由信息,也可利用 pathinfo 来传递,但测试时 windows 环境下会将 $_SERVER ['pathinfo'] 中的 \ 替换为 /。
本文共计576个文字,预计阅读时间需要3分钟。
在修复前,程序未对控制器进行过滤,导致攻击者可以通过注入+符号来调用任意类方法。
其中使用了 $this->app->controller 方法来实例化控制器,然后调用实例中的方法。跟进 controller 方法:
其中通过 parseModuleAndClass 方法解析出 $module 和 $class,然后实例化 $class。
而 parseModuleAndClass 方法中,当 $name 以反斜线 \ 开始时直接将其作为类名。利用命名空间的特点,如果可以控制此处的 $name(即路由中的 controller 部分),那么就可以实例化任何一个类。
接着,我们再往回看路由解析的代码。其中 route/dispatch/Url.php:: parseUrl 方法调用了 route/Rule.php:: parseUrlPath 来解析 pathinfo 中的路由信息
代码比较简单,就是使用 / 对 $url 进行分割,未进行任何过滤。
其中的路由 url 从 Request::path () 中获取
由于 var_pathinfo 的默认配置为 s,我们可利用 $_GET ['s'] 来传递路由信息,也可利用 pathinfo 来传递,但测试时 windows 环境下会将 $_SERVER ['pathinfo'] 中的 \ 替换为 /。

