想起有次做到這樣一道題:
由代碼可知要得到flag需要str1=str2且a!=b
a,b是POST的方式得到,hack,rep是GET方式得到
題中的hash函數:
string hash ( string $algo , string $data [, bool $raw_output = false ] )
algo
要使用的哈希算法,例如:"md5","sha256","haval160" 等。
data
要進行哈希運算的消息。
raw_output
設置為 TRUE 輸出原始二進制數據, 設置為 FALSE 輸出小寫 16 進制字符串。
題中為對變量a進行md5加密
題中的strstr函數:
strstr ( string $haystack
, $needle
[, bool $before_needle
= FALSE
] )
結果返回 haystack
字符串從 needle
第一次出現的位置開始到 haystack
結尾的字符串。
若before_needle= TRUE
,strstr() 將返回 needle
在 haystack
中的位置之前的部分。
md5繞過原理:
PHP在處理哈希字符串時,會利用”!=”或”==”來對哈希值進行比較,它把每一個以”0E”開頭的哈希值都解釋為0,
所以如果兩個不同的密碼經過哈希以后,其哈希值都是以”0E”開頭的,那么PHP將會認為他們相同,都是0。
常用的有:
QNKCDZO
s878926199a
s155964671a
......
解題:
題中先對a和b進行了md5加密,這里我們用a=QNKCDZO,b=s878926199a.(因為它們md5加密后都為0e開頭)
則得到str1=0e830400451993494058024219903391
而后由strstr函數的性質,這里令hack=e,rep=true
即str2=strstr("0e545993274517709034328855841020","e",true)=0
所以最后滿足了str1=str2且a!=b,得到flag: