Wie erkennt man eine SQL-Injection?
Meine Antwort lautet: Wenn es um die Sicherheit von Partei A geht, ist die Erkennung von SQL-Injections relativ einfach.
1) Fehlerinjektionserkennung.
2) Fügen Sie keine Bool-Fehlerberichte ein, da die Zahl der Fehlalarme relativ hoch ist.
3) Führen Sie eine zeitbasierte Zeitinjektion durch, kontaktieren Sie den Betrieb und die Wartung, um langsame Protokolldatenbankaufzeichnungen zu erstellen, überwachen Sie den Ruhezustand und führen Sie eine Benchmark-Schlüsselwortüberwachung durch. Sie können die ID-Nummer der Scanaufgabe zum Dezimalpunkt der Ruhezeit hinzufügen, um dies zu erleichtern Positionierung. (P.S.: Diese Methode kann 99 % der SQL-Injektionen finden)
Daher beschränke ich den Zeitfehler bei der zeitbasierten Zeitinjektion sehr streng. Allerdings führt @chengable sicherheitsrelevante Arbeiten an Partei B durch, und eine zeitbasierte Zeitinjektion ist im Allgemeinen nicht möglich. Es versteht sich, dass er hauptsächlich zuerst das Vorhandensein von Injektionspunkten filtert und dann sqlmapapi.py erkennt. Ich habe zuvor auch sqlmap zum Testen verwendet. Das Problem war, dass die Scanzeit zu lang war und die JSON-Formatinjektion nicht unterstützt wurde. . Die Zeitinjektion von sqlmap ist jedoch relativ genau. Was ist, wenn Sie sqlmapapi.py nicht verwenden möchten? Hier werde ich die zeitbasierte Injektionslogik von sqlmap herausarbeiten.
Beschweren Sie sich: Der Code von sqlmap ist nicht standardisiert, hässlich und groß. Jemand hat mir empfohlen, den SQLMAP-Quellcode zu lesen und viel zu lernen. Jetzt, wo ich darüber nachdenke, habe ich früh aufgegeben.
Wenn Sie also faul sind und sich den Quellcode nicht ansehen möchten, fügen Sie --technique=T -v 3 hinzu und schauen Sie sich zuerst die Nutzlast der SQLMap-Erkennung an.
Es scheint, dass ich faul war und einige Wege gefunden habe:
Zuerst hat sqlmap die Injektionsnutzlast des Schlafs gestopft:
Erster gefüllter Schlaf (5) , nachdem festgestellt wurde, dass es ausgeführt wird; Sleep(0) wird eingefügt und schließlich wird Sleep(5) eingefügt.
Dann raten Sie, zuerst zu schlafen (5) und dann zu schlafen (0), wenn die zweite Verzögerung erfolgreich ist. Wenn keine Verzögerung festgestellt wird, fahren Sie mit dem Ruhezustand fort (5). Wenn die Verzögerung erneut erfolgreich ist, wird eine Erinnerung angezeigt, dass möglicherweise eine Injektion erfolgt:
Schließlich wird SQLMap sehr geschickt verwendet, um Fehlalarme zu verhindern Wenn die Beurteilungsbedingung verwendet wird, um falsch positive Ergebnisse zu eliminieren, können Sie sehen, dass sqlmap zweimal prüft, ob die Gleichung wahr ist, und zweimal testet, ob die Gleichung falsch positiv ist, basierend auf der zweiten Verzögerung.
Kehren Sie zum Quellcode zurück und werfen Sie einen Blick darauf: Gehen wir basierend auf einigen der vorherigen Schlüsselwörter direkt zum Code, um einen Blick darauf zu werfen. Beispielsweise erscheint *appears to be* vor der Suche. Siehe den Code des ersten Schritts:
sqlmap/lib/controller/checks.py:
Ich habe hier festgestellt, dass es fast so ist das Gleiche, was ich vorher vermutet habe.
Suchen Sie, wo sich die Nutzlast befindet, insbesondere die Nutzlast mit if-Bedingung, und finden Sie sie hier:
sqlmap/xml/payloads/time_blind.xml:
Sie können jeweils sehen, ob die Nutzlast von Die Bedingungen liegen im Vektorfeld.
Observed tools/sqlmap/xml/boundaries.xml, daher müssen wir hier auch auf die verschiedenen Schließungssituationen verweisen:
5. Bestimmen Sie, ob eine Verzögerung vorliegt
Wenn die Injektionszeit Sleep(5) ist, subtrahiere ori_time von der aktuellen Zeit als Sleep_time. Wenn „sleep_time“ kleiner als 4 ist, wird davon ausgegangen, dass die Verzögerung nicht aufgetreten ist. (Angesichts der Tatsache, dass ori_time vom Netzwerk beeinflusst wird und größer wird, wird der Schwellenwert hier auf vier Sekunden angepasst.)
Wenn die Injektionszeit Sleep (0) ist, subtrahieren Sie ori_time von der aktuellen Zeit als Sleep_time. Wenn „sleep_time“ größer als 2 ist, bedeutet dies, dass in der Verzögerung ein Fehlalarm vorliegt.
5.2 Methode 2
Nachverfolgung: Request.queryPage --->wasLastResponseDelayed Sie können sehen, dass die Logik so ist : Nehmen Sie die Verbrauchszeit von 30 normalen Tests ohne injizierte Nutzlast und geben Sie sie in kb.responseTimes ein. Berechnen Sie die Standardabweichung 30 Mal als Abweichung und berechnen Sie die langsamste Reaktionszeit basierend auf der Abweichung als unteres StdLimit:
Sein Wert ist der Durchschnitt aus dem 30-fachen plus TIME_STDEV_COEFF*Standardabweichung (Abweichung). Wenn Sie TIME_STDEV_COEFF auf 7 setzen, kann die Beurteilungsgenauigkeit 99,999999997440 % betragen.
Beurteilen Sie abschließend, ob die Verbrauchszeit der aktuellen Anforderung größer als das untere StdLimit ist. Wenn sie größer ist, bedeutet dies, dass eine Verzögerung auftritt. Wenn sie kleiner ist, bedeutet dies, dass keine Verzögerung vorliegt (außerdem, wenn das untere StdLimit weniger als 0,5 Sekunden beträgt). , unteresStdLimit dauert 0,5 Sekunden).
Emotion sagt mir, dass ich Methode eins wählen sollte, und Rationalität sagt mir, dass ich Methode zwei wählen sollte. Ich habe mich trotzdem für Methode zwei entschieden und den Einspritzpunkt gemessen (Details). Beim sehr stabilen Scannen wurden Injektionsschwachstellen gefunden.
Das obige ist der detaillierte Inhalt vonSo implementieren Sie die Analyse der zeitbasierten SQLMAP-Injektion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!