Heim  >  Artikel  >  Datenbank  >  Gängige SQL-Injection-Methoden

Gängige SQL-Injection-Methoden

L
Lnach vorne
2020-05-30 11:28:083024Durchsuche

Gängige SQL-Injection-Methoden

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');

Fügen Sie als Nächstes die Anmeldung ein. Der Quellcode der Schnittstelle

<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",&#39;root&#39;,&#39;&#39;) or die("数据库连接失败!");;
mysql_select_db("injection",$conn) or die("您要选择的数据库不存在");
$name=$_POST[&#39;username&#39;];
$pwd=$_POST[&#39;password&#39;];
$sql="select * from users where username=&#39;$name&#39; and password=&#39;$pwd&#39;";
$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>
Gängige SQL-Injection-Methoden 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:



Abfrage bei fehlgeschlagener Anmeldung:

Gängige SQL-Injection-Methoden

Bis hierher die vorläufige Die Arbeit ist erledigt. Okay, als nächstes beginnen wir mit unserem Highlight: SQL-Injection

Gängige SQL-Injection-Methoden 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=&#39;marcofly&#39; and password=md5(&#39;test&#39;)


Natürlich sind der Benutzername und das Passwort die gleichen wie zuvor, das werden Sie tun Ich kann mich auf jeden Fall erfolgreich anmelden. Was aber, wenn wir einen falschen Benutzernamen oder ein falsches Passwort eingeben? Offensichtlich kann ich mich definitiv nicht anmelden. Nun, das ist unter normalen Umständen der Fall, aber bei Websites mit SQL-Injection-Schwachstellen können Sie sich trotzdem erfolgreich anmelden, solange eine spezielle „Zeichenfolge“ erstellt wird.

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=&#39;&#39; or 1=1#&#39; and password=md5(&#39;&#39;)

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=&#39;&#39; or 1=1#&#39; and password=md5(&#39;&#39;)

ist äquivalent zu

select* from users where usrername=&#39;&#39; or 1=1

, weil 1=1 immer wahr ist, das heißt, die where-Klausel ist immer wahr. Nach weiterer Vereinfachung der SQL usw . Es entspricht der folgenden Select-Anweisung:

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=&#39;admin&#39;#&#39; and password=md5(&#39;&#39;)

entspricht

select * from users where username=&#39;admin&#39;

, 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen