想起有次做到这样一道题:
由代码可知要得到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: