Manipulate/bypass php 中的 md5?

Manipulate/bypass md5 in php?

我的大学 (IT-Securiy) 有一个程序,您必须尝试通过操纵 php 或 html 代码来捕获 "flags"。我们只看到下面的代码,程序在他们的网站上运行。所以我们需要以某种方式操纵 url 或类似的东西......但我真的坚持在这里:

<?php
require_once '_flags.php';


highlight_file(__FILE__);


if (isset($_GET['pw']) &&
        md5($_GET['pw']) == '0e13371337133713371337133713371337') {
    echo $doyouphp3_flag;
}

我知道,我必须通过添加 ...

来提交密码
?pw=...

...在url的末尾,但我只是不知道... 有什么方法可以绕过 md5 功能吗,例如,因为我认为他们不希望我强行输入密码...

希望有人能帮助我或者至少给我一个提示。

马吕斯

你只需要观察 0e13371337133713371337133713371337 是一个数字,它不是一个有效的 md5 散列。

然后您需要知道涉及数字字符串的 php 松散比较(使用 == 运算符)是如何工作的。您可以在 documentation:

上阅读

If you compare a number with a string or the comparison involves numerical strings, then each string is converted to a number and the comparison performed numerically.

所以,现在你知道了

var_dump('0' == '0e13371337133713371337133713371337'); // true
var_dump('0e123' == '0e13371337133713371337133713371337'); // true
var_dump('0e65165165165165' == '0e13371337133713371337133713371337'); // true

因此,您只需要找到一个也是数字的 md5 哈希。

240610708的md5散列为0e462097431906509019562988736854"0e13371337133713371337133713371337" == "0e462097431906509019562988736854"为真。所以你可以使用它。但 QNKCDZO 应该也能正常工作。

这里有什么教训? md5('240610708') == md5('QNKCDZO')true,这很危险,您应该使用 === 而不是 ==