1. 程式人生 > >實驗吧WEBWP(一)

實驗吧WEBWP(一)

1.Forms(連結:http://www.shiyanbar.com/ctf/1819
頁面很乾淨,第一反應檢視原始碼
在此之前,我們先隨便輸入然後點選enter,沒什麼線索
原始碼中我們看到value=0
這裡寫圖片描述
將value改為1,再隨便輸入然後點選enter
這裡寫圖片描述
毫無疑問,輸入的內容就應該是a的值
得到flag

思路:
第一步看原始碼,

意思是Php將username雜湊以後與0比較,即‘0exxxxxxxx’類似這樣的雜湊值會相等(弱相等),因為字串和數字比字串會轉變成數字比較,即0e100相當於0的100次方
於是百度一下0e開頭的md5雜湊字串,如下:

QNKCDZO(0e830400451993494058024219903391)
s878926199a(0e545993274517709034328855841020)
s155964671a(0e342768416822451524974117254469)
s214587387a(0e848240448830537924465865611904)
隨便挑一個填在使用者名稱中
密碼使用admin
提交後得到路徑/user.php?fame=hjkleffifer
開啟指向的url的網頁,檢視原始碼得到
u

nserializestr=_POST[‘password’]; dataunserialize=unserialize(unserialize_str); if(data_unserialize['user'] == '???' &&data_unserialize[‘pass’]==’???’) { print_r($flag); } 偉大的科學家php方言道:成也布林,敗也布林。 回去吧騷年

程式碼意思是把post提交的password值經過”反序列化”得到一個數組,要求數組裡的user和pass都滿足,就列印flag
我們不知到???是什麼,但是我們注意到資訊中判斷條件使用的為==(php弱型別)

bool型別的true跟任意字串可以弱型別相等的,當代碼中存在unserialize或者json_decode的時候,我們可以構造bool型別,來達到欺騙。
現在我們構造一個數組,元素分別是user和pass,都是bool型別的true,於是我們得到
a:2:{s:4:”user”;b:1;s:4:”pass”;b:1;}(a代表array,s代表string,b代表bool,而數字代表個數/長度)
意思是陣列a中有兩個元素,長度為4的user元素的bool值為1,長度為4的pass元素的bool值為1.
這樣,經過反序列化後的user以及pass都是1,滿足if語句,則會print出flag

然後就有了兩種答案(其實本質上是一種答案)
(1)使用者名稱:admin
密碼:a:2:{s:4:”user”;b:1;s:4:”pass”;b:1;}
(2)使用者名稱:
QNKCDZO(0e830400451993494058024219903391)
s878926199a(0e545993274517709034328855841020)
s155964671a(0e342768416822451524974117254469)
s214587387a(0e848240448830537924465865611904)
MD前字串四個中的一個
密碼:a:2:{s:4:”user”;b:1;s:4:”pass”;b:1;}