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/