PHP代码审计之命令注入攻击


PHP漏洞-命令注入攻击

命令注入攻击

PHP中可以使用下列5个函数来执行外部的应用程序或函数

system、exec、passthru、shell_exec、``(与shell_exec功能相同)

函数原型

1 string system(string command,int&return_var)
2   command 要执行的命令
3   return_var 存放执行命令的执行后的状态值
1 string exec(string command,array&output,int&return_var)
2   command 要执行的命令
3   output 获得执行命令输出的每一行字符串
4   return_var 存放执行命令后的状态值
1 void passthru(string command,int&return_var)
2   command 要执行的命令
3   return_var 存放执行命令后的状态值
1 string shell_exec(string command)
2   command 要执行的命令

举个栗子:

system 命令执行
1 <?php 2   $cm=$_GET["cm"]; 3   if(isset($cm)){ 4     echo"
";
 5     system("ls-al".$cm);
 6     echo"
"; 7   } 8?>

通过输入http://www.xxx.com/index.php?cm=|cat /etc/passwd  进行命令执行

提交以后,命令变成了system("ls-al|cat/etc/passwd");

再举个梨子:

 1 <?php
 2   $var="var";
 3   if(isset($_GET["arg"])){
 4     $arg=$_GET["arg"];
 5     eval("\$var=$arg;");
 6     echo"\$var=".$var;
 7  }
 8 ?>

当我们提交http://www.xxx.com/index.php?arg=phpinfo();  漏洞就产生了动态函数

防范方法:

1、尽量不要执行外部命令

2、使用自定义函数或函数库来替代外部命令的功能

3、使用escapeshellarg函数来处理命令参数

4、使用safe_mode_exec_dir指定可执行文件的路径esacpeshellarg函数会将任何引起参数或命令结束的字符转义,单引号“'”,替换成“\'”,双引号“"”,替换成“\"”,分号“;”替换成“\;”

 用safe_mode_exec_dir指定可执行文件的路径,可以把会使用的命令提前放入此路径内

 safe_mode=On

 safe_mode_exec_dir=/usr/local/php/bin/