Dans certains langages de programmation comme le php ou le javascript , le type d’une variable est déterminé par son contexte d’utilisation. Une même variable pourra par exemple être considérée comme une chaîne de caractère dans un cas et comme un nombre dans un autre. L’utilisation de ce mécanisme peut amener à centaines vulnérabilités puisque le type de la variables traitée ne sera pas toujours garanti.
Lors de l’usage de comparaison logique sans vérification de type (Loose Comparison) ces langages de programmation essayent de convertir les 2 éléments dans un type commun pour pouvoir effectuer la comparaison. Il arrive donc très souvent que les chaînes de caratère soient transformées en d’autres types, engendrant des vulnérabilités.
PHP
$foo = "1"; // $foo est une chaîne de caractères (ASCII 49)
$foo *= 2; // $foo est maintenant un entier (2)
$foo = $foo * 1.3; // $foo est maintenant un nombre à virgule flottante (2.6)
$foo = 5 * "10 Little Piggies"; // $foo est un entier (50)
$foo = 5 * "10 Small Pigs"; // $foo est un entier (50)
"0000" == int(0) //TRUE
"0e12" == int(0) //TRUE
"1abc" == int(1) //TRUE
"0abc" == int(0) //TRUE
"abc" == int(0) //TRUE
"0e12" == "0e13" //TRUE
Hash magique ( Magic Hash )
On appelle hash magique, les hash (chaîne de caratère) qui comparés à int(0) donneront un résultat true.
Hash Type | Hash Length | Magic Input | Magic Hash |
---|---|---|---|
md2 | 32 | 505144726 | 0e015339760548602306096794382326 |
md4 | 32 | 48291204 | 0e266546927425668450445617970135 |
md5 | 32 | 240610708 | 0e462097431906509019562988736854 |
sha1 | 32 | 240610708 | 0e462097431906509019562988736854 |
crc32 | 8 | 2332 | 0e684322 |
crc32b | 8 | 6586 | 0e817678 |
…. | .. | ……. | ………………………… |