Une vulnérabilité de chiffrement MD5
Lors de la comparaison des chaînes de hachage, le programme php interprète chaque valeur de hachage commençant par "0x" comme la puissance de 0 en notation scientifique, et elle est toujours 0
Donc, si deux mots de passe différents sont hachés et que leurs valeurs de hachage commencent par "0e", alors PHP les considérera comme identiques.
De plus, dans le cryptage md5, il est possible que les deux chaînes soient différentes, mais la valeur cryptée est la même. Cette situation est appelée collision de hachage
<?php
$str1 = 's878926199a';
$str2 = 's214587387a';
echo json_encode([
'md5_str1' => md5($str1),
'md5_str2' => md5($str2),
'bool' => md5($str1) == md5($str2)
]);
Le résultat est le suivant, les deux valeurs sont égales après le chiffrement
Inconvénients, vous savez, si le mot de passe d'un certain utilisateur d'un site Web commence par 0e après avoir été crypté, à ce moment-là, un pirate informatique vient le casser, et il est facile de s'introduire.
{
md5_str1: "0e545993274517709034328855841020",
md5_str2: "0e848240448830537924465865611904",
bool: true
}
Deuxièmement, la vulnérabilité is_numeric
Ignorer les nombres hexadécimaux comme 0x
Opérations d'injection SQL faciles à déclencher, exposant des informations sensibles
echo json_encode([
is_numeric(233333),
is_numeric('233333'),
is_numeric(0x233333),
is_numeric('0x233333'),
is_numeric('233333abc'),
]);
Le résultat est le suivant
Le code hexadécimal 0x61646D696EASII correspond à admin
Si nous exécutons la commande suivante: SELECT * FROM tp_user où username = 0x61646D696E, le résultat est évident
[
true,
true,
true,
false,
false
]
Troisièmement, vulnérabilité in_array
Dans in_array, le type est d'abord converti en plastique, puis jugé
En tant que langage faiblement typé, PHP aura de grandes failles lors de la conversion de type
Lors de la conversion, si la chaîne est convertie en entier, la conversion est coupée de la partie non entière de la chaîne, et si elle ne peut pas être convertie, elle retournera 0
<?php
var_dump(in_array("2%20and%20%", [0,2,3]));
Le résultat est le suivant
bool(true)
Quatre, changer la vulnérabilité
Dans switch, le type est d'abord converti en plastique, puis jugé
En tant que langage faiblement typé, PHP aura de grandes failles lors de la conversion de type
Lors de la conversion, si la chaîne est convertie en entier, la conversion est coupée de la partie non entière de la chaîne, et si elle ne peut pas être convertie, elle retournera 0
<?php
$i ="abc";
switch ($i) {
case 0:
case 1:
case 2:
echo "i是比3小的数";
break;
case 3:
echo "i等于3";
}
Le résultat est le suivant
i est un nombre inférieur à 3
Cinq, vulnérabilité de conversion forcée intval
En tant que langage faiblement typé, PHP aura de grandes failles lors de la conversion de type
Lors de la conversion, si la chaîne est convertie en entier, la conversion est coupée de la partie non entière de la chaîne, et si elle ne peut pas être convertie, elle retournera 0
<?php
var_dump(intval('2')); //2
var_dump(intval('3abcd')); //3
var_dump(intval('abcd')); //0