Command Injection,即命令注入攻击,是指这样一种攻击手段,黑客通过把HTML代码输入一个输入机制(例如缺乏有效验证限制的表格域)来改变网页的动态 生成的内容。一个恶意黑客(也被称为破裂者cracker)可以利用这种攻击方法来非法获取数据或者网络资源。当用户进入一个有命令注入漏洞的网页时,他 们的浏览器会通译那个代码,而这样就可能会导致恶意命令掌控该用户的电脑和他们的网络。

命令注入攻击最初被称为Shell命令注入攻击,是由挪威一名程序员在1997年意外发现的。第一个命令注入攻击程序能随意地从一个网站删除网页,就像从磁盘或者硬盘移除文件一样简单。

命令注入攻击,就是利用在第一章中提到的5个执行外部命令的函数:system、exec、passthru、shell_exec、”“”进行攻击(参见http://www.cn09.com/php/15-php/13-php.html)。对于大多数使用虚拟主机的网站,这些命令本身就是被禁止执行的,所以不可能受到攻击。普通公网WEB应用,似乎也不会在普通用户的操作中出现这些命令的调用,所以,个人理解,这应该是企业级应用中,内部工作人员对服务器进行攻击时采用这种方式比较具备可行性。

与任何其它的攻击手段相同,只有当输入没有被合理验证时,才会产生这些漏洞。

攻击者本人同时需要具备一定的LINUX/UNIX经验

2.2.1 ex2-5.php:

 
<?php
$dir=$_GET['dir'];
if(isset($dir))
{
  echo "<div>";
  system("ls -al".$dir);
  echo "</div>";

黑客可以用以下URI进行注入攻击:

 
ex2-5.php?dir=|cat/etc/passwd

从而得到passwd的内容
分析:漏洞产生的原因是$dir没有验证。
例2.2.2 exp2-6.php用exec来代替system命令,原理与2.2.1相同
例2.2.3 exp2-7.php用passthru来代替system命令,原理与2.2.1相同
2.3eval注入攻击 ex2-8.php

 
<?php
$myvar='varname';
if(isset($_GET['arg'])
{
    $arg=$_GET['arg'];
    eval('\$myvar=$arg;');
    echo'\$myvar='.$myvar;
?>

黑客可使用下面的URI进行攻击:

 
http://localhost/example/exp2-8.php?arg=system('dir c:');

程序会执行system(‘dir c:’);
分析:感觉这种代码不可能在正常应用中出现,应该是木马程序中的一段
exp2-9 通过$_GET改变变量的值

 
<?php
$x='HELLO';
$y=1;
$z=2.5;
foreach($_GET as $key=>$value){
    $$key=$value;
}
echo 'x='.$x.'<br/>';
echo 'y='.$y.'<br/>';
echo 'z='.$z.'<br/>';
?>

黑客可以直接在uri中给$x $y $z赋值:

 
http://localhost/example/ex2-9.php?x=123&y=abc&z=100

分析:这段代码不但没有验证输入值,连输入的变量名都没有验证过,可以称得上神奇了。但实际工作中,这种情况并非不可见。
2.3.3 ex2-10.php 利用pre_replace函数进行攻击(从略)
2.3.4 ex2-11.php 利用str_replace函数进行攻击
这两个原理相同,都是用输入的值去替换字串,如果没有对输入值进行验证,则有可能被用于执行一些特殊命令,如phpinfo()、system等等
ex2-11.php

 
<?php
    $string='AaBbCcDdEeFfGg';
    $pattern='/^/e';
    echo $preg_replace($pattern,"str_replace('".$_GET['text']."','<i>".$_GET["text"]."</i>',".$string.");",$string);
?>

这段代码的本意是把输入字串部分变为斜体:

 
http://localhost/example/ex2-11.php?text=Aa

将把字串中的Aa显示为斜体。
但黑客攻击时有可能输入:

 
http://localhost/example/ex2-11.php?text=b','b',phpinfo();//

结果函数的参数就成了:

 
str_replace('b','b',phpinfo());//...

//后面的代码段都被变成注释文字,直接调用phpinfo显示了服务器信息
分析:phpinfo()已经是比较危险的了,如果用的是system(),后果会不堪设想。
动态函数ex2-12.php:

 
<?php
    $x=5;
    $y=8;
    function A(){
        global $x,$y;
        retun $x+$y;
    }
    function B(){
        global $x,$y;
        return $x-$y;
    }
    if(isset($_GET['func']))
    {
        $myfunc=$_GET['func']);
        echo $myfunc();
        echo "<br/>";
        echo ${"myfunc"}();
    }
?>

这段代码的原意是根据输入值选择不同函数,比如输入:

 
http://localhost/example/ex2-12.php?func=A

就会显示$x+$y的值13。
但黑客可以这样进行攻击:

 
http://localhost/example/ex2-12.php?func=phpinfo

分析:应该先用in_array来验证输入值是否符合规范
call_user_func函数ex2-13.php:

 
<?php
    $x=5;
    $y=8;
    function A(){
        global $x,$y;
        retun $x+$y;
    }
    function B(){
        global $x,$y;
        return $x-$y;
    }
    if(isset($_GET['func']))
    {
        $myfunc=$_GET['func']);
        echo call_user_func($_GET['func']);
    }
?>

分析:这段代码与上一例子基本一致。

防范的方法

1、尽量不要执行外部应用程序和命令;
2、使用自定义函数或函数库来替代外部应用程序或命令的功能;
3、使用escapeshellarg函数来处理命令的参数
4、使用safe_mode_exec_dir来指定可执行的文件路径
5、事先列出可以提供给system、eval等函数的参数

参考文献:

1.  http://whatis.ctocio.com.cn/searchwhatis/15/7582515.shtml

2.  http://www.cn09.com/php/15-php/16-command-injection.html

其他可参考文章:

3.  http://www.owasp.org/index.php/Command_Injection

随机文章

本文还暂无回复

添加回复

支持 Ctrl+Enter 快速提交