您的位置:首页 > 编程语言 > PHP开发

如何对PHP程序中的常见漏洞进行攻击

2011-05-21 21:31 501 查看
转载请标明出处: 本文来自 CSDN
博客。x

因为目前关于 CGI 平安性的文章都是拿 Perl 作为例子,之所以翻译这篇文章。而专门介绍 ASP PHP 或者 JSP 平安性的文章则很少。
Shaun Clow 这篇文章比较全面地介绍了 PHP 平安问题,原文可以在 http://www.securereality.com.au/studyinscarlet.txt 找到

而且有相当一部分是介绍文章的背景或 PHP 基础知识,由于原文比较长。没有涉及到 PHP
平安方面的内容,因此我没有翻译。如果你想了解这方面的知识,请参考原文。

远程文件,文章主要从全局变量。文件上载,库文件, Session 文件,数据类型和容易出错的函数这几个方面分析了 PHP 平安性,并且对如何增强 PHP
平安性提出了一些有用的建议。

言归正传! 好了废话少说。

[ 全局变量 ]

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

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

例如:

<FORM METHOD="GET" ACTION="test.php">

<INPUT TYPE="TEXT" NA ME="hello">

<INPUT TYPE="SUBMIT">

</FORM>

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

译者注:这两种方法也就是通常说的 POST 和 “ GET 方法。

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

<?php

if $pass == "hello"

$auth = 1;

...

if $auth == 1

echo "some import information";

?>

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

假定 “ $auth
没有设置值的时候是空的却没有想到攻击者可以创建任何全局变量并赋值,外表看起来是正确的而且我中有相当一部分人是这样做的但是这段代码犯了想当然的错误。通过类似 “ http://server/test.php?auth=1 方法,完全可以欺骗这段代码,使它相信我已经认证过的

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

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

HTTP_POST_VA RS 数组用于处理 POST 方式提交的变量,但是值得说明的 PHP 有四个不同的数组变量用来处理用户的输入。
HTTP_GET_VA RS 数组用来处理 GET 方式提交的变量。 HTTP_COOKIE_VA RS 数组用于处置作为 cooki 头提交的变量,而对于
HTTP_POST_FILES 数组(比较新的 PHP
才提供)则完全是用户用来提交变量的一种可选方式。用户的一个请求可以很容易的把变量存在这四个数组中,因此一个安全的 PHP 顺序应该检查这四个数组。

[ 远程文件 ]

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

<?php

"r" if ! $fd = fopen "$filename".

echo "Could not open file: $filename<BR>/n" ;

?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: