Lien original
C'est la première méthode d'attaque qui me fait peur jusqu'à présent. Elle couvre une large portée et est difficile à défendre, et l'effet d'attaque est immédiat. Un grand nombre de sites Web et d’interfaces Web ne sont pas protégés contre les attaques par collision de hachage.
Avec la popularité des interfaces RESTful, les programmeurs utiliseront par défaut json comme méthode de transfert de données. Le format json a moins de redondance des données et une compatibilité élevée. Il a été largement utilisé depuis sa proposition et peut être considéré comme devenu un standard sur le Web. Quel que soit le langage que nous utilisons côté serveur, après avoir obtenu les données au format json, nous devons faire jsonDecode() pour convertir la chaîne json en un objet json. L'objet sera stocké dans la table de hachage par défaut et. la table de hachage est facilement vulnérable aux attaques par collision. Tant que je mets les données d'attaque dans json, le programme serveur sera infecté lors de l'exécution de jsonDecode(). Après avoir été infecté, le processeur passera immédiatement à 100 %. Avec un processeur à 16 cœurs, 16 requêtes peuvent atteindre l'objectif du DoS.
Tous les programmes de test ont été réalisés sous Mac Pro Pour faciliter les tests, je n'ai construit que 65 536 paires clé-valeur json. Lors du lancement d'une attaque, des centaines de milliers, voire des millions de données peuvent être construites.
J'ai converti les données d'attaque au format json
Données json d'attaque de hachage
Données JSON communes
Version Java Données d'attaque de hachage
Test JavaScript
//只需要一行代码就能看到效果var jsonSrc = '这里输入json数据';
Nous uniquement. Vous devez entrer une ligne de code dans js pour voir l'effet. Les données normales et les données d'attaque de hachage contiennent 65 536 lignes de paires clé-valeur. L'effet de mon test local est le suivant :
Grâce au gestionnaire de tâches fourni avec Chrome, vous pouvez voir que le processeur a immédiatement augmenté à 100 % et qu'il a fallu près d'une minute pour terminer l'exécution, alors que les données ordinaires peuvent être terminé en quelques millisecondes ;
2. Test PHP
$json = file_get_contents("https://raw.githubusercontent.com/laynefyc/php_thread_demo/master/hashNomal.json"); $startTime = microtime(true); $arr = json_decode($json,true); $endTime = microtime(true); echo "Nomal:".($endTime - $startTime)."\r\n"; $json = file_get_contents("https://raw.githubusercontent.com/laynefyc/php_thread_demo/master/hash.json"); $startTime = microtime(true); $arr = json_decode($json,true); $endTime = microtime(true); echo "Attack:".($endTime - $startTime)."\r\n";
En PHP, nous utilisons file_get_contents pour obtenir les données à distance et comparer les temps d'exécution. . Le processus unique de php-fpm occupe 100 % du CPU.
3. Test Java
public String index(){String jsonStr = "";try { FileReader fr = new FileReader("t.log");//需要读取的文件路径BufferedReader br = new BufferedReader(fr); jsonStr = br.readLine(); br.close(); fr.close(); //关闭文件流 }catch(IOException e) { System.out.println("指定文件不存在");//处理异常 } Map<String, Object> map = new HashMap<String, Object>();map = JSONObject.fromObject(jsonStr);return "Hash Collision ~"; }
En Java, nous effectuons des tests en lisant des fichiers. L'algorithme de hachage de Java est légèrement différent de PHP et de JavaScript, mais nous avons également construit les 60 000 lignes. de données simples. Dans le framework Spring Boot, le navigateur initie un accès et le résultat est renvoyé au bout de 26 secondes, pendant lesquelles le CPU est plein.
4. D'autres langages sont encore à l'étude...
HashTable est une structure de données très courante il existe une classe spéciale sur les structures de données et les algorithmes pour en parler, donc Hash. La collision est omniprésente. Oui, l'implémentation de chaque langage ne présente que de légères différences dans l'algorithme de hachage et le stockage des tables.
Afin de vérifier que l'attaque par collision Hash de Java fonctionne également, j'ai lu des articles liés à Java HashTable pendant les vacances du Dragon Boat Festival. Après un travail acharné, j'ai finalement réussi à générer les données d'attaque. Le processus n'est pas simple, et il vérifie également une idée : toutes les choses de haut niveau sont finalement décomposées en connaissances de base sur la structure des données.
Il y a quelques années, la version PHP était encore 5.2 On pouvait mettre toutes les clés de hachage dans le Corps de la requête POST, comme par exemple :
Une fois que le serveur aura obtenu les données, il les stockera tous les paramètres de la table de hachage ($_POST), l'attaque peut être facilement mise en œuvre de cette manière. Mais maintenant, cette méthode ne fonctionne pas, car nous pouvons facilement limiter le nombre et la taille des paramètres de requête HTTP au niveau de la couche Nginx et de la couche PHP. PHP n'autorise que 1000 paramètres par défaut, ce qui n'a aucun impact sur le serveur. Nous sommes maintenant en 2017 et le format json et les interfaces de style RESTful sont devenus très populaires. Tout en nous apportant un codage pratique, il offre également une nouvelle méthode pour Hash Collision Dos. Désormais, de nombreuses interfaces de style RESTful sont les suivantes :Publier les données : k1=0&k2=0&k3=0...k999998=0&k999999=0
Avec l'interface ci-dessus, nous mettons directement les données d'attaque dans le paramètre data. Après avoir reçu les données, le serveur fera certainement jsonDecode(), ce qui atteint facilement l'objectif de l'attaque. Comment se défendrePour se défendre contre les attaques Hash Collision Dos, il existe déjà de nombreuses solutions matures dans l'industrie, mais elles recommandent toutes de changer la langue ou de réécrire la HashTable. Ici, nous parlons uniquement des problèmes actuels d’analyse du format json. Tout d’abord, nous devons ajouter une vérification des autorisations pour rejeter autant que possible les utilisateurs illégaux avant jsonDecode(). Deuxièmement, effectuez une vérification de la taille des données et de la liste blanche des paramètres avant jsonDecode(). Si le coût de transformation et de maintenance des anciens projets est élevé, il est recommandé de réécrire soi-même la méthode jsonDecode()Données : {"action":"create-account","data":""}
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!