如何对PHP程序中的常见漏洞进行攻击(上).pdf
《如何对PHP程序中的常见漏洞进行攻击(上).pdf》由会员分享,可在线阅读,更多相关《如何对PHP程序中的常见漏洞进行攻击(上).pdf(6页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、如何对如何对 PHPPHP 程序中的常见漏洞进行攻击(上)程序中的常见漏洞进行攻击(上)翻译:analysist(分析家)来源:http:/www.china4lert.org如何对 PHP 程序中的常见漏洞进行攻击(上)原著:Shaun Clowes翻译:analysist之所以翻译这篇文章,是因为目前关于 CGI 安全性的文章都是拿 Perl 作为例子,而专门介绍 ASP,PHP 或者 JSP 安全性的文章则很少。Shaun Clowes 的这篇文章比较全面地介绍了 PHP的安全问题,原文可以在 http:/.au/studyinscarlet.txt 找到。由于原文比较长,而且有相当一部
2、分是介绍文章的背景或 PHP 的基础知识,没有涉及到 PHP安全方面的内容,因此我没有翻译。如果你想了解这方面的知识,请参考原文。文章主要从全局变量,远程文件,文件上载,库文件,Session 文件,数据类型和容易出错的函数这几个方面分析了 PHP 的安全性,并且对如何增强 PHP 的安全性提出了一些有用的建议。好了,废话少说,我们言归正传!全局变量PHP 中的变量不需要事先声明,它们会在第一次使用时自动创建,它们的类型也不需要指定,它们会根据上下文环境自动确定。从程序员的角度来看,这无疑是一种极其方便的处理方法。很显然,这也是快速开发语言的一个很有用的特点。一旦一个变量被创建了,就可以在程序
3、中的任何地方使用。这个特点导致的结果就是程序员很少初始化变量,毕竟,当它们第一次创建时,他们是空的。很显然,基于 PHP 的应用程序的主函数一般都是接受用户的输入(主要是表单变量,上载文件和 Cookie 等),然后对输入数据进行处理,然后把结果返回到客户端浏览器。为了使 PHP代码访问用户的输入尽可能容易,实际上 PHP 是把这些输入数据看作全局变量来处理的。例如:很显然,这会显示一个文本框和提交按钮。当用户点击提交按钮时,“test.php”会处理用户的输入,当“test.php”运行时,“$hello”会包含用户在文本框输入的数据。从这里我们应该看出,攻击者可以按照自己的意愿创建任意的全
4、局变量。如果攻击者不是通过表单输入来调用“test.php”,而是直接在浏览器地址栏输入http:/server/test.php?hello=hi&setup=no,那么,不止是“$hello”被创建,“$setup”也被创建了。译者注:这两种方法也就是我们通常说的“POST”和“GET”方法。下面的用户认证代码暴露了 PHP 的全局变量所导致的安全问题:if($pass=hello)$auth=1;.if($auth=1)echo some important information;?上面的代码首先检查用户的密码是否为“hello”,如果匹配的话,设置“$auth”为“1”,即通过认证。
5、之后如果“$suth”为“1”的话,就会显示一些重要信息。表面看起来是正确的,而且我们中有相当一部分人是这样做的,但是这段代码犯了想当然的错误,它假定“$auth”在没有设置值的时候是空的,却没有想到攻击者可以创建任何全局变量并赋值,通过类似“http:/server/test.php?auth=1”的方法,我们完全可以欺骗这段代码,使它相信我们是已经认证过的。因此,为了提高 PHP 程序的安全性,我们不能相信任何没有明确定义的变量。如果程序中的变量很多的话,这可是一项非常艰巨的任务。一种常用的保护方式就是检查数组 HTTP_GET或 POST_VARS中的变量,这依赖于我们的提交方式(GET
6、 或 POST)。当 PHP 配置为打开“track_vars”选项的话(这是缺省值),用户提交的变量就可以在全局变量和上面提到的数组中获得。但是值得说明的是,PHP 有四个不同的数组变量用来处理用户的输入。HTTP_GET_VARS 数组用来处理 GET 方式提交的变量,HTTP_POST_VARS 数组用于处理 POST 方式提交的变量,HTTP_COOKIE_VARS 数组用于处理作为 cookie 头提交的变量,而对于 HTTP_POST_FILES 数组(比较新的 PHP 才提供),则完全是用户用来提交变量的一种可选方式。用户的一个请求可以很容易的把变量存在这四个数组中,因此一个安全
7、的 PHP 程序应该检查这四个数组。远程文件PHP 是一种具有丰富特性的语言,提供了大量的函数,使编程者实现某个功能很容易。但是从安全的角度来看,功能越多,要保证它的安全性就越难,远程文件就是说明这个问题的一个很好的例子:if(!($fd=fopen($filename,r)echo(Could not open file:$filenamen);?上面的脚本试图打开文件“$filename”,如果失败就显示错误信息。很明显,如果我们能够指定“$filename”的话,就能利用这个脚本浏览系统中的任何文件。但是,这个脚本还存在一个不太明显的特性,那就是它可以从任何其它 WEB 或 FTP 站点
8、读取文件。实际上,PHP的大多数文件处理函数对远程文件的处理是透明的。例如:如果指定“$filename”为“http:/target/scripts/.%c1%1c./winnt/system32/cmd.exe?/c+dir”则上面的代码实际上是利用主机 target 上的 unicode 漏洞,执行了 dir 命令。这使得支持远程文件的 include(),require(),include_once()和 require_once()在上下文环境中变得更有趣。这些函数主要功能是包含指定文件的内容,并且把它们按照 PHP 代码解释,主要是用在库文件上。例如:include($libdir
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 如何 PHP 程序 中的 常见 漏洞 进行 攻击
限制150内