漏洞概要
关注数(24 )
关注此漏洞
漏洞标题:ECShop 2.7.2 API 盲注漏洞
提交时间:2011-10-10 11:54
修复时间:2011-11-09 11:55
公开时间:2011-11-09 11:55
漏洞类型:SQL注射漏洞
危害等级:高
自评Rank:15
漏洞状态:厂商已经确认
Tags标签:
无
漏洞详情 披露状态:
2011-10-10: 细节已通知厂商并且等待厂商处理中 2011-10-10: 厂商已经确认,细节仅向厂商公开 2011-10-13: 细节向第三方安全合作伙伴开放 2011-12-04: 细节向核心白帽子及相关领域专家公开 2011-12-14: 细节向普通白帽子公开 2011-12-24: 细节向实习白帽子公开 2011-11-09: 细节向公众公开
简要描述: 该漏洞已经过本人测试存在。在服务器关闭魔法引号的情况下可以盲注,不受ECShop内核过滤影响。这次不坑爹了 问题文件在/api/client/api.php 利用方法为POST
详细说明: /api/client/api.php 第7行
dispatch($_POST);
/api/client/includes/lib_api.php 6 -10 行
$func_arr = array('GetDomain', 'UserLogin', 'AddCategory', 'AddBrand', 'AddGoods', 'GetCategory', 'GetBrand', 'GetGoods', 'DeleteBrand', 'DeleteCategory', 'DeleteGoods', 'EditBrand', 'EditCategory', 'EditGoods'); if(in_array($post['Action'], $func_arr) && function_exists('API_'.$post['Action'])) { return call_user_func('API_'.$post['Action'], $post); }
当$_POST['Action'] == 'UserLogin'的时候调用 /api/client/includes/lib_api.php 246 行
function API_UserLogin($post) { $post['username'] = isset($post['UserId']) ? trim($post['UserId']) : ''; $post['password'] = isset($post['Password']) ? strtolower(trim($post['Password'])) : ''; /* 检查密码是否正确 */ $sql = "SELECT user_id, user_name, password, action_list, last_login". " FROM " . $GLOBALS['ecs']->table('admin_user') . " WHERE user_name = '" . $post['username']. "'"; $row = $GLOBALS['db']->getRow($sql); if ($row) { if ($row['password'] != $post['password']) { client_show_message(103); } require_once(ROOT_PATH. ADMIN_PATH . '/includes/lib_main.php'); // 登录成功 set_admin_session($row['user_id'], $row['user_name'], $row['action_list'], $row['last_login']); // 更新最后登录时间和IP $GLOBALS['db']->query("UPDATE " .$GLOBALS['ecs']->table('admin_user'). " SET last_login='" . gmtime() . "', last_ip='" . real_ip() . "'". " WHERE user_id='$_SESSION[admin_id]'"); client_show_message(100, true, VERSION, 0, true, EC_CHARSET); }
其中USERID未经过滤且不受内核过滤影响,造成盲注漏洞
漏洞证明: http://localhost/ecshop/api/client/api.php?Action=UserLogin&UserId=%27%20or%20user_id=1%23 注:为方便测试,我把代码里的POST方法改成GET,为了方便显示注入成功,我在执行SQL后插入适当代码使结果显示出来。真实环境并不显示如图结果
修复方案: 漏洞回应 厂商回应: 危害等级:中
漏洞Rank:10
确认时间:2011-10-10 14:37
厂商回复: 感谢提交,我们尽快处理
最新状态: 暂无
漏洞评价:
评论
2011-10-10 12:47 |
狗样的男人 ( 实习白帽子 | Rank:42 漏洞数:11 )
2011-10-11 09:04 |
笨子 ( 路人 | Rank:4 漏洞数:2 | 80759112)
2011-10-11 13:58 |
tenzy ( 普通白帽子 | Rank:176 漏洞数:21 | Need not to know)
我发觉我再次坑爹了,使用GET方法来测试真是SB,好吧,请求管理员把我rank值还原,然后把此文章删除
2011-10-11 14:09 |
tenzy ( 普通白帽子 | Rank:176 漏洞数:21 | Need not to know)
2011-10-11 16:53 |
Ray ( 实习白帽子 | Rank:75 漏洞数:7 )
这次你没看错,虽然magic_quote_gpc关闭的少,但是这个漏洞存在,而且 if ($row['password'] != $post['password']){ client_show_message(103); }这句代码的存在,所以Mysql就算不报错,也很容易猜解数据库,没有太“盲”。
2011-10-11 17:17 |
tenzy ( 普通白帽子 | Rank:176 漏洞数:21 | Need not to know)
你POST看看。。有个$_POST['Json']覆盖了$_POST
2011-10-11 18:02 |
Ray ( 实习白帽子 | Rank:75 漏洞数:7 )
oh,my lady gaga ,return addslashes_deep_obj(json_decode(stripslashes($text),$type));,你果不其然的又把爹给坑了,不过能检查到自己的错误,其实也是一种成长,证明你是有这个能力的,只是鲁莽了,完整测试是有必要的,别忘记了。
2011-11-09 12:46 |
Mason ( 路人 | Rank:13 漏洞数:2 | 厂商您总忽略我~情何以堪~情何以堪~)
2011-11-09 15:00 |
Finger ( 普通白帽子 | Rank:777 漏洞数:95 | 最近有人冒充该账号行骗,任何自称Finger并...)