美文网首页我爱编程
CmsEasy暴力注入

CmsEasy暴力注入

作者: 索马里的乌贼 | 来源:发表于2018-08-04 15:24 被阅读0次
  1. 发布时间:2015-12-21
  2. 公开时间:2016-03-03
  3. 漏洞类型:sql注射
  4. 危害等级:高
  5. 漏洞编号:WooYun-2015-160093
  6. 测试版本:CmsEasy_5.6_UTF-8_20151009

简要描述

加解密函数缺陷第四发,注入 任意用户登录
有点类似http://wooyun.org/bugs/wooyun-2014-062391
使用不安全的“随机数”实例2


详细说明

CmsEasy中使用了一个cookie_password值 用来给cookie和一些其他的值做加密
先来看这个值的来源
lib/admin/install_act.php 行35

config::modify(array('cookie_password' => md5(rand() . time())));

可以看到 这个值是由一个随机数rand()拼接安装时的时间戳time()来生成的
同样 看起来很随机 其实很脆弱

  1. 两个函数返回的都是数字
  2. 两个函数返回值都可以预测(?)

既然是随机数 为什么说可以预测呢
先来看rand()

int rand ( void )
int rand ( int min , intmax )
如果没有提供可选参数 min 和 max,rand() 返回 0 到 getrandmax() 之间的伪随机整数。例如想要 5 到 15(包括 5 和 15)之间的随机数,用 rand(5, 15)。
Note: 在某些平台下(例如 Windows)getrandmax() 只有 32767。如果需要的范围大于 32767,那么指定 min 和 max 参数就可以生成更大的数了,或者考虑用 mt_rand() 来替代之。

也就是说 在windows下,rand()返回的最长位数就只有5位而已
再来看time()

这个函数返回一个10位的数字 表示从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数

看起来很长但实际上基于现在的GPU能力,一个10位的纯数字MD5的破解基本上是以秒为单位的
而且更悲剧的是最前面的3位基本上可以确定 比如今年2015年 最前面的3位就一定是142 143 144 145
所以在windows下 rand().time() 就是11~15个数字(1~5位的rand() 10位的time())
这点范围的计算量对gpu来说就是分分钟的事

好了下面来看看这个cookie_password在哪里会用到
lib/tool/front_class.php 行650

static function cookie_encode($_password)
{
    return md5($_password . config::get('cookie_password'));
}

lib/default/user_act.php 行200

function login_action()
{
//省略部分登录过程
233行:
    cookie::set('login_username', $user['username']);
    cookie::set('login_password', front::cookie_encode($user['password']));
}

可以看到 登录成功后,设置cookie的时候用了cookie_encode函数 把密码加密后返回
实际上cookie中的login_password如下
login_password = md5($password,config::get('cookie_password'));
$password 是明文密码的一次md5()值
如果这里把我们的明文密码看成是salt的话 其实加密的函数就是
md5(md5($salt).md5(cookie_password));
这种加密格式在oclHashCat里面的编号是 2811
知道了流程 就可以构造数据来解密了
首先注册一个账号 密码比如说是wooyun 然后登录 查看cookie的 cookie_password 值记下来

da0c290018cf7c3ac90e2d9146fa146d7f8dda9e.jpg
比如我这里是b57a6043a1c3c623a8d72b479f1367c7 salt是明文密码wooyun
开始用oclHashCat跑
这里用的是oclHashcat的掩码模式 -a3
说一下这串掩码 ?d144?d?d?d?d?d?d?d
?d 代表的是一个0~9的数字
根据前面分析的结果 rand()是一个1~5位的数字 所以从1位往上开始测试
?d144?d?d?d?d?d?d?d
?d?d144?d?d?d?d?d?d?d
?d?d?d144?d?d?d?d?d?d?d
?d?d?d?d144?d?d?d?d?d?d?d
?d?d?d?d?d144?d?d?d?d?d?d?d
在尝试到4位的时候 结果出来了
3e09e5c9afd73dd91ea684a50a560e943000a0cc.jpg

