background image

PHP 常见漏洞被攻击原因分析

如何通过全局变量进行攻击?

PHP 中的变量不需要事先声明,它们会在第一次使用时自动创建,它们的类型根据上下
文环境自动确定。从程序员的角度来看,这无疑是一种极其方便的处理方法。一旦一个变
量被创建了,就可以在程序中的任何地方使用。这个特点导致的结果就是程序员很少初始
化变量。

很显然,基于 PHP 的应用程序的主函数一般都是接受用户的输入(主要是表单变量,上
载文件和 Cookie 等),然后对输入数据进行处理,然后把结果返回到客户端浏览器。为
了使 PHP 代码访问用户的输入尽可能容易,实际上 PHP 是把这些输入数据看作全局变量
来处理的。

例如:

程序代码

以下为引用的内容:

<FORM METHOD="GET" ACTION="test.php">
<INPUT TYPE="TEXT" NAME="hello">
<INPUT TYPE="SUBMIT">
</FORM>

这会显示一个文本框和提交按钮。当用户点击提交按钮时,"test.php"会处理用户的输入,
当"test.php"运行时,"$hello"会包含用户在文本框输入的数据。从这里我们应该看出,攻击
者可以按照自己的意愿创建任意的全局变量。如果攻击者不是通过表单输入来调
用"test.php",而是直接在浏览器地址栏输入 http://server/test.php?hello=hi&setup=no,那么,
不止是"$hello"被创建,"$setup"也被创建了。

下面的用户认证代码暴露了 PHP 的全局变量所导致的安全问题:

程序代码

以下为引用的内容:

<?php
if ($pass == "hello")
$auth = 1;
...
if ($auth == 1)
echo "some important information";
?>