1. 程式人生 > >實驗吧CTF天網管理系統

實驗吧CTF天網管理系統

天網你敢來挑戰嘛

格式:ctf{ }

解題連結: http://ctf5.shiyanbar.com/10/web1/ 

開啟連結後,嗯,光明正大的放出賬號密碼,肯定是登不進的,檢視原始碼

看來是和md5碰撞有關的了,

PHP在處理雜湊字串時,會利用”!=”或”==”來對雜湊值進行比較,
它把每一個以”0E”開頭的雜湊值都解釋為0,所以如果兩個不同的密碼經過雜湊以後,
其雜湊值都是以”0E”開頭的,那麼PHP將會認為他們相同,都是0。

攻擊者可以利用這一漏洞,
通過輸入一個經過雜湊後以”0E”開頭的字串,即會被PHP解釋為0,
如果資料庫中存在這種雜湊值以”0E”開頭的密碼的話,他就可以以這個使用者的身份登入進去,
儘管並沒有真正的密碼。

0e開頭的md5和原值:
(加密後值為0)

s878926199a

0e545993274517709034328855841020


s155964671a

0e342768416822451524974117254469

 

 我們隨便選一個,將使用者名稱改為s878926199a

將url改為該地址,進入後審計程式碼

$unserialize_str = $_POST['password'];  

$data_unserialize = unserialize($unserialize_str);        #unserialize() 對單一的已序列化的變數進行操作,將其轉換回 PHP 的值。

if($data_unserialize['user'] == '???' && $data_unserialize['pass']=='???') { print_r($flag); }

偉大的科學家php方言道:成也布林,敗也布林。 回去吧騷年

 

1.需要構造序列化的password填入,程式碼意思是把post提交的password值經過"反序列化"得到一個數組, 要求數組裡的user和pass都等於某個值時就列印flag。 2.bool型別的true跟任意字串可以弱型別相等。因此我們可以構造bool型別的序列化資料 ,無論比較的值是什麼,結果都為true。   序列化與反序列化: 把複雜的資料型別壓縮到一個字串中 serialize() 把變數和它們的值編碼成文字形式 unserialize() 恢復原先變數   自己實踐序列化函式

從結果可以看出,要構造bool型別的序列化資料經過反序列化後為true,user和password的值應寫成  "a:2:{s:4:"user";b:1;s:4:"pass";b:1;}", 最後我們將該值提交得到flag