为什么这个 PHP 比较它不会返回 True 有没有办法让它返回 true ?
<?php
highlight_file(__FILE__);
error_reporting(0);
$first = $_GET['first_flag'];
echo ' :: ' . md5($first);
echo ' :: ' . $first ."<br/>";
if($first == md5($first)){
echo "True";
}else {
echo "False";
}
?>
Run Code Online (Sandbox Code Playgroud)
当我放置 QNKCDZO 时,它返回:
:: 0e830400451993494058024219903391 :: QNKCDZO 假
关键是要注意比较是使用 完成的==,它打开了涉及类型杂耍的选项。
格式中的字符串1e2(其中 1 和 2 是任意大小的数字)被PHP解释为科学记数法浮点值。因为形式中的任何值0e...计算为零(零的任何幂仍然等于零),下一步是找到一个数字X,其 md5 哈希为0eX相同的形式。
的 MD5 哈希值0e215962017是0e291242476940776845150308577824,注意除了首字母之外的每个字符0e字母都是数字。
因此,在比较值时(松散地,使用==),两者的计算结果都为零。
归功于https://github.com/bl4de/ctf/blob/master/2017/HackDatKiwi_CTF_2017/md5games1/md5games1.md,它完成了实际找到数字的(更困难的)工作。