请求

译自:Request

以下选项用于指定如何连接目标 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

选项和开关:--cookie--cookie-del--live-cookies--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 请求。

选项 --live-cookies 可用于提供一个 cookies 文件,该文件可用于加载最新的 cookies 值。这意味着它会在每个请求发起之前被读取,以获取最新的 HTTP Cookie 头部。

还有一个选项 --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 参数值。

最后更新于

Translated by kvko.live © Since 2016