2.1 分号 `;`
无论前一条命令是否执行成功,分号均会执行后一条命令,适用于连续执行多条互不影响的命令。
示例:
echo mt ; whoami
同时输出 "mt" 和当前用户名。
2.2 管道 `|`
管道符将前一条命令的标准输出作为后一条命令的标准输入。在绕过中常用于“仅执行后面那条命令”(因为前一条的输出被丢弃,除非后一条命令读取了它)。但严格来说,两条命令都会执行,只是前者的输出被作为输入。
2.3 逻辑或 `||`
当前一条命令执行失败(返回非零)时,才会执行后一条命令。常用于回退或替代执行。
示例中,若前一条命令失败,则执行后一条。
2.4 逻辑与 `&`
单个 & 表示后台运行,但此处演示的是两个命令都会执行(实际是顺序执行,前一条后台运行,后一条立即执行)。
2.5 逻辑与 `&&`
只有前一条命令执行成功(返回0)时,才会执行后一条命令。注意URL编码时需转义为 %26%26。
2.6 换行符与回车符
%0a 代表换行符,%0d 代表回车符。在某些过滤中,可以利用它们分割命令,实现类似分号的效果。
> **常见问题**:为何部分运算符在Web请求中需进行URL编码?
> 这是因为 &、|、; 等字符在HTTP参数中具有特殊含义(如参数分隔符),必须编码为 `%26`、`%7C`、`%3B` 等。
---
## 0x03 利用通配符绕过
通配符是Linux Shell的重要特性,能够匹配文件名或路径中的部分字符,常用于绕过黑名单或避免直接输入敏感字符。
- ?:匹配任意一个字符。
- *:匹配任意多个字符(包括0个)。
**实战案例:读取敏感文件 /etc/passwd**
3.1 使用 `?` 匹配
cat%20/etc/pa??wd
其中两个 `??` 分别匹配 `s` 和 `s`(因为passwd中两个s字符)。
3.2 混合使用 `?` 和 `*`
cat%20/etc/pa?*wd
这里 `pa?*wd` 匹配 `pa` + 任意一个字符 + 任意多个字符 + `wd`,同样可匹配 `passwd`。
3.3 极端通配符绕过
cat /*****et*c*/*pas**************************************************swd
大量星号可以绕过简单的字符串检测,但需注意路径深度和匹配效率。
> **小提示**:实际渗透过程中,通配符常与管道、重定向等组合使用,例如 `cat /???/passwd` 可尝试匹配 `/etc/passwd`。
---
## 0x04 使用大括号绕过空格限制
许多输入过滤会禁止空格字符(如%20或+),此时可借助Shell的大括号展开特性,以逗号分隔参数,绕过空格限制。
**语法样式:**
{命令,参数1,参数2}
**实战示例:**
4.1 读取文件
{cat,/etc/passwd}
4.2 列出目录详情
{ls,-alth}
等价于 `ls -alth`,注意大括号内不允许有空格,各参数用逗号分隔。
> **常见问题**:大括号展开是否总能替代空格?
> 并非所有命令都支持,但大多数单命令参数均有效。若命令本身包含通配符或重定向,需结合使用。
---
## 0x05 命令混淆与变形
黑名单常检测特定命令字符串(如 `whoami`、`id`),利用Shell变量展开或路径通配符可构造出等价的命令。
5.1 使用Shell变量插入
在命令中间插入 $1、$@、$* 等变量(通常为空),不影响命令执行。
whoami wh$1oami who$@ami whoa$*mi
所有变形都会执行 whoami。
5.2 路径通配符变形
利用绝对路径与通配符代替命令名。
/*/bin/wh*mi /us*/*in/who*mi /*s?/*?n/w?o*i
第一个 `/*/bin/wh*mi` 会匹配 `/usr/bin/whoami` 等路径;第二个 `/*s?/*?n/w?o*i` 匹配 `/usr/sbin/whoami` 或类似路径。
> **小提示**:若系统限制了 `whoami` 命令,可尝试 `id`、`who`、`w` 等替代命令,并以相同方法变形。
---
## 0x06 编码绕过
对命令进行多种编码,可绕过基于文本匹配的WAF或黑名单。
6.1 Base64编码
将原命令先进行base64编码,然后在Shell中解码并执行。
echo id|base64
得到 aWQK 等,再通过 echo aWQK|base64 -d|bash 执行。
6.2 URL编码
对命令中的每一个字符进行URL编码(如 %xx),可以绕过简单的字符串检测。
例如 id 命令的URL编码为:
%28%22%65%5c%63%68%6f%20%5c%69%5c%64%7c%62%61%73%65%36%34%22%29%3b
实际解码后为 ("echo \id|base64"); 等,需要结合执行环境。
> **常见问题**:URL编码后的命令如何执行?
> 在Web环境中,请求参数会自动解码一次,因此需谨慎处理双重编码。通常将编码后的字符串通过 `printf` 或 `eval` 等再解码执行。
---
## 总结与建议
通过本教程,你已经掌握了在Linux HTTP服务一句话木马场景下,运用逻辑运算符、通配符、大括号、命令混淆、变形及编码等多种方式绕过命令执行限制的技巧。这些方法在渗透测试、CTF竞赛以及安全评估中极具实用价值。
**最后提醒**:所有操作请务必在授权环境下进行,未经允许测试他人系统属于违法行为。实际工作中,建议结合具体WAF规则灵活组合这些技巧,并留意日志清理。