The problem boils down to a single line of PHP code: $_GET["md4"] == hash("md4", $_GET["md4"]) There are two ways of making the check pass: - Find a MD4 hash that's hashes to itself (a so-called fix point) - Exploit PHP's whacky weak typing The former didn't yield any results whatsoever, so I set out to find some shortcut. Unlike in strongly typed programming languages `==` will do things in PHP such as coercing strings looking like numbers to numbers, then compare the coerced values with each other. For this to work a number of conditions need to be fulfilled: - The user input needs to look numerical - The hash output needs to look numerical - The numerical value of the user input and the hash output needs to be equal The easiest approach to pass all three checks is to have a string starting with at least one zero, followed by digits only. An alternative approach is a string starting with `0e` (scientific notation) followed by digits only. The big difference between both approaches is that while the hash output needs to look similar, the numerical value doesn't matter in the latter case as no matter what follows as exponent is interpreted as zero. Knowing this writing a bruteforce script isn't hard. Mine ran for about an hour, then printed a working pair of hashes.