0x01 前言
在做一道md5()的CTF题目时,代码如下:
include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER[‘REQUEST_URI‘], ‘?‘);
$str = substr($str,1);
$str = str_replace(‘key‘,‘‘,$str);
parse_str($str);
echo md5($key1);
echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}
提交参数“?kkeyey1=”即可得到flag,对此感到疑惑,便进行了简单测试。
0x02 PHP比较运算符
==只对值做判断,比如5=="5"结果为真;===绝对等于,会判断数据类型和值,5==="5"结果为假;!==绝对不等于也会判断数据类型。
0x03
提交的参数最后被处理为key1=‘‘,key2为NULL。
‘‘和NULL使用md5()进行加密后的MD5值是相同的,都是“d41d8cd98f00b204e9800998ecf8427e”
因此MD5值比较验证通过。
题目代码中使用了绝对不等于(!==)对key1和key2的原始值进行判断,‘‘的类型为String,NULL的类型为NULL所以 ‘‘!==NULL 的结果为真。
0x04 总结
关于通过==和!==比较NULL和‘‘结果均为真的问题在于对数据类型的判断,==没有进行数据类型判断,而!==做了数据类型判断。
使用比较运算符时注意==和===,!=和!==。