異或加密之美 主流web弱演算法科普文

2021-09-11 11:23:58 字數 3429 閱讀 4467

小飛 · 2014/07/18 16:56

本文只是對異或演算法的科普文 逆向dede漏洞的原作者是 @my5t3ry 而不是我

有些甚至直接借用 我不是抄襲狗 - -

哥就是抱在大牛的大腿上的那個人

研究對稱演算法的時候 對異或加密產生了性慾

剛剛高考完  高中閉關結束  i am back~

科普文 幫助新手對演算法的理解吧 異或加密是web應用中十分流行的加密演算法,通過將可信任(已安全過濾)的使用者資料和加密key用演算法加密,生成字串再來傳遞以執行sql操作。

但是這種演算法極其不安全 因為在異或演算法裡面

a^k=e  

e^a=k

複製**

有了a和e(加密前後的字串)就等獲得k,一旦我們知道了key 就能本地構造那個字串(evilcode)進行攻擊!

今天 我們研究dedecms(buy_action.php)

這是個簡單的異或演算法

string[0]^key[0] 

複製**

然後是

string[1]^key[1] 

複製**

將他們新增到$code尾部,如此迴圈。這時會有兩種情況。

case one

$key長度(18)<=$string長度  

複製**

$i=18  $k=0  

複製**

也就是說 重新開始一遍位運算 示意圖如下

key    |  i  a  m  a  k  e  y   i   m   

string |  i  a  m  a  s  r   i   n   g

複製**

等於key被重複了多次直到string被完全加密!

case two

$key長度(18)>$string長度  

複製**

那麼當

$k=$i=  strlen($string) -1

複製**

就取盡了$string,下一次執行會直接跳出,也就是說,此時的key都沒完整進入$code。

示意圖如下

key    |  i  a  m  a  k  (e  y )  

string |  i  a  m  a  s

複製**

括號裡面表示沒能進入$code部分

現在分析完了演算法 我們就能夠來思考如何注入到key了

現在我們要得到key 當然是要完整的

所以是選擇case one

所以思路應該是構造乙個

string>=18  

複製**

然後在受害web上構造string 並且獲得$code,再到本地。

$string^$code 

複製**

就能得到 $key的...md5 破解得到密匙,就能構造$pr_verify騙取驗證進入此支。

$pr_verify=md5("payment".$pr_encode.$cfg_cookie_encode);

複製**

通過變數覆蓋進行globals[cfg_dbprefix]覆蓋注入

接下來看圖看**

我們先看看$string(**中的$pr_encode)是如何獲取的

$pr_encode = '';  

foreach($_request as $key => $val)

$pr_encode = str_replace('=', '', mchstrcode($pr_encode));

$pr_verify = md5("payment".$pr_encode.$cfg_cookie_encode);

$tpl = new dedetemplate();

$tpl->loadtemplate(dedemember.'/templets/buy_action_payment.htm');

$tpl->display();

複製**

知道了獲取辦法 讓我們控制它吧

此處的

$string=product=card&pid=1.$_cookies

複製**

因為$_request獲取引數是從$_get->$_post->$_cookie依次獲取

所以加密得到的$code(也就是$pd_encode) 包含了post和cookies全部內容  如圖

也就是符合

$string>=$key  

複製**

所以我們直接取post的巧合18位,進行破解,後面的其實不用管,要不然得到的key由於case one的不同重複,就是真正key的一遍遍重複。

這樣我們就得到了md5形式的key 不過是18位 去掉最後兩位開始跑吧

後來的故事就是變數覆蓋 不在本文的討論之類

簡單異或演算法實際上並不複雜,因為它並不比維吉尼亞密碼多什麼東西。它之所以被包括在這本書中,是因為它在商業軟體包中很流行,至少在ms-dos和 macintosh世界中是這樣[1502,1387]。不幸的是,如果乙個軟體保密程式宣稱它有乙個「專有」加密演算法(該演算法比des更快)  ---|||應用密碼學

確實異或演算法輕巧,採用位運算,在速度方面有十分大的優勢。

但是輕巧簡單卻帶來了弱邏輯,所以更應該小心使用 比如對$key的複雜程度 應該有更苛刻的要求

否則會讓safe_code變成evil_code

那麼怎麼樣的異或才是安全簡便的? 我們看看齊博cms的這個吧

優點有兩個

一, 絕密字串有三部分 兩部分可控

$webdb[mymd5].$rand.'5*j,.^&;?.%#@!' 

複製**

複雜程度令人髮指。

二,引入md5code 把傳入引數加入到key裡面

$md5code=substr($string,-10);    $key = md5($md5code.$secret_string);  

複製**

使得key無比複雜。

兩次加鹽加醬油的md5,一定時間內,基本不可破解了。

所以 異或演算法用得好,其實可以是強演算法,不過前提是保證key安全。 當然,qibo這個系統有幾處能夠讀取key的漏洞,也導致了演算法成為evilcode 最終能獲得後台許可權,但那是後話。

dedecms最新通殺注入(buy_action.php)漏洞分析

異或加密演算法

異或加密是通過使用布林代數中的異或函式 xor 實現的,xor是乙個二元運算子 即有兩個引數,類似加號 按其名稱 異或 容易推斷兩個引數中有且僅有乙個為真 即兩引數相異 時,結果返回真,真值表如下 ab a xor btt ftft fttf ff異或加密背後的原理是如果不知道兩個引數的初值,就不可...

異或加密演算法

異或加密是一種很簡單的加密演算法,無論是原理還是操作性上,都不具備任何難度,所以,在做一些簡單的加密時,被廣為採用。但因為很簡答,破解起來也很容易,所以對於更加私密的資訊,不要用這種方法加密。下面我們簡單地介紹一下異或的運算 數 算符為xor exclusive or 在計算機中通常用 的符號表示 ...

異或加密演算法

注意,這篇文章自己用來備忘 加密 function prefixinteger num function autoset word return ret function submit var numbers new array text.length encnum new array text.l...