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":

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

4 comentarios :

  1. Muy apropiado para cierta maquina de hackthebox que hice ayer xD

    ResponderEliminar
  2. Añade unos pocos más a la colección:
    SHA224 = "10000096" = 0E2054E14B87C2C3980BC22BC648C5BC77AD26CB1C7DF60418CCD8FC
    SHA256 = "10000676" = 0EE69F305720F20EED805697DC6EA4C8735D1A54209942A4CCEE5C56E2DE1B79
    SHA384 = "10000240" = 0E03D2540177A3D3BCEA3FFD2FCEB8282493FDF7E25A16809B60A781B3FE410388F71B868FE8C2D10D8409217C9A61D4
    SHA512 = "10000188" = 0EA69EADB105B92ABC2A2B44192DE5BC9595DB0CC6AC23AECFE17AB8BC5ACBFA1473E87D732844271A87A20B69028A737E9E0B8D80FC1FCD2B7A4F27B85DF452
    Whirlpool = "10000181" = 0E5D568FC9D19C6F60AF458316BAC910480C231D5D1FDEF92D75E2395E2891C898670FAA62D5F0C2063CD25745AB6D4D645C2F3F83DDA770AAE1017DF2DA7B3A

    ResponderEliminar
  3. No hacer caso X-D Me he colado en el cálculo X-D Sorry. No cumplen todas las condiciones.

    ResponderEliminar