文章目錄

#相关资料
wdcp登录认证绕过

#漏洞分析

伪造cookie绕过登录:影响版本2.2一下。

login.php 82行

if (isset($_COOKIE['wdcp_user']) and ($_COOKIE['wdcp_user']!="deleted")) {
//if (($_COOKIE['wdcp_user']!="deleted")) {
    $wdcp_user=$_COOKIE['wdcp_user'];
    $wdcp_uid=$_COOKIE['wdcp_uid'];
    $wdcp_gid=$_COOKIE['wdcp_gid'];
    $wdcp_us=$_COOKIE['wdcp_us'];
    $wdcp_lt=$_COOKIE['wdcp_lt'];
    //echo "wdcp_lt:".$wdcp_lt;echo "<br>";
    user_l_check($wdcp_lt);
    if ($wdcp_gid==1) {
        session_start();
        $sessionId = session_id();
        //setcookie('PHPSESSID', $sessionId, time() + 180,'/');
        }
    //echo $_COOKIE['wdcp_user']."|".$_COOKIE['wdcp_uid']."|".$_COOKIE['wdcp_gid']."|".$_COOKIE['wdcp_us']."<br>";
    //echo $wdcp_user."|".$wdcp_uid."|".$wdcp_gid."|".$wdcp_us;//exit;

}

跟进user_l_check函数:

function user_l_check($ul_str=0) {
    global $wdcp_user,$wdcp_uid,$wdcp_gid,$wdcp_us;
    //$str='wdl_a';
    $str=substr(md5($wdcp_user.$wdcp_uid),8,6);
    //echo $str."<br>";
    if ($ul_str==0) {
        //echo $str;
        //echo $str."<br>";
        //$msg=$str."|".$wdcp_user."|".$wdcp_uid."|".$wdcp_gid."|".$wdcp_us;
        //file_put_contents(WD_ROOT."/data/1.txt",$msg);
        return md5($str.$wdcp_user.$wdcp_uid.$wdcp_gid.$wdcp_us);
    }else {
        //echo ;
        //echo $str."<br>";
        //echo $str."|".$wdcp_user."|".$wdcp_uid."|".$wdcp_gid."|".$wdcp_us."   2<br>";
        //$msg=$str."|".$wdcp_user."|".$wdcp_uid."|".$wdcp_gid."|".$wdcp_us;
        //file_put_contents(WD_ROOT."/data/2.txt",$msg);
        $s1=md5($str.$wdcp_user.$wdcp_uid.$wdcp_gid.$wdcp_us);
        //echo "1:".$ul_str."|".$s1."<br>";//exit;
        //file_put_contents(WD_ROOT."/data/3.txt",$ul_str);
        //file_put_contents(WD_ROOT."/data/4.txt",$s1);
        if (strcmp($ul_str,$s1)!=0) {
            del_cookie();
            //echo "login err";
            str_go_url("登录信息错误!",1);
            //go_back("登录信息错误!");
        }
    }

函数中用来做比较的信息也都是来自cookie。所以可以伪造cookie。直接登录。

修复后的代码:

if (isset($_SESSION['is_l'])) {
    $wdcp_user=$_COOKIE['wdcp_user'];
    $wdcp_uid=$_COOKIE['wdcp_uid'];
    $wdcp_gid=$_COOKIE['wdcp_gid'];
    $wdcp_ggid=$_COOKIE['wdcp_ggid'];
    $wdcp_us=$_COOKIE['wdcp_us'];
    //$wdcp_lt=$_COOKIE['wdcp_lt'];
    //session_start();
    //print_r($_SESSION);
    $wdcp_lt=$_SESSION['is_l'];

将用于检查的$wdcp_lt字段存在session里放在服务端。并判断服务端是否存在该字段,存在才进入检查逻辑。

个人微信公众号

文章目錄