作者:
小飛
·
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)
這是個簡單的異或演算法
0x01初識你的美,演算法分析
string[0]^key[0]
然後是
string[1]^key[1]
將他們新增到$code尾部,如此迴圈。這時會有兩種情況。
case one
$key長度(18)<=$string長度
那麼當$k=$i=17,就取盡了$key,下一次執行會變成:
$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了
0x02 禁不起推敲的美 攻擊演算法
現在我們要得到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 .= $pr_encode ? "&$key=$val" : "$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位 去掉最後兩位開始跑吧
後來的故事就是變數覆蓋 不在本文的討論之類
0x03 金絮其外 敗絮其中 演算法優缺點分析
簡單異或演算法實際上並不複雜,因為它並不比維吉尼亞密碼多什麼東西。它之所以被包括在這本書中,是因為它在商業軟體包中很流行,至少在MS-DOS和 Macintosh世界中是這樣[1502,1387]。不幸的是,如果一個軟體保密程式宣稱它有一個“專有”加密演算法(該演算法比DES更快) ---|||應用密碼學
確實異或演算法輕巧,採用位運算,在速度方面有十分大的優勢。
但是輕巧簡單卻帶來了弱邏輯,所以更應該小心使用 比如對$key的複雜程度 應該有更苛刻的要求
否則會讓safe_code變成evil_code
0x04 你本來就很美 好的程式設計師才寫得出安全演算法
那麼怎麼樣的異或才是安全簡便的? 我們看看齊博cms的這個吧
優點有兩個
一, 絕密字串有三部分 兩部分可控
$webdb[mymd5].$rand.'5*j,.^&;?.%#@!'
複雜程度令人髮指。
二,引入MD5code 把傳入引數加入到key裡面
$md5code=substr($string,-10); $key = md5($md5code.$secret_string);
使得key無比複雜。
兩次加鹽加醬油的MD5,一定時間內,基本不可破解了。
所以 異或演算法用得好,其實可以是強演算法,不過前提是保證key安全。 當然,qibo這個系統有幾處能夠讀取key的漏洞,也導致了演算法成為evilcode 最終能獲得後臺許可權,但那是後話。
0x05 參考文章
DedeCMS最新通殺注入(buy_action.php)漏洞分析
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!