By:心灵

    一个音乐系统 -0-!扔在硬盘也等于发霉,经典对白看代码。漏洞存在于“common.inc.php”文件中,具体如下。

common.inc.php:

……

if(!in_array(substr(strrchr($_SERVER['PHP_SELF'],"/"),1),array("login.php","login.php?action=logined")))
{
        checkLogin();
}
//以上是验证登录  绕过嘛  和 IIS6.0 解析漏洞一样  你懂的

……

站长点评:

    先补充一个知识,假如URL地址是:http://www.baidu.com/fuck/bitch.php,那么:$_SERVER['PHP_SELF']=='/fuck/bitch.php'。

    问题出在这个验证过程,居然使用这种卧槽的验证方式。

    首先截取“/fuck/bitch.php”中从最后一个“/”开始的位置到结尾的字符串,即结果为“bitch.php”。然后将“login.php?action=logined”和“login.php”创建成一个数组。然后在这个数组中搜索“bitch.php”,如果存在,那就登陆进去了……

    利用方式嘛,心灵大牛说的“IIS 6.0 解析漏洞”,例如官网演示站的后台地址为“http://demo.phpstcms.com/admin/”,那么只要提交“http://demo.phpstcms.com/admin/”+“文件名”+“/login.php”即可绕过登陆。

    例如官网:

http://demo.phpstcms.com/admin/member.php/login.php
http://demo.phpstcms.com/admin/config.php/login.php
http://demo.phpstcms.com/admin/data.php/login.php
http://demo.phpstcms.com/admin/server.php/login.php
http://demo.phpstcms.com/admin/info.php/login.php
……

    以上地址仅做演示,请勿做任何非法用途,后果自负!

    PHP $_SERVER['PHP_SELF'] 函数漏洞产生原理:

    这个函数还存在跨站漏洞,具体请谷歌“针对 $_SERVER['PHP_SELF'] 的跨站脚本攻击”。

    那么,再来看看这个漏洞产生的原理,首先:http://www.baidu.com/test.php/……,这种调用是web服务器允许的,很多cms、论坛系统,都是采用这种方式,在服务器不支持rewrite的情况下实现诸如 http://www.baidu.com/test.php/archive/999 这样的固定网址的(我以前还以为是对404错误页下的手),所以带“/”的地址无法从web服务器上禁止。

    然后再看看php中对 $_SERVER['PHP_SELF'] 的识别,他就是一个包含当前网址值的全局变量,天知道用户会输入什么样的网站,在上面的例子中是恶意的,可是在这样的网站上,却又是可以正常使用这种方式的地址的。所以,最终的结论要落在开发人员身上了,没有很好的处理与用户交互的数据。