1.空格绕过方法
1.1 IFS变量绕过
Shell的内部字段分隔符,默认包含空格,可以用它替代空格字符。就是IFS
使用IFS替代空格
利用位置参数$1(通常为空)作为分隔符
注意:当我们使用$IFS时,如果后面紧跟其他字符,shell可能会将整个字符串(如$IFSflag.txt)视为一个变量名,因为变量名可以包含字母数字和下划线,且紧接在$后。所以,cat$IFSflag.txt会被解释为变量$IFSflag的值加上.txt,而不是cat、空格、flag.txt。
$1 是shell脚本的位置参数(1到9都可以),表示第一个参数。在命令注入的上下文中,如果没有传递参数,$1通常是空的。在$IFS$1中,$1被放在$IFS后面,即使$1为空,这样$IFS$1就等于$IFS的值(空格)加上一个空字符串,结果还是空格。而且,由于$1的存在,它打破了$IFS和后面字符的连接,使得shell能够正确解析。
1.2 重定向绕过
使用输入重定向来避免在命令中启用空格。
使用<绕过
采用<>绕过
注意:<>这是一个重定向操作符,表示以“读写模式”打开文件。在这里,它用于将文件 /tmp/flag.txt 同时作为输入和输出(但实际上 cat 命令通常只读取文件,不会写入文件,所以这个操作符的效果与单纯读取类似)。
1.3 大括号扩展
利用大括号扩展将命令和参数组合,避免显式空格

2.多命令执行
2.1 分号分隔
否成功都执行后面的。就是无论前一个命令

2.2 逻辑与
只有前一个命令成功才执行后面的。

2.3 逻辑或
只有前一个命令失败才执行后面的。

2.4 管道
前一个命令的输出作为后一个命令的输入

3.关键词过滤绕过
3.1 变量绕过
将命令或文件名拆分成多个部分再组合执行。

3.2 转义符绕过
\转义符号只对一些特殊符号转义,对字母转义跟不转义效果一样。

3.3 引号分割
采用引号将命令名或参数分割开。

3.4 通配符绕过
?匹配单个字符

*匹配多个字符
4.编码绕过
4.1 Base64编码
将命令转换为Base64编码,继而通过管道解码执行,绕过关键字检测。

4.2 十六进制编码
将命令转换为十六进制格式,应用xxd或其他工具解码执行。

4.3 URL编码
重要用于Web应用,将特殊字符URL编码绕过过滤。
http://target.com/cmd.php?input=cat%20/tmp/flag.txt
URL编码表(常用):

4.4 Unicode编码
利用Unicode转义序列表示字符,绕过基于ASCII的检测。

5.内联绕过
内联执行是命令注入中常用的一种技术,它利用命令替换来执行任意命令。通过反引号或 $(),攻击者可以绕过一些简单的过滤机制。在安全开发中,应该始终假设用户输入是不可信的,并采取相应的防护措施。




