background image

上面的代码首先检查用户的密码是否为"hello",如果匹配的话,设置"$auth"为"1",即通
过认证。之后如果"$suth"为"1"的话,就会显示一些重要信息。

这段代码假定"$auth"在没有设置值的时候是空的,但是攻击者可以创建任何全局变量并
赋值,通过类似"http://server/test.php?auth=1"的方法,我们完全可以欺骗这段代码,使它
相信我们是已经认证过的。

因此,为了提高 PHP 程序的安全性,我们不能相信任何没有明确定义的变量。如果程序
中的变量很多的话,这可是一项非常艰巨的任务。

一种常用的保护方式就是检查数组 HTTP_GET[]或 POST_VARS[]中的变量,这依赖于我
们的提交方式(GET 或 POST)。当 PHP 配置为打开"track_vars"选项的话(这是缺省值),
用户提交的变量就可以在全局变量和上面提到的数组中获得。

但是值得说明的是,PHP 有四个不同的数组变量用来处理用户的输入。HTTP_GET_VARS
数组用来处理 GET 方式提交的变量,HTTP_POST_VARS 数组用于处理 POST 方式提交的
变量;HTTP_COOKIE_VARS 数组用于处理作为 cookie 头提交的变量,而对于
HTTP_POST_FILES 数组(比较新的 PHP 才提供),则完全是用户用来提交变量的一种
可选方式。用户的一个请求可以很容易的把变量存在这四个数组中,因此一个安全的 PHP

 

程序应该检查这四个数组。 如何通过远程文件进行攻击?

PHP 是一种具有丰富特性的语言,提供了大量的函数,使编程者很容易实现特定功能。但
是从安全的角度来看,功能越多,要保证它的安全性就越难,远程文件就佐证这个问题
的一个很好例子:

程序代码

以下为引用的内容:

<?php
if (!($fd = fopen("$filename", "r"))
echo("Could not open file: $filename
\n");
?>

上面的脚本试图打开文件"$filename",如果失败就显示错误信息。很明显,如果我们能够
指定"$filename"的话,就能利用这个脚本浏览系统中的任何文件。但是,这个脚本还存在
一个不太明显的特性,那就是它可以从任何其它 WEB 或 FTP 站点读取文件。实际上,
PHP 的大多数文件处理函数对远程文件的处理是透明的。

例如:

如果指定"$filename"  

为 "http://target/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir"

则上面的代码实际上是利用主机 target 上的 unicode 漏洞,执行了 dir 命令。这使得支持远
程文件的 include(),require(),include_once()和 require_once()在上下文环境中变得更有趣。
这些函数主要功能是包含指定文件的内容,并且把它们按照 PHP 代码解释,主要是用在