【问题标题】:Why this PHP comparison it wont return True为什么这个 PHP 比较它不会返回 True
【发布时间】:2020-07-30 02:11:58
【问题描述】:

为什么这个 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";
}


?>

当我输入 QNKCDZO 时,它会返回:

:: 0e830400451993494058024219903391 :: QNKCDZO 假的

【问题讨论】:

  • 一个字符串怎么可能等于它自己的一个md5哈希?
  • md5 从字符串 $first 生成哈希。所以它永远不会相等。
  • 这是 CTF ..这是我想不通的技巧
  • if (true || $first == md5($first)){ 欢迎您;p

标签: php ctf


【解决方案1】:

关键是要注意比较是使用== 完成的,这会打开涉及类型杂耍的选项。

1e2 格式的字符串(其中 1 和 2 是任意大小的数字)被 PHP 解释为 scientific-notation floating point values。因为0e... 形式的任何值的计算结果都为零(零到任何幂仍等于零),下一步是找到一个数字X,它的0eX 的md5 哈希具有相同的形式。

0e215962017 的 MD5 哈希为 0e291242476940776845150308577824,请注意除初始 0e 之外的每个字符都是数字。

因此,当比较这些值时(松散地使用==),两者的计算结果都为零。

感谢https://github.com/bl4de/ctf/blob/master/2017/HackDatKiwi_CTF_2017/md5games1/md5games1.md,它完成了(更难)实际找到号码的工作。

【讨论】:

    猜你喜欢
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 2019-06-29
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    相关资源
    最近更新 更多