Low:
命令注入即通过在原本输入框中拼接系统命令的方式,在服
务器上执行对应的指令。
在存在执行系统命令的函数,如php中的system、exec、shell_exec等,用户可以传入命令的参数的时候,将恶意的命令拼接其中,就可以造成命令注入攻击。
以DVWA中最简单(LOW)级别来演示:
该处设置一个ping功能,输入一个IP地址即可以从服务器对该地址执行ping操作。源代码如下:
target参数为将要ping的ip地址,比如在输入框输入127.0.0.1后,对于windows系统,会发出ping 127.0.0.1操作。
这里可以引入命令行的几种操作方式:
A && B: 先执行A,如果成功,执行B;
A || B :先执行A,如果失败,执行B;
A | B:管道,先执行A后,将A的结果作为B的输入,打印的是B的结果;
A & B:先执行A,然后不管成功与否,执行B;
再看上面的源代码,可以想到在ping命令后可以尝试其他命令的拼接,比如在linux系统中执行ping 127.0.0.1 & ls,则会先运行ping指令,之后执行ls指令,列出当前文件夹的内容。那么在这个地方同样可以进行拼接,输入框中填入127.0.0.1 & ls,这些内容都会作为target参数传入服务器从而拼接出整个系统命令并执行。
这也就是命令注入的基本原理。
攻击效果如图:
Medium与High:
在DVWA中Medium及High级别下,针对命令注入进行的防御措施实际上都没有太大差别,都进行的是对用户输入的过滤操作:
Medium的过滤操作部分代码:
High的过滤操作部分代码:
Medium只对&&与;两种符号进行过滤,所以用其他的||,|,&同样可以进行攻击,对于High,它对可能造成攻击的符号都进行了过滤操作,但是在对 | 进行过滤的时候,多了一个空格,如下:
在命令行中进行操作的时候,空格不一定是必须的,此处如果输入127.0.0.1 | ls(即竖线后有空格)和127.0.0.1|ls,两者效果一致,所以只要不加空格同样可以造成攻击。
Impossible
设置DVWA防御级别为impossible,查看这部分的代码:
这里不仅做了命令注入的防御,还做了CSRF的防御。
其中,is_numberic()函数返回值为:如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE。
传入ip地址(即用户的输入内容)后,服务器会利用explode函数将该地址依据.划分为4个部分,比如127.0.0.1中的3个.将该ip划分成了4个数字,检验每个部分是否为数字。所以如果出现非法字符,is_numberic()就返回了false。
补充:
CTF或渗透测试中常用于进行命令注入攻击拼接的命令:
ls :列出当前文件夹的内容;
sleep 5:观察是否存在时间差来检测是否存在漏洞;
whoami:当前的用户;
cat /etc/shadow:影子文件,存储linux中用户的密码信息
ls -alh /home/:查看用户
ls -alh /home/用户名/ : 查看具体用户的目录
usname -a:查看系统信息