DreamArticle文章管理系统存在多个安全漏洞


添加时间:
2009-05-16

系统编号:
WAVDB-01420

影响版本:
DreamArticle V3.0

程序介绍:

DreamArticle 是一个采用 PHP 和 MySQL 数据库构建的高效文章管理解决方案。

漏洞分析:

在admin/global.php 有这样一段代码,用来实现”记住密码”登录后台功能的。

 
  1. $administrator    = get_cookie("administrator");  
  2. $adminpassword    = get_cookie("adminpassword");  
  3. if ($administrator && $adminpassword) {  
  4.     islogin($administrator,$adminpassword);  
  5. else {  
  6.     unset($_SESSION['admincode']);  
  7.     set_cookie("admincode",'',time() - 31536000);  
  8.     set_cookie("adminid",'',time() - 31536000);  
  9.     set_cookie("administrator"'',time() - 31536000);  
  10.     set_cookie("adminpassword"'',time() - 31536000);  
  11.     da_admin_login();  
  12. }  
  13. $admin=get_admin_info($administrator,$adminpassword);  
  14. get_cookie() 在/include/common.php  
  15. function get_cookie($name){  
  16.     global $_COOKIE,$cookieprename;  
  17.     if (isset($_COOKIE[$cookieprename.$name])) {  
  18.         return urldecode($_COOKIE[$cookieprename.$name]);  
  19.     }  
  20.     return FALSE;  
  21. }  
可以看到用了urldecode()函数,可以用%2527引入一个单引号绕过gpc
 
  1. Islogin() 在admin/function.php  
  2. function islogin($username$password) {  
  3.     global $DreamCMS;  
  4.     $_password_=$DreamCMS->db->get_var("SELECT `password` FROM `#DC@__members` WHERE `username`='{$username}'"); //查询$username的密码  
  5.     if($password!=$_password_){ //数据库里的密码和提交的密码相比较,不一样就$ISDreamCMSADMIN=FALSE  
  6.         $ISDreamCMSADMIN=FALSE;  
  7.         if(md5(base64_encode('__DreamCMS__'.$username.'~!(*%)$!$~'.$password.'%#@)'))==DreamCMSAdmin){  
  8.             $ISDreamCMSADMIN=TRUE;  //这里是实现一个超级管理员的功能的,DreamCMSAdmin定义在配置文件里。  
  9.         }  
  10.     }  
  11.     if (emptyempty($username)||emptyempty($password)||$ISDreamCMSADMIN){ //逻辑错误出现了,程序员本意是,如果$username为空,或者$password为空,或者$ISDreamCMSADMIN为false就执行登出处理,可以却忘记了在$ISDreamCMSADMIN前面加上!,这样就刚好和程序员本意相反了.也就是说这里就算我们的密码不对都可以通过这个函数。  
  12.         unset($_SESSION['admincode']);  
  13.         set_cookie("admincode",'',time() - 31536000);  
  14.         set_cookie("adminid",'',time() - 31536000);  
  15.         set_cookie("administrator"'',time() - 31536000);  
  16.         set_cookie("adminpassword"'',time() - 31536000);  
  17.         da_admin_login();  
  18.     }  
  19. }  
看下面的$admin=get_admin_info($administrator,$adminpassword);
 
  1. function get_admin_info($username$password) {  
  2.     global $DreamCMS;  
  3.     $admin=$DreamCMS->db->get_row("SELECT * FROM `#DC@__members` WHERE `username`='{$username}' AND password='{$password}'");  
  4.     if(emptyempty($admin)){  
  5.         if(md5(base64_encode('__DreamCMS__'.$username.'~!(*%)$!$~'.$password.'%#@)'))==DreamCMSAdmin){  
  6.             $admin->uid="1";  
  7.         }  
  8.     }  
  9.     $admin->info && $admin->info=unserialize($admin->info);  
  10.     return $admin;  
  11. }  





解决方案:
厂商补丁
iDreamSoft
------------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:
http://www.idreamsoft.cn/


信息来源:
<* 来源: Wolves Security Team
链接:http://bbs.wolvez.org/topic/78/
*>