Gemeinsame SQL-Injection-Methoden
SQL-Injection für WEB-Sicherheit
Einführung:
Bei der Entwicklung einer Website ist es aus Sicherheitsgründen notwendig, die von der Seite übergebenen Zeichen zu filtern. Normalerweise können Benutzer den Inhalt der Datenbank über die folgenden Schnittstellen aufrufen: URL-Adressleiste, Anmeldeschnittstelle, Message Board, Suchfeld usw. Dies bietet Hackern häufig Möglichkeiten, diese auszunutzen. Im schlimmsten Fall kann es zu Datenlecks und im schlimmsten Fall zum Ausfall des Servers kommen.
1. SQL-Injection-Schritte
a) Finden Sie den Injektionspunkt und erstellen Sie eine spezielle Anweisung
Die steuerbaren Parameter der eingehenden SQL-Anweisung werden unterteilt in zwei Kategorien
1. Bei numerischen Typen müssen Parameter nicht in Anführungszeichen gesetzt werden, z. B. ?id=1
2. Bei anderen Typen müssen Parameter in Anführungszeichen eingeschlossen werden, z. B.?name ="phone"
b) Der Benutzer erstellt eine SQL-Anweisung (z. B.: 'oder 1=1#;admin'# (diese Injektion wird auch als universelles Passwort von PHP bezeichnet, das die Eingabe des Passworts umgehen kann, wenn die Benutzername ist bekannt). und führt die notwendigen Operationen aus
e) DBMS Akzeptieren Sie das zurückgegebene Ergebnis, verarbeiten Sie es und geben Sie es an den Benutzer zurück
Da der Benutzer eine spezielle SQL-Anweisung erstellt, müssen spezielle Ergebnisse zurückgegeben werden (wie solange Ihre SQL-Anweisung flexibel genug ist)
Nachfolgend übergebe ich Beispiele, um die SQL-Injection im Detail zu demonstrieren
2. Detaillierte Erläuterung der SQL-Injection-Beispiele (bei den obigen Tests wird davon ausgegangen, dass magic_quote_gpc dies nicht ist auf dem Server aktiviert)
1) Vorbereitende Vorbereitungen Lassen Sie uns die erste SQL-Injection-Schwachstelle demonstrieren, melden Sie sich bei der Backend-Administratorschnittstelle an Erstellen Sie zunächst eine Datentabelle zum Testen:
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(64) NOT NULL, `password` varchar(64) NOT NULL, `email` varchar(64) NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `username` (`username`) ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
Fügen Sie einen Datensatz zum Testen hinzu:
INSERT INTO users (username,password,email)VALUES('MarcoFly',md5('test'),'marcofly@test.com');
<html> <head> <title>Sql注入演示</title> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> </head> <body> <form action="validate.php" method="post"> <fieldset> <legend>Sql注入演示</legend> <table> <tbody> <tr> <td>用户名:</td> <td><input type="text" name="username" /></td> </tr> <tr> <td>密 码:</td> <td><input type="text" name="password" /></td> </tr> <tr> <td><input type="submit" value="提交" /></td> <td><input type="reset" value="重置" /></td> </tr> </tbody> </table> </fieldset> </form> </body> </html>
Im Anhang finden Sie das Rendering:
Wenn der Benutzer auf die Schaltfläche „Senden“ klickt, werden die Formulardaten an die Seite „validate.php“ übermittelt. Die Seite „validate.php“ wird verwendet, um zu bestimmen, ob der vom Benutzer eingegebene Benutzername und das Passwort die Anforderungen erfüllen (dies Schritt ist sehr wichtig und darin liegen oft SQL-Schwachstellen)! <!--前台和后台对接--> <html> <head> <title>登录验证</title> <meta http-equiv="content-type" content="text/html;charset=utf-8"> </head> <body> <?php $conn=@mysql_connect("localhost",'root','') or die("数据库连接失败!");; mysql_select_db("injection",$conn) or die("您要选择的数据库不存在"); $name=$_POST['username']; $pwd=$_POST['password']; $sql="select * from users where username='$name' and password='$pwd'"; $query=mysql_query($sql); $arr=mysql_fetch_array($query); if(is_array($arr)){ header("Location:manager.php"); }else{ echo "您的用户名或密码输入有误,<a href=\"Login.php\">请重新登录!</a>"; } ?> </body> </html>Haben Sie es bemerkt? Die Daten (Benutzername und Passwort) werden direkt ausgeführt, eine Sonderzeichenfilterung jedoch nicht Später werden Sie verstehen, dass dies fatal ist. Code-Analyse: Wenn Benutzername und Passwort erfolgreich übereinstimmen, wird zur Administrator-Bedienoberfläche (manager.php) gesprungen. Wenn dies fehlschlägt, wird eine freundliche Eingabeaufforderung angezeigt.
Schnittstelle für erfolgreiche Anmeldung:
2) Erstellen Sie die SQL-Anweisung
Nachdem Sie den richtigen Benutzernamen (marcofly) und das richtige Passwort (test) eingegeben haben, klicken Sie auf „Senden“ und Es wird an unsere „Welcome Administrator“-Schnittstelle zurückgegeben.Da der von uns übermittelte Benutzername und das Passwort wie folgt in die SQL-Abfrageanweisung synthetisiert werden:
select * from users where username='marcofly' and password=md5('test')
Zum Beispiel: Geben Sie „ oder 1=1#“ in das Eingabefeld für den Benutzernamen ein, geben Sie das gewünschte Passwort ein, dann lautet die synthetisierte SQL-Abfrageanweisung:
select * from users where username='' or 1=1#' and password=md5('')
Semantische Analyse: „#“ ist ein Kommentarzeichen in MySQL, daher wird der Inhalt nach dem Nummernzeichen von MySQL als Kommentarinhalt betrachtet und daher nicht ausgeführt usw. Valenz:
select * from users where username='' or 1=1#' and password=md5('')
ist äquivalent zu
select* from users where usrername='' or 1=1
select * from users
Ja, die Funktion dieser SQL-Anweisung besteht darin, alle Felder in der Benutzertabelle abzurufen
Das Obige ist eine Eingabemethode. Hier ist eine weitere Injektionsmethode. Diese Methode wird auch als universelles Passwort von PHP bezeichnet.
Wir können uns ohne Passwort anmelden, wenn wir den Benutzernamen bereits kennen: admin
Konstruktionsanweisung :
select * from users where username='admin'#' and password=md5('')
entspricht
select * from users where username='admin'
, Sie können sich also anmelden, ohne ein Passwort einzugeben.
Die Datenbank geht fälschlicherweise davon aus, dass Sie sich ohne Benutzernamen anmelden können, wodurch die Hintergrundüberprüfung umgangen wird und der Zweck der Injektion erreicht wird.
nutzt auch Schwachstellen in der SQL-Syntax aus.
Sehen Sie, eine konstruierte SQL-Anweisung kann solch eine schreckliche Zerstörungskraft haben. Ich glaube, dass Sie, nachdem Sie dies gesehen haben, anfangen werden, ein rationales Verständnis der SQL-Injection zu entwickeln~
Ja, SQL-Injection. So einfach ist das. Allerdings ist es nicht so einfach, flexible SQL-Anweisungen entsprechend der tatsächlichen Situation zu erstellen. Nachdem Sie die Grundlagen verstanden haben, können Sie es langsam auf eigene Faust erkunden.
Haben Sie jemals darüber nachgedacht, was passiert, wenn die über das Hintergrund-Anmeldefenster übermittelten Daten vom Administrator mit Sonderzeichen herausgefiltert werden? In diesem Fall kann unser universeller Benutzername oder 1=1# nicht verwendet werden. Dies bedeutet jedoch nicht, dass wir keine Gegenmaßnahmen haben. Wir müssen wissen, dass es für Benutzer mehr als eine Möglichkeit gibt, mit der Datenbank zu interagieren.
Empfohlen: „MySQL-Tutorial“
Das obige ist der detaillierte Inhalt vonGängige SQL-Injection-Methoden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!