b57a6043a1c3c623a8d72b479f1367c7:wooyun:24481449722857

rand() =2448
time()= 1449722857
图上可以看到 从17:53:32开始 到17:54:54跑出结果 总共82秒 尝试了96531382272次
拿到这个之后 我们就能随意伪造cookie的值了
这次主要是说key的脆弱性,所以注入部分就简单说了
lib/admin/admin_act.php 行76

function remotelogin_action() {
        cookie::del('passinfo');
        $this->view->loginfalse=cookie::get('loginfalse'.md5($_SERVER['REQUEST_URI']));
        if (front::$args) { //这个值来GET self::$args = $_GET['args'];
            $user=new user();
            $args = xxtea_decrypt(base64_decode(front::$args), config::get('cookie_password'));
            $user=$user->getrow(unserialize($args)); //解密并unserialize之后进入getrow 
            if (is_array($user)) {
                if ($user['groupid'] == '888')
                    front::$isadmin=true;
                cookie::set('login_username',$user['username']);
                cookie::set('login_password',front::cookie_encode($user['password']));

$_GET['args']解密之后进了sql查询 导致注入 因为参数经过加密 所以可以无视360waf
再加上此处注入点比较不常见
select * from cmseasy_user where [inject]
内置的sql检查也可以无视了 具体的注入方法exp看一眼就懂
写了个exp 效果如图

95e12ea86c9cc0bc0dcc3f7450126d7e77feef83.jpg

任意用户登录也是这里 只要构造$args为 username='任意用户' 就能直接前台登录任意账号 这个exp就不写了 反正修的是同一个地方


漏洞证明

注册了一个官方demo站的账号 然后跑出了加密key

cc8f7323bdd6b1e750963a96a70c6bbeef8cb410.jpg

a1b10aeff60a21f67d5fefc7e5b33e20:111111:77891440761707
所以demo站的cookie_password 就是
md5('77891440761707')= e11e37974049bbe1d21c11c67a30fd2a


修复方案

加密key还是复杂点吧

相关文章

  • CmsEasy暴力注入

    发布时间:2015-12-21 公开时间:2016-03-03 漏洞类型:sql注射 危害等级:高 漏洞编号:Wo...

  • DVWA笔记之brute

    Brute Force low服务端代码: 暴力破解思路: 账号admin,1、简单字典多次暴力破解2、sql注入...

  • Python渗透测试工具

    sql注入工具:sqlmapDNS安全监测:DNSRecon暴力破解测试工具:patatorXSS漏洞利用工具:X...

  • 2/5的水

    3/5的空间 注入呐喊 掀不起波澜 暴力的撼动 再塞进嫉恨怒骂 2/5的水 恶臭难耐

  • CmsEasy 5.5 cut_image 代码执行漏洞

    0x01 漏洞原理 CmsEasy5.5存在代码执行漏洞,通过该漏洞可以实现文件上传,通过分析,发现该漏洞是因为c...

  • CmsEasy 前台无限制getshell

    发布时间:2016-09-29公开时间:N/A漏洞类型:getshell危害等级:高漏洞编号:QTVA-2016-...

  • 【渗透测试】-SQL注入之Access偏移注入

    讲在前面,Access和mysql5.0之前的版本。进行注入的时候都是采用暴力猜解的方式进行的,而mysql5.0...

  • 安全测试种类

    1.xss攻击:反射型:如果存储型dom型 2.csrf攻击: 3.sql注入:严格格式校验+预编译; 4.暴力破...

  • 狱友相聚

    他们聊狱中的种种 打架、暴力、血腥 被关禁闭,而后仍是荷尔蒙的冲动 宇宙似将洪荒之力注入我胸 地球总在以我为中心转...

  • 66~好的沟通=70%情绪+30%内容

    01 把爱注入沟通 避免用道德评判,作比较和强人所难进行暴力沟通。 深度剖析问题的原因,表达观察的结果,告知对方...

网友评论

    本文标题:CmsEasy暴力注入

    本文链接:https://www.haomeiwen.com/subject/ivnyvftx.html