Letzte Woche habe ich eine Website für jemand anderen erstellt und zufällig festgestellt, dass es in meiner Arbeit viele Lücken gab. In nur 20 Sekunden habe ich sie mithilfe von SQL-Injection behoben. Also habe ich einige Informationen zur SQL-Injektion überprüft und einige Erkenntnisse gewonnen, die ich hoffentlich mit Anfängern teilen kann. Die Experten lachen!
Die allgemeine Idee des SQL-Injection-Angriffs:
Entdecken Sie SQL-Injection-Standorte;
Bestimmen Sie den Servertyp und den Hintergrunddatenbanktyp.
Um die Ausführbarkeit zu ermitteln
, nutzen einige Angreifer grundsätzlich SQL-Injection. Als nächstes werde ich auch über meine eigenen Erkenntnisse über die SQL-Injection-Methode sprechen.
Injektionsmethode:
Theoretisch würde die Authentifizierungswebseite so aussehen:
Wählen Sie * aus der Admin-Anweisung mit Benutzername='XXX' und Passwort='YYY' aus. Wenn vor der offiziellen Ausführung dieser Anweisung keine Zeichenfilterung erforderlich ist, ist es einfach, SQL-Injection zu implementieren.
Geben Sie beispielsweise in das Textfeld „Benutzername“ ein: abc' oder 1=1-- Geben Sie in das Feld „Passwort“ ein: 123, dann wird die SQL-Anweisung zu:
Wählen Sie * vom Administrator aus, wobei Benutzername='abc' oder 1=1 und Passwort='123' sind. Unabhängig davon, welchen Benutzernamen und welches Passwort der Benutzer eingibt, wird diese Anweisung immer korrekt ausgeführt, und der Benutzer kann das System leicht täuschen und einen rechtlichen Hinweis erhalten Identität.
Erraten Sie die Lösung:
Die Grundidee ist: Erraten Sie alle Datenbanknamen, erraten Sie jeden Tabellennamen in der Datenbank, analysieren Sie die Tabellennamen, in denen Benutzernamen und Kennwörter gespeichert sein können, erraten Sie jeden Feldnamen in der Tabelle, erraten Sie jeden Datensatz im Tabelleninhalt.
Es gibt auch eine Möglichkeit, Ihren Datenbanknamen und den Namen jeder Tabelle abzurufen.
Rufen Sie einfach Ihren Datenbanknamen und Tabellennamen ab, indem Sie einen Fehler im Formular http://www .cn/news?id=10' melden.
Für JSP wenden wir im Allgemeinen die folgenden Strategien an, um damit umzugehen:
1.PreparedStatement
Wenn Sie bereits ein mäßig fortgeschrittener Entwickler sind, sollten Sie immer PreparedStatement anstelle von Statement verwenden.
Hier sind einige Gründe
1. Lesbarkeit und Wartbarkeit des Codes.
2. PreparedStatement verbessert die Leistung so weit wie möglich.
3. Der wichtigste Punkt ist, dass die Sicherheit erheblich verbessert wird.
Bisher kennen einige Leute (einschließlich mir) nicht einmal die grundlegende böse SQL-Syntax.
String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";
Wenn wir [' oder '1' = '1] als Namen übergeben, sehen wir, wie es aussehen wird. Netzwerkverwaltungsnetzwerk bitsCN.com
select * from tb_name = 'or '1' = '1' and passwd = 'casual' ;
Da '1'='1' definitiv wahr ist, kann es jede Überprüfung bestehen. Darüber hinaus:
Übergeben Sie ['; drop table tb_name ] als varpasswd, dann:
select * from tb_name = 'any' and passwd = ''; drop table tb_name;
Und wenn Sie vorkompilierte Anweisungen verwenden, haben alle von Ihnen übergebenen Inhalte keine passende Beziehung zu den ursprünglichen Anweisungen (Voraussetzung ist, dass die Datenbank selbst die Vorkompilierung unterstützt, es jedoch möglicherweise keine serverseitigen Datenbanken gibt, die die Kompilierung nicht unterstützen.) Es gibt nur wenige Desktop-Datenbanken, also solche mit direktem Dateizugriff. Solange sie alle vorkompilierte Anweisungen verwenden, müssen Sie möglicherweise keine Filterung für die eingehenden Daten durchführen viel Zeit beim Ablegen usw. Intrigantes Urteilsvermögen und übermäßiges Nachdenken.
2. Reguläre Ausdrücke
2.1. Regulärer Ausdruck zur Erkennung von SQL-Metazeichen/(%27)|(')|(--)|(%23)|(#)/ix
2.2. Korrigieren Sie den regulären Ausdruck zur Erkennung von SQL-Metazeichen /((%3D)|(=))[^n]*((%27)|(')|(--) 54ne. com
|(%3B)|(:))/i
2.3. Typischer SQL-Injection-Angriff regulärer Ausdruck/w*((%27)|('))((%6F)|o|(%4F))((%72)|r |( China Network Management Alliance www.bitscn.com
%52))/ix
2.4. SQL-Injection erkennen, regulärer Ausdruck des UNION-Abfrageschlüsselworts /((%27)|('))union/ix(%27)|(') – single
Anführungszeichen und ihre hexadezimale äquivalente Union – das Union-Schlüsselwort.
2.5. Regulärer Ausdruck/exec(s|+)+(s|x)pw+/ix zur Erkennung von MS SQL Server SQL-Injection-Angriffen
3. String-Filterung
öffentlicher statischer String filterContent(String-Inhalt){
String flt="'|and|exec|insert|select|delete|update|count|*|%
|chr|mid|master|truncate|char|declare|; |or|-|+|,";
Stringfilter[] = flt.split("|");
for(int i=0; i {
content.replace(filter[i], "");
}
Inhalt zurückgeben;
}
4. Unsichere Zeichenmaskierung
Dieser Teil verwendet js zum Blockieren, obwohl die Methode zum Blockieren von Schlüsselwörtern eine gewisse Wirkung hat. In tatsächlichen Anwendungen können diese SQL-Schlüsselwörter jedoch auch zu echten Abfrageschlüsselwörtern werden und dann von Ihnen blockiert werden Der Benutzer kann es nicht normal verwenden. Bemühen Sie sich einfach um Codierungsstandards.
Wenn das ausgeführte SQL Variablen enthält, verwenden Sie einfach PreparedStatement, das von JDBC (oder einer anderen Datenpersistenzschicht) bereitgestellt wird. Denken Sie daran, nicht die Methode zum Spleißen von Zeichenfolgen zu verwenden.
Funktionseinführung: Überprüfen Sie, ob es „'“, „ \“, „/ “ enthält.
Parameterbeschreibung: Der zu prüfende String. Rückgabewert: 0: Ja 1: Nicht Funktionsname Ja
Funktionsprüfung(a)
{
Rückgabe 1;
fibdn = new Array ("'" ," \","/ ");
i=fibdn.length;
j=a.length;
für (ii=0; ii { für (jj=0; jj
{ temp1=a.charAt(jj);
temp2=fibdn[ii];
if (tem'; p1==temp2)
{ return 0;
}
}
return
1;