1. 题目背景与核心挑战解析
"拯救芙莉莲"是楚慧杯网络安全竞赛中的一道典型Web安全题目,其核心考察点在于命令注入漏洞的绕过技巧。题目模拟了一个需要破解"宝箱怪封印"的魔法场景,参赛者需要通过精心构造的"咒语"(即系统命令)来读取服务器上的flag文件。
这道题目的精妙之处在于它设置了多重防御机制:
- 第一层过滤:直接禁用常见的命令执行函数(如system、exec等)
- 第二层过滤:屏蔽包含"flag"关键词的输入
- 第三层过滤:禁用20多种常见的文件读取命令
这种层层递进的防御设计,要求解题者必须深入理解Linux系统命令的特性,才能找到有效的绕过方法。
2. 代码安全机制深度剖析
2.1 危险函数过滤层
题目首先通过以下代码块禁用了一组PHP危险函数:
php复制$forbidden = array('system', 'exec', 'passthru', 'shell_exec', 'popen', 'proc_open');
foreach ($forbidden as $bad) {
if (stripos($spell, $bad) !== false) {
die("⚠️ 检测到禁忌的黑魔法!");
}
}
这些函数都是PHP中可以直接执行系统命令的高危函数。值得注意的是,这里使用了stripos进行不区分大小写的匹配,意味着像"SYSTEM"、"ExEc"这样的变体也会被拦截。
2.2 关键词过滤层
第二层防御专门针对flag文件:
php复制if (stripos($spell, 'flag') !== false) {
die("⚠️ 宝箱怪的魔法屏障启动了!");
}
这种设计很常见于CTF比赛,目的是防止选手直接通过"cat flag"这样的简单命令获取flag。同样使用了不区分大小写的匹配方式。
2.3 命令黑名单过滤层
最复杂的是第三层过滤,它建立了一个包含20多种常见命令的黑名单:
php复制$blocked_commands = array('cat', 'tac', 'nl', 'more', 'less', 'head', 'tail', 'sort', 'uniq', 'strings', 'od', 'xxd', 'hexdump', 'grep', 'awk', 'sed', 'cut', 'rev', 'base64', 'env');
这些命令都是Linux下常用的文件查看和处理工具。题目通过这种方式强制选手寻找非常规的文件读取方法。
3. PureWaf工具实战应用
3.1 PureWaf工具简介
PureWaf是一个专门用于自动化生成绕过Web应用防火墙(WAF)payload的Python工具。它通过分析过滤规则,智能生成最短的有效载荷。
在本案例中,我们可以这样初始化PureWaf:
python复制from PureWaf import purewaf
w = purewaf(
waf_words="system|exec|passthru|shell_exec|popen|proc_open|flag|cat|tac|nl|more|less|head|tail|sort|uniq|strings|od|xxd|hexdump|grep|awk|sed|cut|rev|base64|env"
)
3.2 有效载荷生成原理
PureWaf的工作原理主要包括以下几个步骤:
- 分析过滤规则:将提供的waf_words参数拆分为独立的过滤项
- 构建命令库:整理Linux系统中可用于文件操作的所有命令和参数组合
- 智能匹配:找出既不被过滤又能实现目标功能的最短命令组合
- 结果输出:展示最优解和可能的替代方案
3.3 生成的绕过方案
针对本题,PureWaf给出了两个关键payload:
code复制[+] Shortest Root Payload : ls /
[+] Shortest Flag Payload : vi /f???
第一个payload"ls /"用于列出根目录下的文件,帮助定位flag文件的位置。它巧妙地避开了所有被过滤的命令。
第二个payload"vi /f???"则利用了vi编辑器的文件读取能力和Linux的通配符特性:
- vi虽然未被列入黑名单,但它可以查看文件内容
- /f???使用通配符匹配flag文件名,避免直接出现"flag"关键词
4. 进阶绕过技巧与实战心得
4.1 替代命令的选择
当常见命令被过滤时,可以考虑以下替代方案:
- 文件查看:vim、nano、ed、view、emacs
- 目录浏览:ls、dir、find、tree
- 文件传输:curl、wget、nc、scp(如果可用)
4.2 通配符的高级应用
Linux通配符在绕过过滤时非常有用:
- ? 匹配任意单个字符
-
- 匹配任意数量字符
- [] 匹配指定范围内的字符
- {} 创建多个匹配模式
例如:
- "/fla?" 可以匹配"flag"但不会触发"flag"关键词过滤
- "/f*" 匹配所有以f开头的文件
4.3 编码与混淆技巧
如果直接命令被过滤,可以尝试:
- 十六进制编码:echo -e "\x63\x61\x74\x20\x66\x6c\x61\x67"
- Base64编码:
echo "Y2F0IGZsYWc=" | base64 -d | bash - 变量拼接:a=c;b=at;$a$b flag
4.4 实战注意事项
- 测试环境安全:确保在合法授权范围内进行测试
- 最小权限原则:使用最低必要权限执行命令
- 命令回显观察:注意命令执行的输出细节,可能包含关键线索
- 多角度尝试:不要局限于一种方法,组合使用多种技巧
5. 防御方案与最佳实践
5.1 安全的命令执行实现
如果业务确实需要命令执行功能,应该:
- 使用白名单而非黑名单
- 严格限制可执行的命令范围
- 实现参数过滤和验证
- 使用专用账户执行命令,限制权限
5.2 输入验证强化
改进的过滤方案示例:
php复制$allowed_commands = ['date', 'whoami']; // 明确允许的命令白名单
$command = explode(' ', $_GET['cmd'])[0];
if (!in_array($command, $allowed_commands)) {
die("Command not allowed");
}
5.3 日志与监控
实施全面的日志记录:
- 记录所有命令执行请求
- 监控异常执行模式
- 设置实时告警机制
6. 同类题目扩展思路
类似的CTF题目通常会从以下几个角度进行变种:
- 过滤规则变化:增加正则表达式过滤、长度限制等
- 执行环境限制:禁用特殊字符、空格等
- 输出限制:限制回显内容、过滤特定关键词
- 权限控制:使用低权限账户执行命令
应对这些变化需要:
- 熟练掌握Linux系统特性
- 了解各种命令的非常规用法
- 熟悉字符编码和混淆技术
- 具备创造性思维
在实际渗透测试中,命令注入漏洞的危害性极大,可能导致整个服务器沦陷。因此开发人员必须充分理解其风险,在代码层面做好防护,而安全研究人员则需要不断探索新的检测和防御方法。