详细输出等级
选项:-v
该选项用于设置输出信息的详细级别等级。默认等级为 ,输出包括普通信息、警告、错误、关键信息和 Python 错误回复信息(如有)。
- :只输出 Python 错误回溯信息、错误和关键信息。
- :增加普通信息和警告信息的输出。
- :增加输出调试信息。
- :注入增加输出 payloads。
- :增加输出 HTTP 请求。
- :增加输出 HTTP 响应头
- :增加输出 HTTP 响应内容。
使用等级 能更好地理解 sqlmap 特别是在检测阶段和使用接管功能时,内部实现了什么。如果你想知道的话 sqlmap 发送了什么 SQL payloads,等级 这是最好的选择。为开发者系统提供潜在的潜力 Bug 在报告中,建议使用此级别并添加选项 -t
流量日志文件标准输出文件生成。
潜在的检测需要更深入的检测 Bugs 建议使用或处理未知情况时使用 或以上等级。请注意,您也可以使用该选项的短名来设置详细的等级,其中提供的开关(而不是选项)使用字母 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 数据中的 &
),以便 sqmap 能够正确切割并处理每个参数。
例如:
$ 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
设置为 或更高,则 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
设置为 或以上,sqlmap 会对 HTTP User-Agent
请求头进行 SQL 注入测试。详情请看下文。
HTTP Host
请求头
选项:--host
你可以手动设置 HTTP Host
请求头值。默认情况下,HTTP Host
请求头从提供的目标 URL 中解析。
注意,如果 --level
设置为 或以上,sqlmap 会对 HTTP User-Agent
请求头进行 SQL 注入测试。详情请看下文。
HTTP Referer
请求头
选项:--referer
支持伪造 HTTP Referer
请求头值。如果进行显式设置,默认情况下不会在 HTTP 请求中发送 HTTP Referer
请求头。
注意,如果 --level
设置为 或更高,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 表示十秒半。默认设置是 。
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 最大的并发请求数只能设置到 。
值得注意的是,这个选项不能跟 --predict-output
一起使用。
注入
以下选项用于指定需要测试的参数、提供自定义注入 payloads 和可选篡改脚本。
可测试参数
选项:-p
,--skip
和 --param-exclude
默认情况下 sqlmap 会测试所有 GET 参数和 POST 参数。当 --level
的值 >= ,它还会测试 HTTP Cookie
头部值。当这个值 >= 时,它还会测试 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
使用这个选项需要给出一个参数用于指定即将进行检测的级别。总共有个级别。默认的级别是 ,该级别只会进行简单的检测(请求)。与之不同的是,级别 会更详细地对更大范围 payloads 和 boundaries(作为 SQL payload 的前缀和后缀)进行检测。sqlmap 使用的 payloads 直接从文本文件 xml/payloads.xml
中载入。根据该文件顶部的相关指导说明进行设置,如果 sqlmap 漏过了特定的注入,你可以选择自己修改指定的 payload 用于检测。
这个选项设置不止会影响 sqlmap 使用的 payload,还会影响到相关的测试注入点:测试 GET 和 POST 的相关参数,级别大于等于 则会测试 HTTP Cookie 头部,级别大于等于 则会测试 HTTP UserAgent/Referer 头部值。
总而言之, 如果 SQL 注入检测的难度越高,则需要设定越高的 --level
值。
强烈建议在向 sqlmap 邮件列表反馈 sqlmap 无法检测到特定类型的注入之前,尝试设定一个更高的 --level
值用于检测。
风险
选项:--risk
这个选项需要给出一个参数用于指定即将进行检测的风险程度。总共有个风险级别。默认的级别是 ,对大多数 SQL 注入点而言是没有任何风险的。风险级别 则会在默认的检测上添加大量时间型盲注(Time-based blind)语句测试,级别 则会在原基础上添加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
提供一个整数,可以设置时间型盲注响应的延迟时间。默认情况下,它的值为 。
指定联合查询注入中的列数
选项:--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 就要求使用