ThinkPHP代码执行漏洞是多个历史版本中因路由解析、控制器调用与输入过滤失当叠加形成的高危风险集合,核心在于动态调用机制(如s参数解析 hinkpp、_method属性覆盖、反序列化入口)被攻击者利用,实现零权限、单请求、绕过WAF的远程命令执行。

ThinkPHP代码执行漏洞不是单一问题,而是多个历史版本中因设计机制与输入处理失当叠加形成的高危风险集合。核心在于框架为开发便利而开放的动态调用能力——比如路由解析时允许反斜杠分隔命名空间、控制器方法名由URL直接映射、参数可被反射函数调用——一旦用户输入未被严格校验,就极易被攻击者“借道通行”。真正危险的不是某个特定CVE编号,而是这类漏洞普遍具备零权限、单请求、高隐蔽性特点:不需要登录,一条GET请求就能执行system('id'),甚至绕过简单关键词WAF。
常见触发路径与典型Payload
漏洞利用往往围绕几个关键入口展开:
-
路由参数s:如
?s=index/ hinkpp/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1,利用框架对s参数的宽松解析,将hinkpp识别为类路径,再通过invokefunction触发反射调用 -
_method伪装参数:在5.0.23及以下版本中,
$_POST['_method']可覆盖Request对象属性,配合__call魔术方法实现任意函数调用 -
反序列化入口点:如
?_method=__construct&filter[]=system&server[]=whoami,利用filter参数在某些场景下参与反序列化链构造,触发__destruct等魔术方法 -
日志/缓存文件写入:DEBUG模式开启且日志路径可预测(如
/Runtime/Logs/24_08_17.log),攻击者可诱导错误触发并下载含SQL语句或会话密钥的日志
立即生效的临时防护措施
在无法立刻升级或发布新版本时,可在入口文件public/index.php顶部快速加入拦截逻辑:
- 检查并拒绝包含
hink、invokefunction、call_user_func、eval、assert等特征的s、_method、function、filter参数值 - 对
$_GET和$_POST中的所有键名做白名单限制,仅允许业务必需字段,其余一律过滤或重置 - 强制关闭调试模式:
define('APP_DEBUG', false);,并确认config/app.php中'debug' => false已生效 - 禁用危险函数(需服务器权限):在
php.ini中设置disable_functions = system,exec,passthru,shell_exec,proc_open,popen,pcntl_exec
根本性修复与长期加固策略
临时封堵只能争取时间,真正安全依赖系统性改进:
立即学习“PHP免费学习笔记(深入)”;
- 强制升级到受支持版本:5.0.x → 5.0.24+;5.1.x → 5.1.38+;6.x → 6.0.13+;8.x已默认强化路由白名单与参数过滤,推荐新项目直接采用
-
关闭隐式路由信任:在
config/route.php中设置'url_route_must' => true,强制所有访问必须匹配预定义路由规则,杜绝路径自由拼接 -
剥离危险功能依赖:避免在控制器中直接使用
I()、input()获取未声明来源的参数;禁用__call、__invoke等可能被滥用的魔术方法 -
部署应用层WAF规则:在Nginx或云WAF中添加正则规则拦截
/think\、invokefunction、call_user_func.*array等组合特征,不依赖后端响应即可阻断
验证是否已修复到位
完成操作后,务必进行有效性验证:
- 手动发送经典Payload,确认返回404或空响应,而非
uid=0(root)或phpinfo()页面 - 检查
Runtime/Logs/目录是否不可Web访问(Nginx配置应禁止location ~ ^/Runtime/) - 运行
php -i | grep disable_functions确认危险函数已被禁用 - 使用
curl -I http://your-site.com/index.php?s=test确认响应头中不含X-Powered-By: ThinkPHP等敏感信息泄露



















