SQL注入(7):布尔盲注、时间盲注
盲注
页面没有错误回显,不知道数据库具体返回值的情况下,对数据库中的内容进行猜解,实行SQL注入被称为盲注。常见的盲注的分类有三种
- 布尔盲注
- 时间盲注
- 报错盲注
使用盲注的情况该为如下情况
- 页面没有回显位
- 页面没有报错
布尔盲注
而且使用布尔盲注的情况除了需要满足前面两种情况外,还需要满足页面会返回真假两种状态。布尔注入就是利用页面返回不同,逐个猜解数据。
什么叫真假状态呢?
真假状态
真假状态指的就是页面只有查询成功和查询不成功两种界面,没有别的回显示。
如下例子
在这个例子中,页面只有查询到和查询不到两种结果,即使是第二种能使得查询报错的用法也只能让页面没有任何回显。
而布尔盲注就是利用页面返回的不同,逐个猜解数据。由于布尔盲注工作量比较大,往往的我们都是使用自动化工具去完成操作,手动注入并不多,学习的目的是为了如果碰到网站真实存在这种注入,但需要我们手动注入来尝试绕过对方WAF再编写自动化工具注入的情况。
布尔盲注的条件
一般而言,我们可以尝试1=1
和1=2
来判断页面是否存在注入的条件
页面为真:
页面为假:
一旦判断得到页面存在真假两种情况,就可以使用布尔盲注
关键函数
-
ascii()
将字母、字符转换为ascii码;方便我们进行将结果转换成数字进行大小比大小的一个比较,以此来利用页面真假值。可以利用大于>
等比较符进行二分法猜解。 -
substr([字符串],start,num)
将[字符串]从第start
个字符,提取num
个字符;由于ascii()只能转换一个字符,因此用于配合ascii()逐个字符猜出查询内容。1
ascii(substr((select database()),1,1) > 100
配合
limit start,num
来限定查询的行数 -
limit start,num
从第start
行开始,显示num
行
注入方式
通常使用二分法,逐一猜解查询结果。一般我们都是通过编写脚本的方式来进行猜解。很少会使用手工注入的方式利用布尔盲注。
1 | ?id=1' and ascii(substr('abcd',1,1))>100 --+ |
将abcd转换为查询语句即可。若有多行返回结果的查询,使用limit 0,1
进行限定返回的行数。
闭合符判断
由于布尔盲注只有真假两种情况,因此我们需要逐一尝试闭合方式。例如less-7
-
尝试
'
闭合:直接报错,排除 -
尝试
"
闭合,回显为真;使用and 1=2
判断是否为真闭合,结果为真,证明为假闭合 -
尝试
')
闭合,直接报错,排除 -
尝试
'))
闭合,回显为真;使用and 1=2
判断是否为真闭合,报错,证明'))
为闭合方式
时间盲注
使用条件
Web页面只返回一个正常页面。利用页面响应事件不同,逐个猜解数据。
(前提是数据库会执行命令代码,只是不反馈页面信息)
关键函数
-
sleep()
:参数为休眠的时长,以秒为单位。作用是让数据库查询后延迟几秒返回。利用方式:是否延迟返回页面可以判断是否执行成功。
-
if()
:参数有三个condition,true,false
,分别是判断条件、条件为真时返回的值、条件为假时返回的值利用方式:
select if(1=1, sleep(0), sleep(3))
1=1为真,休眠0s
注入方式
时间盲注和布尔注入非常相似,只不过布尔注入是通过页面真假值判断,而时间注入是通过返回的时间进行判断猜解正确与否。
举一个查询语句的例子就很好理解我们的注入方式
1 | select if(ascii(substr((select database),1,1))>100, sleep(0), sleep(3)); |
同样是逐一猜字母判断,使用二分法进行猜解,只不过猜解正确与否
从页面是否有回显
变成了页面是否延迟返回
。
查看页面响应时间长度可以在开发者工具->网络
里面查看到响应时间长短。