盲注

页面没有错误回显,不知道数据库具体返回值的情况下,对数据库中的内容进行猜解,实行SQL注入被称为盲注。常见的盲注的分类有三种

  • 布尔盲注
  • 时间盲注
  • 报错盲注

使用盲注的情况该为如下情况

  1. 页面没有回显位
  2. 页面没有报错

布尔盲注

而且使用布尔盲注的情况除了需要满足前面两种情况外,还需要满足页面会返回真假两种状态。布尔注入就是利用页面返回不同,逐个猜解数据。

什么叫真假状态呢?

真假状态

真假状态指的就是页面只有查询成功和查询不成功两种界面,没有别的回显示。

如下例子

image-20230412011301475 image-20230412011248055

在这个例子中,页面只有查询到和查询不到两种结果,即使是第二种能使得查询报错的用法也只能让页面没有任何回显。

而布尔盲注就是利用页面返回的不同,逐个猜解数据。由于布尔盲注工作量比较大,往往的我们都是使用自动化工具去完成操作,手动注入并不多,学习的目的是为了如果碰到网站真实存在这种注入,但需要我们手动注入来尝试绕过对方WAF再编写自动化工具注入的情况。

布尔盲注的条件

一般而言,我们可以尝试1=11=2来判断页面是否存在注入的条件

页面为真:

image-20230412012101381

页面为假:

image-20230412012127770

一旦判断得到页面存在真假两种情况,就可以使用布尔盲注

关键函数

  • 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

  1. 尝试'闭合:直接报错,排除

    image-20230413234431508
  2. 尝试"闭合,回显为真;使用and 1=2判断是否为真闭合,结果为真,证明为假闭合

    image-20230413234711918 image-20230413234731840
  3. 尝试')闭合,直接报错,排除

  4. 尝试'))闭合,回显为真;使用and 1=2判断是否为真闭合,报错,证明'))为闭合方式

    image-20230413234933209

时间盲注

使用条件

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

同样是逐一猜字母判断,使用二分法进行猜解,只不过猜解正确与否页面是否有回显变成了页面是否延迟返回

查看页面响应时间长度可以在开发者工具->网络里面查看到响应时间长短。