当遇到命令注入挑战且发现一些关键字符或命令被过滤时,如cat
命令、空格、目录分隔符(/
或\
)和运算符(如;
, &&
, ||
),这增加了攻击的难度,但并非不可能克服。下面是一些绕过这些过滤的技术:
绕过cat
命令过滤
-
使用其他命令读取文件:
tac
命令可以反向读取文件,可以用作cat
的替代品,但通常tac
也会被过滤。- 使用
more
或less
命令,它们也可以用来查看文件内容。 xxd
命令可以以十六进制转储的形式显示文件的内容。
-
使用
bash
内置命令:source
或.
命令可以读取并执行脚本文件,这在某些情况下可以用来间接读取文件。
-
使用管道和重定向:
- 如果管道符号
|
没有被过滤,可以尝试使用head
或tail
与管道结合使用来读取文件的一部分。
- 如果管道符号
绕过空格过滤
- 使用URL编码:将空格编码为
%20
。 - 使用替代分隔符:如
;
或|
(如果这些符号没有被过滤)。 - 使用环境变量:如
${IFS}
(Internal Field Separator)在Shell中可以表示空格。
绕过目录分隔符过滤
- 使用
. .
:在某些情况下,. .
可以被解析为目录分隔符。 - 使用环境变量:如果
PATH
或PWD
等环境变量可用,可以尝试利用它们。 - 使用软链接或硬链接:创建指向目标文件的链接,然后使用链接的路径。
绕过运算符过滤
- 使用环境变量:如
${IFS}
可以用作分隔符。 - 使用
bash
的特性:例如,bash
的&&
和||
运算符可以被$'&\&'
和$'||'
替代。 - 使用管道
|
:如果管道没有被过滤,可以使用它来串接命令。
实际技巧:
- 使用
bash
的-c
选项:如果bash
命令本身没有被过滤,可以尝试使用bash -c "command"
的形式来执行命令。 - 利用
eval
函数:如果脚本语言如PHP或Perl中eval
函数可用,可以构造一个字符串,使用eval
函数来执行命令。 - 使用十六进制或八进制码:如果某些字符被过滤,尝试使用其十六进制或八进制形式。