實驗吧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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM