Hashes "mágicos" en PHP (type jugling)
En PHP utilizar el operador igual-igual '==' puede traer serias implicaciones sobretodo a la hora de comparar hashes de contraseñas:
1.- Cuando se utiliza '==' PHP realiza un type juggling para determinar el tipo de variables que va a comparar.
2.- Los hashes en PHP están codificados en base16 y pueden encontrarse en formato "0e812389...".
3.- 0e significa "0 elevado a" por lo que si PHP encuentra una variable que empieza por "0e" seguida de números va a determinar que la variable es un flotante (aunque realmente sea un string).
4.- Evidentemente 0 elevado al número que sea va a ser siempre 0 (o mejor dicho 0.0)
5.- Si encontramos texto claro que al hashear (con el algoritmo correspondiente) de un resultado que empiece por "0e" habremos encontrado una contraseña que podría ser válida para muchos hashes del sistema (siempre que se use incorrectamente el operador '==' en lugar de '===').
Veamos unos ejemplos con md5. Primero obtenemos las "strings" mágicas:
$ echo -n 240610708 | md5sum
0e462097431906509019562988736854 -
$ echo -n QNKCDZO | md5sum
0e830400451993494058024219903391 -
$ echo -n aabg7XSs | md5sum
0e087386482136013740957780965295 -
Luego vemos que al compararlas con el operador '==' y con cualquier hash que empiece por '0e' el resultado es siempre verdadero:
$ php -a
Interactive mode enabled
php > var_dump(md5('240610708') == '0e111111111111111111111111111111');
bool(true)
Pero si no empieza por '0e' el resultado será falso:
php > var_dump(md5('240610708') == 'NO462097431906509019562988736854');
bool(false)
Por lo tanto en todas las implementaciones que usan php nunca está de más fuzzear los parámetros de contraseñas con estos valores que generan estos hashes "mágicos":
Y por último lo más sorprendente... ¿por qué no se han incorporado todavía estas strings en diccionarios de contraseñas/payloads como fuzzdb, seclist, en Kali etc.? ;)
Fuentes:
- https://www.whitehatsec.com/blog/magic-hashes/
- http://digitalloft.org/init/plugin_wiki/page/juggling-hashes-with-your-eyes-closed-in-php
- https://www.owasp.org/images/6/6b/PHPMagicTricks-TypeJuggling.pdf
1.- Cuando se utiliza '==' PHP realiza un type juggling para determinar el tipo de variables que va a comparar.
2.- Los hashes en PHP están codificados en base16 y pueden encontrarse en formato "0e812389...".
3.- 0e significa "0 elevado a" por lo que si PHP encuentra una variable que empieza por "0e" seguida de números va a determinar que la variable es un flotante (aunque realmente sea un string).
4.- Evidentemente 0 elevado al número que sea va a ser siempre 0 (o mejor dicho 0.0)
5.- Si encontramos texto claro que al hashear (con el algoritmo correspondiente) de un resultado que empiece por "0e" habremos encontrado una contraseña que podría ser válida para muchos hashes del sistema (siempre que se use incorrectamente el operador '==' en lugar de '===').
Veamos unos ejemplos con md5. Primero obtenemos las "strings" mágicas:
$ echo -n 240610708 | md5sum
0e462097431906509019562988736854 -
$ echo -n QNKCDZO | md5sum
0e830400451993494058024219903391 -
$ echo -n aabg7XSs | md5sum
0e087386482136013740957780965295 -
Luego vemos que al compararlas con el operador '==' y con cualquier hash que empiece por '0e' el resultado es siempre verdadero:
$ php -a
Interactive mode enabled
php > var_dump(md5('240610708') == '0e111111111111111111111111111111');
bool(true)
Pero si no empieza por '0e' el resultado será falso:
php > var_dump(md5('240610708') == 'NO462097431906509019562988736854');
bool(false)
Por lo tanto en todas las implementaciones que usan php nunca está de más fuzzear los parámetros de contraseñas con estos valores que generan estos hashes "mágicos":
Hash Type | Hash Length | “Magic” Number / String | Magic Hashes | Found By |
---|---|---|---|---|
md2 | 32 | 505144726 | 0e015339760548602306096794382326 | WhiteHat Security, Inc. |
md4 | 32 | 48291204 | 0e266546927425668450445617970135 | WhiteHat Security, Inc. |
md5 | 32 | 240610708 | 0e462097431906509019562988736854 | Michal Spacek |
sha1 | 40 | 10932435112 | 0e07766915004133176347055865026311692244 | Independently found by Michael A. Cleverly & Michele Spagnuolo & Rogdham |
sha224 | 56 | – | – | – |
sha256 | 64 | – | – | – |
sha384 | 96 | – | – | – |
sha512 | 128 | – | – | – |
ripemd128 | 32 | 315655854 | 0e251331818775808475952406672980 | WhiteHat Security, Inc. |
ripemd160 | 40 | 20583002034 | 00e1839085851394356611454660337505469745 | Michael A Cleverly |
ripemd256 | 64 | – | – | – |
ripemd320 | 80 | – | – | – |
whirlpool | 128 | – | – | – |
tiger128,3 | 32 | 265022640 | 0e908730200858058999593322639865 | WhiteHat Security, Inc. |
tiger160,3 | 40 | 13181623570 | 00e4706040169225543861400227305532507173 | Michele Spagnuolo |
tiger192,3 | 48 | – | – | – |
tiger128,4 | 32 | 479763000 | 00e05651056780370631793326323796 | WhiteHat Security, Inc. |
tiger160,4 | 40 | 62241955574 | 0e69173478833895223726165786906905141502 | Michele Spagnuolo |
tiger192,4 | 48 | – | – | – |
snefru | 64 | – | – | – |
snefru256 | 64 | – | – | – |
gost | 64 | – | – | – |
adler32 | 8 | FR | 00e00099 | WhiteHat Security, Inc. |
crc32 | 8 | 2332 | 0e684322 | WhiteHat Security, Inc. |
crc32b | 8 | 6586 | 0e817678 | WhiteHat Security, Inc. |
fnv132 | 8 | 2186 | 0e591528 | WhiteHat Security, Inc. |
fnv164 | 16 | 8338000 | 0e73845709713699 | WhiteHat Security, Inc. |
joaat | 8 | 8409 | 0e074025 | WhiteHat Security, Inc. |
haval128,3 | 32 | 809793630 | 00e38549671092424173928143648452 | WhiteHat Security, Inc. |
haval160,3 | 40 | 18159983163 | 0e01697014920826425936632356870426876167 | Independently found by Michael Cleverly & Michele Spagnuolo |
haval192,3 | 48 | 48892056947 | 0e4868841162506296635201967091461310754872302741 | Michael A. Cleverly |
haval224,3 | 56 | – | – | – |
haval256,3 | 64 | – | – | – |
haval128,4 | 32 | 71437579 | 0e316321729023182394301371028665 | WhiteHat Security, Inc. |
haval160,4 | 40 | 12368878794 | 0e34042599806027333661050958199580964722 | Michele Spagnuolo |
haval192,4 | 48 | – | – | – |
haval224,4 | 56 | – | – | – |
haval256,4 | 64 | – | – | – |
haval128,5 | 32 | 115528287 | 0e495317064156922585933029613272 | WhiteHat Security, Inc. |
haval160,5 | 40 | 33902688231 | 00e2521569708250889666329543741175098562 | Michele Spagnuolo |
haval192,5 | 48 | 52888640556 | 0e9108479697641294204710754930487725109982883677 | Michele Spagnuolo |
haval224,5 | 56 | – | – | – |
haval256,5 | 64 | – | – | – |
Y por último lo más sorprendente... ¿por qué no se han incorporado todavía estas strings en diccionarios de contraseñas/payloads como fuzzdb, seclist, en Kali etc.? ;)
Fuentes:
- https://www.whitehatsec.com/blog/magic-hashes/
- http://digitalloft.org/init/plugin_wiki/page/juggling-hashes-with-your-eyes-closed-in-php
- https://www.owasp.org/images/6/6b/PHPMagicTricks-TypeJuggling.pdf
Via: www.hackplayers.com
Hashes "mágicos" en PHP (type jugling)
Reviewed by Anónimo
on
5:03
Rating: