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

實驗吧web天網管理系統

art 這樣的 相等 ray 條件 arr 加密 csdn 轉換

直接查看源碼

技術分享圖片

<!--$test=$_GET[‘username‘]>這一行

源碼的下面給了我們一些提示:我們輸入的username經過md5加密後會賦值給test。當test為0時就會跳出新的東西,這時候我們就要構思,如何才能讓test為0?
顯然將0提前md5解密是不行的,而在php中==是只進行值的比較,不管二者的類型。當兩個字符串進行==比較的時候,PHP會把類數值的字符串轉換為數值進行比較,如果參數是字符串,則返回字符串中第一個不是數字的字符之前的數字串所代表的整數值。比如: ‘3’ == ‘3ascasd’結果為true。


利用這個漏洞,我們就可以搞事情了:只需要找到解密後開頭為0的就行了。

PHP在處理哈希字符串時,會利用”!=”或”==”來對哈希值進行比較,

它把每一個以”0E”開頭的哈希值都解釋為0,所以如果兩個不同的密碼經過哈希以後,
其哈希值都是以”0E”開頭的,那麽PHP將會認為他們相同,都是0。

攻擊者可以利用這一漏洞,
通過輸入一個經過哈希後以”0E”開頭的字符串,即會被PHP解釋為0,
如果數據庫中存在這種哈希值以”0E”開頭的密碼的話,他就可以以這個用戶的身份登錄進去,


盡管並沒有真正的密碼。

這裏我們在網上找到幾個這樣的字符串:240610708,aabg7XSs,aabC9RqS
隨便選一個後,輸入到username中,得到新的回顯

技術分享圖片

SO,訪問http://ctf5.shiyanbar.com/10/web1//user.php?fame=hjkleffifer 查看源碼,如果password什麽,就輸出flag

技術分享圖片

補充知識,查手冊:

unserialize() 對單一的已序列化的變量進行操作,將其轉換回反序列化 PHP 的值。
返回的是轉換之後的值,可為 integer、float、string、array 或 object。
如果傳遞的字符串不可解序列化,則返回 FALSE,並產生一個 E_NOTICE。

序列化與反序列化:
把復雜的數據類型壓縮到一個字符串中
serialize() 把變量和它們的值編碼成文本形式
unserialize() 恢復原先變量

定義一個array數組,key為鍵名,www就是對應的array[‘key’]的鍵值

技術分享圖片

技術分享圖片

我們現在再回頭看源碼,只有user和pass都等於’???’時,才輸出flag。但我們現在並不知道???到底是啥,這時候就涉及另一個知識點:bool類型的true跟任意字符串可以弱類型相等。因此我們可以構造bool類型的序列化數據 ,無論比較的值是什麽,結果都為true。
所以我們在這裏構造password:

a:2:{s:4:"user";b:1;s:4:"pass";b:1;}

(a代表array,s代表string,b代表bool,而數字代表個數/長度)
這個用數組的形勢表述就是:
Array ( [user] =>1 [pass] => 1 ),因為這裏兩個元素都是bool型元素,所以只有1和0兩種。這裏我們給他們賦值為1,就都為true,就滿足==的條件了,輸入過後就滿足條件,得到flag

部分內容取自https://blog.csdn.net/qq_41618162/article/details/81321451

實驗吧web天網管理系統