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

本文还暂无回复