大家好!首先对我糟糕的英语表示抱歉,因为它不是我的母语. 在本教程中,我将会向大家介绍一些主要的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是种杰出的语言,强大而简单;但是如果你不想在你的代码中出现安全问题,那么你就必须注意一下你的代码了。 在一些情况下,使用动态包含文件(部分路径名存在某个变量中)确实是件好事。让我们看一下下面的代码: <?php include "/users/".$include_path.".php"; [...] ?> 变量$include_path 在使用前并未进行任何声明,因此攻击者可以在该变量中输入恶意数据,使其包含其它文件(比如/etc/passwd..)。 用户通过修改URL中的$include_path 变量值可以很容易浏览其它文件。例如: http://remote_host/bugged.php?include_path=../../../../etc/passwd%00 包含后的结果如下: <?php include "/users/../../../../etc/passwd%00.php" [...] ?> 因此攻击者可以窃取到存在服务器上的所有密码。 - [ 注意 ] - %00是一个NULL字符,用于“删除”PHP文件扩展名。如果省略掉NULL,将只会显示PHP文件的内容,因为包含文件的扩展名是PHP(include "/users/".$include_path.".PHP")