Heim  >  Artikel  >  Java  >  Ein fortgeschrittener DoS-Angriff-Hash-Kollisionsangriff

Ein fortgeschrittener DoS-Angriff-Hash-Kollisionsangriff

怪我咯
怪我咯Original
2017-06-23 12:01:242235Durchsuche

Originallink

Dies ist die erste Angriffsmethode, die mir bisher Angst macht. Sie deckt einen weiten Bereich ab und ist schwer zu verteidigen, und die Angriffswirkung ist unmittelbar. Viele Websites und Weboberflächen sind nicht vor Hash-Kollisionsangriffen geschützt.

Angesichts der Beliebtheit von Schnittstellen im RESTful-Stil werden Programmierer standardmäßig JSON als Datenübertragungsmethode verwenden. Das JSON-Format weist eine geringere Datenredundanz und eine hohe Kompatibilität auf. Es ist seit seiner Einführung weit verbreitet und gilt als Standard im Web. Unabhängig davon, welche Sprache wir auf der Serverseite verwenden, müssen wir, nachdem wir die Daten im JSON-Format erhalten haben, jsonDecode() ausführen, um die JSON-Zeichenfolge in ein JSON-Objekt zu konvertieren. Das Objekt wird standardmäßig in der Hash-Tabelle gespeichert Die Hash-Tabelle ist leicht anfällig für Kollisionsangriffe. Solange ich die Angriffsdaten in JSON einfüge, wird das Serverprogramm infiziert, wenn ich jsonDecode() ausführe. Nach der Infektion steigt die CPU sofort auf 100 % an. Mit einer 16-Kern-CPU können 16 Anfragen den Zweck von DoS erreichen.

Alle Testprogramme wurden unter Mac Pro durchgeführt. Der Einfachheit halber habe ich nur 65536 JSON-Schlüssel-Wert-Paare erstellt. Beim tatsächlichen Starten eines Angriffs können Hunderttausende oder sogar Millionen von Daten erstellt werden.

Ein paar einfache Demos

Ich habe die Angriffsdaten in das JSON-Format konvertiert

  1. Hash-Angriffs-JSON-Daten

  2. Gemeinsame JSON-Daten

  3. Java-Version-Hash-Angriffsdaten

1. JavaScript-Test

//只需要一行代码就能看到效果var jsonSrc = '这里输入json数据';

Nur ​​wir Sie müssen eine Codezeile in js eingeben, um den Effekt zu sehen. Sowohl die normalen Daten als auch die Hash-Angriffsdaten verfügen über 65536 Zeilen mit Schlüssel-Wert-Paaren. Die Auswirkung meines lokalen Tests ist wie folgt:
Über den mit Chrome gelieferten Task-Manager können Sie sehen, dass die CPU sofort auf 100 % gestiegen ist und die Ausführung fast 1 Minute gedauert hat, während normale Daten dies können in wenigen Millisekunden ausgeführt;

2. PHP-Test

$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";

In PHP verwenden wir file_get_contents, um die Daten aus der Ferne abzurufen und die Laufzeiten zu vergleichen . Der einzelne Prozess von PHP-FPM beansprucht 100 % der CPU.

3. Java-Test

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("指定文件不存在");//处理异常
    }

    Map14bd1badcdee783757181db757c9943f map = new HashMap14bd1badcdee783757181db757c9943f();map = JSONObject.fromObject(jsonStr);return "Hash Collision ~";
}

Der Hash-Algorithmus von Java unterscheidet sich geringfügig von PHP und JavaScript, aber wir haben auch die 60.000 Zeilen erstellt von einfachen Daten. Im Spring-Boot-Framework initiiert der Browser einen Zugriff und das Ergebnis wird nach 26 Sekunden zurückgegeben, in denen die CPU voll ist.

4. Andere Sprachen werden noch untersucht...

HashTable ist eine sehr häufige Datenstruktur und Algorithmen, um darüber zu sprechen, also Hash Kollisionen sind allgegenwärtig. Ja, die Implementierung jeder Sprache weist nur geringfügige Unterschiede im Hashing-Algorithmus und in der Tabellenspeicherung auf.

Um zu überprüfen, ob der Hash-Kollisionsangriff von Java auch funktioniert, habe ich während der Feiertage zum Drachenbootfest Artikel zu Java HashTable gelesen. Nach harter Arbeit habe ich schließlich erfolgreich die Angriffsdaten generiert. Der Prozess ist nicht einfach und überprüft auch eine Idee. Alle Dinge auf hoher Ebene werden schließlich in grundlegendes Wissen über die Datenstruktur zerlegt.

So greifen Sie an

Vor ein paar Jahren war die PHP-Version noch 5.2. Wir konnten alle Hash-Schlüssel in den Body der POST-Anfrage einfügen, wie zum Beispiel:


Daten posten: k1=0&k2=0&k3=0...k999998=0&k999999=0

Nachdem der Server die Daten erhalten hat, werden sie gespeichert Wenn alle Parameter in der Hash-Tabelle ($_POST) gespeichert sind, kann der Angriff auf diese Weise einfach umgesetzt werden. Jetzt funktioniert diese Methode jedoch nicht mehr, da wir die Anzahl und Größe der HTTP-Anforderungsparameter auf der Nginx-Ebene und der PHP-Ebene problemlos begrenzen können. PHP erlaubt standardmäßig nur 1000 Parameter, was keinerlei Auswirkungen auf den Server hat.

Wir schreiben das Jahr 2017 und das JSON-Format sowie Schnittstellen im RESTful-Stil erfreuen sich großer Beliebtheit. Es bringt uns zwar eine bequeme Codierung, bietet aber auch eine neue Möglichkeit für Hash Collision Dos. Mittlerweile lauten viele Schnittstellen im RESTful-Stil wie folgt:


Daten: {"action": "create-account", "data": "}

Mit der obigen Schnittstelle fügen wir die Angriffsdaten direkt in den Datenparameter ein. Nach Erhalt der Daten führt der Server definitiv jsonDecode () aus, wodurch der Zweck des Angriffs problemlos erreicht wird.

Wie man sich verteidigt

Um sich gegen Hash Collision Dos-Angriffe zu verteidigen, gibt es in der Branche bereits viele ausgereifte Lösungen, aber alle empfehlen, die Sprache zu ändern oder die HashTable neu zu schreiben. Hier sprechen wir nur über die aktuellen Probleme beim Parsen des JSON-Formats. Zuerst müssen wir vor jsonDecode() eine Berechtigungsüberprüfung hinzufügen, um illegale Benutzer so weit wie möglich abzulehnen. Zweitens führen Sie vor jsonDecode() eine Überprüfung der Datengröße und der Parameter-Whitelist durch. Wenn die Kosten für die Transformation und Wartung alter Projekte hoch sind, empfiehlt es sich, die Methode jsonDecode() selbst neu zu schreiben

Das obige ist der detaillierte Inhalt vonEin fortgeschrittener DoS-Angriff-Hash-Kollisionsangriff. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Was ist WebService?Nächster Artikel:Was ist WebService?