Type juggling

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
…. .. ……. …………………………