Heim Datenbank MySQL-Tutorial Gängige SQL-Injection-Methoden

Gängige SQL-Injection-Methoden

May 30, 2020 am 11:28 AM
sql注入

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;
Nach dem Login kopieren

Fügen Sie einen Datensatz zum Testen hinzu:

INSERT INTO users (username,password,email)VALUES('MarcoFly',md5('test'),'marcofly@test.com');
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren
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;)
Nach dem Login kopieren


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;)
Nach dem Login kopieren
Nach dem Login kopieren

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;)
Nach dem Login kopieren
Nach dem Login kopieren

ist äquivalent zu

select* from users where usrername=&#39;&#39; or 1=1
Nach dem Login kopieren

, 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
Nach dem Login kopieren

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;)
Nach dem Login kopieren

entspricht

select * from users where username=&#39;admin&#39;
Nach dem Login kopieren

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

Erklärung dieser Website
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

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So verwenden Sie exp für die SQL-Fehlerinjektion So verwenden Sie exp für die SQL-Fehlerinjektion May 12, 2023 am 10:16 AM

So verwenden Sie exp für die SQL-Fehlerinjektion

PHP-Programmiertipps: So verhindern Sie SQL-Injection-Angriffe PHP-Programmiertipps: So verhindern Sie SQL-Injection-Angriffe Aug 17, 2023 pm 01:49 PM

PHP-Programmiertipps: So verhindern Sie SQL-Injection-Angriffe

Nginx-Grundkenntnisse zur Sicherheit: Verhindern von SQL-Injection-Angriffen Nginx-Grundkenntnisse zur Sicherheit: Verhindern von SQL-Injection-Angriffen Jun 10, 2023 pm 12:31 PM

Nginx-Grundkenntnisse zur Sicherheit: Verhindern von SQL-Injection-Angriffen

So verhindern Sie SQL-Injection-Angriffe mit PHP So verhindern Sie SQL-Injection-Angriffe mit PHP Jun 24, 2023 am 10:31 AM

So verhindern Sie SQL-Injection-Angriffe mit PHP

PHP-Formularfilterung: Verhinderung und Filterung von SQL-Injections PHP-Formularfilterung: Verhinderung und Filterung von SQL-Injections Aug 07, 2023 pm 03:49 PM

PHP-Formularfilterung: Verhinderung und Filterung von SQL-Injections

Laravel-Entwicklungshinweise: Methoden und Techniken zur Verhinderung von SQL-Injection Laravel-Entwicklungshinweise: Methoden und Techniken zur Verhinderung von SQL-Injection Nov 22, 2023 pm 04:56 PM

Laravel-Entwicklungshinweise: Methoden und Techniken zur Verhinderung von SQL-Injection

Erkennung und Reparatur von PHP-SQL-Injection-Schwachstellen Erkennung und Reparatur von PHP-SQL-Injection-Schwachstellen Aug 08, 2023 pm 02:04 PM

Erkennung und Reparatur von PHP-SQL-Injection-Schwachstellen

Gegenmaßnahmen gegen SQL-Injection-Schwachstellen in PHP Gegenmaßnahmen gegen SQL-Injection-Schwachstellen in PHP Aug 09, 2023 pm 03:09 PM

Gegenmaßnahmen gegen SQL-Injection-Schwachstellen in PHP

See all articles