记一次实战getshell
字数 1261 2025-08-10 22:18:18
ThinkPHP5 RCE漏洞利用与绕过disable_functions技术详解
漏洞发现与初步探测
- 目标识别:发现一个未设置验证码的小程序后台系统
- 初步尝试:
- 尝试弱口令攻击未果
- 发现页面输入错误信息时暴露框架信息 - ThinkPHP5框架
ThinkPHP5 RCE漏洞利用
漏洞验证
使用以下Payload验证RCE漏洞存在:
GET http://target.com/?s=captcha
POST数据: _method=__construct&filter=system&method=GET&s=whoami
响应分析:
- 返回"system() has been disabled"表明:
- RCE漏洞确实存在
- 但system()函数被禁用
替代执行方法
-
尝试其他函数:当system()被禁用时,可尝试:
- shell_exec()
- exec()
- passthru()
- popen()
- proc_open()
-
使用公开EXP:
- 推荐工具:bewhale/thinkphp_gui_tools
- 上传Webshell可能显示失败但实际成功
Webshell管理问题
-
冰蝎连接问题:
- 成功连接但无法执行命令
- 反弹shell功能同样失效
-
原因分析:
- disable_functions限制导致命令执行受阻
- 需要分析上传请求确定实际使用的执行函数
绕过disable_functions技术
方法一:pcntl_exec绕过
-
原理:
- pcntl_exec()通常不在默认禁用列表中
- 允许执行指定程序
-
利用步骤:
- 上传专用脚本:Bypass_Disable_functions_Shell
- 确认pcntl_exec可用
- 编写并上传反弹shell脚本
- 通过pcntl_exec执行
方法二:LD_PRELOAD绕过(仅限Linux)
-
原理:
- 通过环境变量LD_PRELOAD预先加载自定义共享库
- 劫持库函数调用
-
实现方式:
- 编写恶意.so文件
- 通过putenv设置LD_PRELOAD
- 触发新进程创建
方法三:PHP扩展加载
- 原理:
- 上传自定义PHP扩展
- 通过dl()或php.ini加载
- 扩展中包含未受限的系统函数
完整攻击流程总结
- 识别ThinkPHP5框架目标
- 验证RCE漏洞存在
- 尝试直接命令执行,确认限制
- 上传Webshell获取初步访问
- 探测可用的绕过技术:
- 检查pcntl_exec可用性
- 评估LD_PRELOAD可行性
- 考虑PHP扩展加载
- 根据环境选择合适绕过方法
- 实现持久化访问或权限提升
防御建议
- 及时更新:升级到ThinkPHP安全版本
- 禁用危险函数:完善disable_functions列表
- 输入过滤:严格过滤所有用户输入
- 权限控制:Web服务使用最小权限原则
- 日志监控:记录异常请求和文件上传行为
- WAF部署:拦截已知攻击模式
工具与资源
- thinkphp_gui_tools - ThinkPHP漏洞利用工具
- Bypass_Disable_functions_Shell - 绕过disable_functions的PHP脚本
- phpggc - PHP反序列化Payload生成器