-[ 作者信息 ]-----------------------------------------------------------------------
标题: "PHP Undergroud Security"
作者: Omnipresent
邮箱: omnipresent@email.it - omni@playhack.net
主页: http://omni.playhack.net - http://www.playhack.net
日期: 2007-04-12
---------------------------------------------------------------------------------
-[ 译者信息 ]-----------------------------------------------------------------------
译者:riusksk(泉哥)
邮箱:riusksk@qq.com
主页: http://riusksk.blogbus.com
日期:2008-11-15
---------------------------------------------------------------------------------
-[ 摘要 ]---------------------------------------------------------------------
0x00: 前言
0x01: 关注全局变量
# 修补
0x02: 文件包含
# 修补
0x03: 跨站脚本
0x04: SQL注入
_ 0x04a: 绕过登陆验证
_ 0x04b: 1 Query? No.. 2 one!(译注:不好翻译,还是保留原文吧!)
# 修补
0x05: 文件遍历
# 修补
0x05: 结论
---[ 0x00: 前言]
大家好!首先对我糟糕的英语表示抱歉,因为它不是我的母语.
在本教程中,我将会向大家介绍一些主要的php漏洞,以及如何发现、利用并修补它!
-----------------------------------------------------------------------------[/]
---[ 0x01: 关注全局变量]
在php中,你并不一定需要声明变量(这对程序员来说确实是件好事),当你必须使用它时它会“自动”创建的。你可能认为这是件不错的事,确实如此,但这只是偶而发生的事情。
众所周之,PHP经常要获取用户的输入值,并对其进行处理。假如我们在使用一个未声明过的变量时,就可能会引发web程序的安全问题。例如下面一段代码:
[...]
if ($is_admin == 1) {
//Yes, I'm the admin so call the Administration Pannel
[...]
} else {
//No, I'm not the admin
[...]
}
上面的变量$is_admin ,我们在使用前并未声明过,那么我们是否可以绕过该变量(在bugged.php文件中)而访问未经授权的管理面板呢?答案是肯定,但我们该如何添加管理认证权限呢?其实很简单,比如:
http://remote_host/bugged.php?is_admin=1
---[ 修补 ]---
如何修补该漏洞呢?这很容易:在if语句前声明变量$is_admin 即可,代码如下:
$is_admin = 0;
[...]
if ($is_admin == 1) {
//Yes, I'm the admin so call the Administration Pannel(为真,则说明是管理员,因此被重定向管理界面)
[...]
} else {
//No, I'm not the admin(为假,则不是管理员)
[...]
}
-----------------------------------------------------------------------------[/]
---[ 0x02: 文件包含]
-----[本地文件包含]
PHP是种杰出的语言,强大而简单;但是如果你不想在你的代码中出现安全问题,那么你就必须注意一下你的代码了。
在一些情况下,使用动态包含文件(部分路径名存在某个变量中)确实是件好事。让我们看一下下面的代码:
<!--p
include "/users/".$include_path.".php";
[...]
-->
变量$include_path 在使用前并未进行任何声明,因此攻击者可以在该变量中输入恶意数据,使其包含其它文件(比如/etc/passwd..)。
用户通过修改URL中的$include_path 变量值可以很容易浏览其它文件。例如:
http://remote_host/bugged.php?include_path=../../../../etc/passwd%00
包含后的结果如下:
<!--p
include "/users/../../../../etc/passwd%00.php"
[...]
-->
因此攻击者可以窃取到存在服务器上的所有密码。
- [ 注意 ] -
%00是一个NULL字符,用于“删除”PHP文件扩展名。如果省略掉NULL,将只会显示PHP文件的内容,因为包含文件的扩展名是PHP(include "/users/".$include_path.".PHP")
-------------------------------------------------------------------------------
-----[ 远程文件包含] Read the rest of this entry