命令注入指的是,利用没有验证过的恶意命令或代码,对网站或服务器进行渗透攻击。
注入有很多种,并不仅仅只有SQL注入。比如:
- 命令注入(Command Injection)
- Eval 注入(Eval Injection)
- 客户端脚本攻击(Script Insertion)
- 跨网站脚本攻击(Cross Site Scripting, XSS)
- SQL 注入攻击(SQL injection)
- 动态函数注入攻击(Dynamic Variable Evaluation)
- 序列化注入&对象注入
在之前常见危险函数
一课我们已经说过,在PHP中常用到以下几个函数来执行外部命令:
system
exec
passthru
shell_exec
所以接下来,要寻找哪个文件使用了这几个函数,并进行分析。
我们对函数名进行搜索,右键点击www
目录,在弹出来的菜单上选择find in folder
,这个是查找整个文件夹的意思,然后我们在下方弹出的框内输入第一个敏感函数:system
,点击Find,这时,编辑器就会查找WWW目录下所有内容里面有system的文件。
可以看到,在variables文件里有system函数,但它的功能只是让我们自定义网络,对本次试验无意义,因此我们查看下一个函数exec
。
用同样的方法搜索exec
函数:
它出现在在admin目录下的ping.php文件中,我们打开admin目录下的ping.php文件进行查看:
打开文件后可以看到,只有19到30行左右为PHP代码,其他均为HTML,因此核心代码应该为第19行到30行,如下:
-
<?php
-
if(
isset( $_POST[
'submit' ] ) ) {
-
$target = $_POST[
'target' ];
-
-
if (stristr(php_uname(
's'),
'Windows NT')) {
-
$cmd =
'ping ' . $target;
-
}
else {
-
$cmd =
'ping -c 3 ' . $target;
-
}
-
$res = shell_exec&
#40; $cmd );
-
echo
"<br /><pre>$cmd\r\n".iconv(
'GB2312',
'UTF-8',$res).
"</pre>";
-
}
-
?>
-
这段代码的功能是,使用ping命令,ping用户输入的ip。
接下来大概分析一下这段代码的大意:
首先通过isset函数判断是否为POST提交过来的值,接下来将POST过来的值传递给target变量,但是没有经过任何的过滤,接下来使用if判断系统是否为windows,如果是则给cmd赋值为ping target,如果不是则赋值为ping -c 3 target。最后使用shell_exec执行cmd。
我们从上面的代码中可以得到两点可能产生漏洞的地方:
>* POST过来的数据,没有经过任何的过滤。 >* 使用shell_exec函数执行了我们传递过来的POST值。
这便是漏洞所在的地方,我们可以在ip后面添加|
符,让它执行完ping命令后,继续执行我们在|符号后添加的字符,其中|
:是or的意思,执行完ping命令,因为有|
的存在,系统就会继续执行后面的命令。
漏洞修复
我们不仅要能发现这个漏洞,还要能对这个漏洞进行修复,那么如何修复呢?答案当然是过滤POST过来的变量,我们可以用很多方法对POST变量进行过滤。比如使用正则表达式来限制、或者首先判断POST过来的值是否为ip等等。
-
<?php
-
if(
isset( $_POST[
'submit' ] ) ) {
-
$target = $_POST[
'target' ];
-
-
if(preg_match(
'/^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$|^((25[0-5]|2[0-4]\d|[01]?\d\d?)($|(?!\.$)\.)){4}$/',$target)){
-
-
if (stristr(php_uname(
's'),
'Windows NT')) {
-
$cmd =
'ping ' . $target;
-
}
else {
-
$cmd =
'ping -c 3 ' . $target;
-
}
-
$res = shell_exec&
#40; $cmd );
-
echo
"<br /><pre>$cmd\r\n".iconv(
'GB2312',
'UTF-8',$res).
"</pre>";
-
}
-
-
else{
-
echo
"IP is error";
-
}
-
}
-
?>
-
使用正则表达式来对用户输入的POST值进行过滤验证,这样就可以避免恶意代码的执行。