Linux操作系统下PHP服务器安全配置技巧

http://tech.ddvip.com   2007年08月24日    社区交流

内容摘要:Linux操作系统下PHP服务器安全配置技巧

http://www.securityfocus.com/bid/4303
<?
//test_6.php
system("traceroute $a_query",$ret_strs);
?>

  由于程序没有过滤$a_query变量,所以攻击者可以用分号来追加执行命令。

  攻击者输入如下请求可以执行cat /etc/passwd命令:

  http://victim/test_6.php?a_query=www.example.com;cat /etc/passwd

  PHP的命令执行函数还有system(), passthru(), popen()和``等。命令执行函数非常危险,慎用。如果要使用一定要严格检查用户输入。

  解决方法:

  要求程序员使用escapeshellcmd()函数过滤用户输入的shell命令。

  启用safe_mode可以杜绝很多执行命令的问题,不过要注意PHP的版本一定要是最新的,小于PHP-4.2.2的都可能绕过safe_mode的限制去执行命令。

  7、sql_inject

  如下的SQL语句如果未对变量进行处理就会存在问题:

  select * from login where user='$user' and pass='$pass'

  攻击者可以用户名和口令都输入1' or 1='1绕过验证。

  不过幸亏PHP有一个默认的选项magic_quotes_gpc = On,该选项使得从GET, POST, COOKIE来的变量自动加了addslashes()操作。上面SQL语句变成了:

  select * from login where user='1' or 1='1' and pass='1' or 1='1'

  从而避免了此类sql_inject攻击。

  对于数字类型的字段,很多程序员会这样写:

  select * from test where id=$id

  由于变量没有用单引号扩起来,就会造成sql_inject攻击。幸亏MySQL功能简单,没有sqlserver等数据库有执行命令的SQL语句,而且PHP的mysql_query()函数也只允许执行一条SQL语句,所以用分号隔开多条SQL语句的攻击也不能奏效。但是攻击者起码还可以让查询语句出错,泄漏系统的一些信息,或者一些意想不到的情况。

责编:豆豆技术应用

正在加载评论...