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
Muy apropiado para cierta maquina de hackthebox que hice ayer xD
ResponderEliminar...que empieza por "f"...xD
EliminarAñade unos pocos más a la colección:
ResponderEliminarSHA224 = "10000096" = 0E2054E14B87C2C3980BC22BC648C5BC77AD26CB1C7DF60418CCD8FC
SHA256 = "10000676" = 0EE69F305720F20EED805697DC6EA4C8735D1A54209942A4CCEE5C56E2DE1B79
SHA384 = "10000240" = 0E03D2540177A3D3BCEA3FFD2FCEB8282493FDF7E25A16809B60A781B3FE410388F71B868FE8C2D10D8409217C9A61D4
SHA512 = "10000188" = 0EA69EADB105B92ABC2A2B44192DE5BC9595DB0CC6AC23AECFE17AB8BC5ACBFA1473E87D732844271A87A20B69028A737E9E0B8D80FC1FCD2B7A4F27B85DF452
Whirlpool = "10000181" = 0E5D568FC9D19C6F60AF458316BAC910480C231D5D1FDEF92D75E2395E2891C898670FAA62D5F0C2063CD25745AB6D4D645C2F3F83DDA770AAE1017DF2DA7B3A
No hacer caso X-D Me he colado en el cálculo X-D Sorry. No cumplen todas las condiciones.
ResponderEliminar