您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)如何進(jìn)行Cookie算法與Rootkey隨機(jī)強(qiáng)度分析,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
研究DEDECMS的cookie生成的算法, 以及rootkey生成的算法, 確認(rèn)rootkey使用的隨機(jī)算法的強(qiáng)度, 計(jì)算攻擊耗時(shí)。
作用: 權(quán)限鑒別、無(wú)會(huì)話狀態(tài)。
構(gòu)成:
常常是以下形式 cookie = F(x,y), F為不可逆函數(shù), x為鹽 , y為和權(quán)限/用戶相關(guān)的數(shù)據(jù)
我們可以知道的部分, F-> 一般常常為hash函數(shù)md5,sha256等
y-> 比如用戶名稱/id編號(hào)/權(quán)限簡(jiǎn)稱
我們無(wú)法知道的部分, x
根據(jù)常識(shí), 在登陸后, server端會(huì)返回cookie!
2.1在web站點(diǎn)上進(jìn)行登陸,并抓包, 看到路徑/member/index_do.php
2.2分析index_do.php (dedecms路由很簡(jiǎn)單, 路徑直接對(duì)應(yīng)到了文件),在登陸接口處下斷點(diǎn)
2.3大致瀏覽整個(gè)函數(shù), 并沒(méi)有發(fā)現(xiàn)設(shè)置cookie的操作(php原型函數(shù)-setcookie),但是發(fā)現(xiàn)了檢查賬號(hào)的函數(shù), 跟入進(jìn)去:
2.4關(guān)鍵字段
有的時(shí)候, 查看服務(wù)端響應(yīng)或是通過(guò)js生成的cookie字段很多, 但調(diào)用接口時(shí), 可能校驗(yàn)的是cookie里面的幾個(gè)字段, 因此我們找到關(guān)鍵的被用來(lái)鑒權(quán)的字段, 可以減少我們測(cè)試時(shí)的干擾.
針對(duì)2.1圖片的cookie通過(guò)遞減字段測(cè)試, 其實(shí)可以發(fā)現(xiàn)dedecms校驗(yàn)cookie的關(guān)鍵字段為:
DedeUserID=7; DedeUserID_ckMd5=4d0db47b3ba3fef5;DedeUserID=用戶ID; DedeUserIDckMd5 = substr(md5($cfgcookie_encode.用戶ID),0,16)
其中DedeUserID是很容易知道的, 或者有規(guī)律的, 1,2,3,4這樣子, 那么其實(shí)要偽造cookie的關(guān)鍵是需要知道$cfgcookieencode(本文稱之為rootkey)
$cfgcookieencode是固定的? 還是在內(nèi)存內(nèi)動(dòng)態(tài)生成的?
1.1 全文查找以下cfgcookieencode,發(fā)現(xiàn)在config.cache.inc.php存儲(chǔ)有:這個(gè)值和我們?cè)谏厦鏀帱c(diǎn)看到的值一樣,大概率可以判斷,應(yīng)該屬于一個(gè)固定值.
1.2 全局找一下有哪些地方操作了config.cache.inc.php,看是哪個(gè)函數(shù)寫入了這個(gè)值
這兒定位偏了, 這兒是更新服務(wù)器的時(shí)候會(huì)刷新一次root key~
1.3 繼續(xù)定位到install.php
$cfgcookieencode除了在config.cache.inc.php,也記錄在config.cache.bak.php, 那么看下哪里操作了config.cache.bak.php:
在上下文找到了同樣的root key生成算法:
這兒是真正第一次生成root key的地方
在安裝界面的時(shí)候其實(shí)會(huì)顯示出來(lái)給我們:
1.4 根據(jù)1.2, 1.3可知Root Key算法如下:
$chars='abcdefghigklmnopqrstuvwxwyABCDEFGHIGKLMNOPQRSTUVWXWY0123456789';
$max = strlen($chars) - 1;
$length = rand(28,32);
$root_key='';
for($i = 0; $i < $length; $i++) {
$root_key .= $chars[mt_rand(0, $max)];
}
2.1 套用結(jié)論
基于第一篇的下面三個(gè)結(jié)論:
4.1 影響隨機(jī)數(shù)生成的因素為兩個(gè): 1. 種子 2. 次數(shù)
4.4 種子區(qū)間為0到0xffffffff
4.6 同一進(jìn)程下,先后被調(diào)用的rand和mt_rand, 在未播種的前提下, 會(huì)使用同一個(gè)隨機(jī)種子
可知, root_key的可能性為 (0xffffffff-0)+1 = 2^32種可能.
揣測(cè)一下作者認(rèn)為的強(qiáng)度為:
62^28 + 62^29 + 62^30 + 62^31 + 62^32
2.2 遍歷全部rootkey耗時(shí)
這兒md5和substr計(jì)算是靜態(tài)的字符串, 實(shí)際的字符串是變化的, 消耗的時(shí)間應(yīng)該在計(jì)算出來(lái)的時(shí)間的周圍浮動(dòng)
<?php
$start = microtime(true);
for ($i = 0; $i < 10000000; ++$i) {
;
}
$total_1 = microtime(true) - $start;
$start = microtime(true);
for ($i = 0; $i < 10000000; ++$i) {
md5("111111111111111111111111111111");
}
$total_2 = microtime(true) - $start;
$start = microtime(true);
for ($i = 0; $i < 10000000; ++$i) {
substr(md5("111111111111111111111111111111"),0,16);
}
$total_3 = microtime(true) - $start;
$start = microtime(true);
$chars='abcdefghigklmnopqrstuvwxwyABCDEFGHIGKLMNOPQRSTUVWXWY0123456789';
$max = strlen($chars) - 1;
for ($i = 0; $i < 1000000; ++$i) {
$hash='';
$length = rand(28,32);
for($y = 0; $y < $length; $y++) {
$hash .= $chars[mt_rand(0, $max)];
}
}
$total_4 = microtime(true) - $start;
echo ($total_2 - $total_1);
echo "\n";
echo ($total_3 - $total_1);
echo "\n";
echo ($total_4 - $total_1);
echo "\n";
?>
結(jié)果:
3.9920189380646 //10^7次md5() 用時(shí)
7.0076858997345 //10^7次substr(md5()) 用時(shí)
8.376072883606 // 10^6次生成key 用時(shí)
那么單進(jìn)程遍歷root key的時(shí)間需要:
((8.376072883606/10^6) * (2^32)) / 3600 ≈ 10 hour
上述就是小編為大家分享的如何進(jìn)行Cookie算法與Rootkey隨機(jī)強(qiáng)度分析了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。