Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3029801
  • 博文数量: 181
  • 博客积分: 9990
  • 博客等级: 中将
  • 技术积分: 1865
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-23 09:43
文章分类

全部博文(181)

文章存档

2011年(40)

2010年(17)

2009年(87)

2008年(37)

我的朋友

分类: 网络与安全

2009-05-21 20:59:52

Team: bbs.wolvez.org
By q1ur3n
在admin/global.php 有这样一段代码,用来实现”记住密码”登录后台功能的。
$administrator    = get_cookie("administrator");
$adminpassword    = get_cookie("adminpassword");
if ($administrator && $adminpassword) {
    islogin($administrator,$adminpassword);
} else {
    unset($_SESSION['admincode']);
    set_cookie("admincode",'',time() - 31536000);
    set_cookie("adminid",'',time() - 31536000);
    set_cookie("administrator", '',time() - 31536000);
    set_cookie("adminpassword", '',time() - 31536000);
    da_admin_login();
}
$admin=get_admin_info($administrator,$adminpassword);
get_cookie() 在/include/common.php
function get_cookie($name){
    global $_COOKIE,$cookieprename;
    if (isset($_COOKIE[$cookieprename.$name])) {
        return urldecode($_COOKIE[$cookieprename.$name]);
    }
    return FALSE;
}
可以看到用了urldecode()函数,可以用%2527引入一个单引号绕过gpc
Islogin() 在admin/function.php
function islogin($username, $password) {
    global $DreamCMS;
    $_password_=$DreamCMS->db->get_var("Select `password` FROM ` Where `username`='{$username}'"); //查询$username的密码
    if($password!=$_password_){ //数据库里的密码和提交的密码相比较,不一样就$ISDreamCMSADMIN=FALSE
        $ISDreamCMSADMIN=FALSE;
        if(md5(base64_encode('__DreamCMS__'.$username.'~!(*%)$!$~'.$password.'%#@)'))==DreamCMSAdmin){
            $ISDreamCMSADMIN=TRUE;  //这里是实现一个超级管理员的功能的,DreamCMSAdmin定义在配置文件里。
        }
    }
    if (empty($username)||empty($password)||$ISDreamCMSADMIN){ //逻辑错误出现了,程序员本意是,如果$username为空,或者$password为空,或者$ISDreamCMSADMIN为false就执行登出处理,可以却忘记了在$ISDreamCMSADMIN前面加上!,这样就刚好和程序员本意相反了.也就是说这里就算我们的密码不对都可以通过这个函数。
        unset($_SESSION['admincode']);
        set_cookie("admincode",'',time() - 31536000);
        set_cookie("adminid",'',time() - 31536000);
        set_cookie("administrator", '',time() - 31536000);
        set_cookie("adminpassword", '',time() - 31536000);
        da_admin_login();
    }
}
看下面的$admin=get_admin_info($administrator,$adminpassword);
function get_admin_info($username, $password) {
    global $DreamCMS;
    $admin=$DreamCMS->db->get_row("Select * FROM ` Where `username`='{$username}' AND password='{$password}'");
    if(empty($admin)){
        if(md5(base64_encode('__DreamCMS__'.$username.'~!(*%)$!$~'.$password.'%#@)'))==DreamCMSAdmin){
            $admin->uid="1";
        }
    }
    $admin->info && $admin->info=unserialize($admin->info);
    return $admin;
}
这里就麻烦了,帐号或者密码不对就没有任何权限。
别忘了,前面还有个可以绕过gpc的get_cookie()
详细的利用方法和exp我就不贴出来了,自己摸索。
本地测试是可以直接进后台的。
阅读(540) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~