SQLmap
用法
用法:python sqlmap.py [选项] 选项: -h, --help 显示基本帮助信息并退出 -hh 显示高级帮助信息并退出 --version 显示程序版本的信息并退出 -v VERBOSE 0-6(默认为0-6( 1) 目标: 至少为指定目标提供以下选项 -d DIRECT 直接连接数据库 -u URL, --url=URL 目标 URL(例如:"http://www.site.com/vuln.php?id=1") -l LOGFILE 从 Burp 或 WebScarab 在代理的日志文件中分析目标地址 -m BULKFILE 从文本文件中获取批量目标 -r REQUESTFILE 读取文件 HTTP 请求 -g GOOGLEDORK 使用 Google dork 结果是目标 -c CONFIGFILE 从 INI 在配置文件中加载选项 请求: 以下选项可以指定连接目标地址的方式 --method=METHOD 提供强制使用 HTTP 方法(如:PUT) --data=DATA 使用 POST 发送数据串(例如:"id=1") --param-del=PARA.. 设置参数值分隔符(例如:&) --cookie=COOKIE 指定 HTTP Cookie(例如:"PHPSESSID=a8d127e..") --cookie-del=COO.. 设置 cookie 分隔符(例如:;) --load-cookies=L.. 指定以 Netscape/wget 格式存放 cookies 的文件 --drop-set-cookie 忽略 HTTP 响应中的 Set-Cookie 参数 --user-agent=AGENT 指定 HTTP User-Agent --random-agent 使用随机的 HTTP User-Agent --host=HOST 指定 HTTP Host --referer=REFERER 指定 HTTP Referer -H HEADER, --hea.. 设置额外的 HTTP 头参数(如:"X-Forwarded-For: 127.0.0.1") --headers=HEADERS 设置额外的 HTTP 头参数(如:"Accept-Language: fr\nETag: 123") --auth-type=AUTH.. HTTP 认证方式(Basic,Digest,NTLM 或 PKI) --auth-cred=AUTH.. HTTP 认证凭证(username:password) --auth-file=AUTH.. HTTP 认证 PEM 证书/私钥文件 --ignore-code=IG.. 忽略(有问题)HTTP 错码(如401) --ignore-proxy 忽略系统默认代理设置 --ignore-redirects 忽略重定向尝试 --ignore-timeouts 忽略连接超时 --proxy=PROXY 使用代理连接目标 URL --proxy-cred=PRO.. 使用代理进行认证(username:password) --proxy-file=PRO.. 代理列表从文件中加载 --tor 使用 Tor 匿名网络 --tor-port=TORPORT 设置 Tor 代替代理端口代替默认端口 --tor-type=TORTYPE 设置 Tor 代理方式(HTTP,SOCKS4 或 SOCKS5(默认)) --check-tor 检查是否正确使用 Tor --delay=DELAY 设置每个 HTTP 请求的延迟秒数 --timeout=TIMEOUT 设置连接响应的有效秒(默认为 30) --retries=RETRIES 连接超时重试次数(默认为 3) --randomize=RPARAM 随机更改给定参数值 --safe-url=SAFEURL 可在测试过程中频繁访问和合法 URL 地址(译者注: 当你连续多次访问错误地址时,一些网站会关闭会话连接, 以下请求小节有详细说明) --safe-post=SAFE.. 使用 POST 发送合法数据的方法 --safe-req=SAFER.. 合法加载文件 HTTP 请求 --safe-freq=SAFE.. 每两次访问给定的合法性 URL 只发送测试请求 --skip-urlencode 不对 payload 数据进行 URL 编码 --csrf-token=CSR.. 为反向设置网站 CSRF 攻击的 token --csrf-url=CSRFURL 指定可提取预防措施 CSRF 攻击 token 的 URL --force-ssl 强制使用 SSL/HTTPS --hpp 使用 HTTP 参数污染攻击 --eval=EVALCODE 在发起请求前执行给定的 Python 代码(例如: "import hashlib;id2=hashlib.md5(id).hexdigest()") 优化: 以下选项用于优化 sqlmap 性能 -o 开启所有优化
开关 --predict-output 预测常用请求的输出 --keep-alive 使用持久的 HTTP(S) 连接 --null-connection 仅获取页面大小而非实际的 HTTP 响应 --threads=THREADS 设置 HTTP(S) 请求并发数最大值(默认为 1) 注入: 以下选项用于指定要测试的参数, 提供自定义注入 payloads 和篡改参数的脚本 -p TESTPARAMETER 指定需要测试的参数 --skip=SKIP 指定要跳过的参数 --skip-static 指定跳过非动态参数 --param-exclude=.. 用正则表达式排除参数(例如:"ses") --dbms=DBMS 指定后端 DBMS(Database Management System, 数据库管理系统)类型(例如:MySQL) --dbms-cred=DBMS.. DBMS 认证凭据(username:password) --os=OS 指定后端 DBMS 的操作系统类型 --invalid-bignum 将无效值设置为大数 --invalid-logical 对无效值使用逻辑运算 --invalid-string 对无效值使用随机字符串 --no-cast 关闭 payload 构造机制 --no-escape 关闭字符串转义机制 --prefix=PREFIX 注入 payload 的前缀字符串 --suffix=SUFFIX 注入 payload 的后缀字符串 --tamper=TAMPER 用给定脚本修改注入数据 检测: 以下选项用于自定义检测方式 --level=LEVEL 设置测试等级(1-5,默认为 1) --risk=RISK 设置测试风险等级(1-3,默认为 1) --string=STRING 用于确定查询结果为真时的字符串 --not-string=NOT.. 用于确定查询结果为假时的字符串 --regexp=REGEXP 用于确定查询结果为真时的正则表达式 --code=CODE 用于确定查询结果为真时的 HTTP 状态码 --text-only 只根据页面文本内容对比页面 --titles 只根据页面标题对比页面 技术: 以下选项用于调整特定 SQL 注入技术的测试方法 --technique=TECH 使用的 SQL 注入技术(默认为“BEUSTQ”,译者注: B: Boolean-based blind SQL injection(布尔型盲注) E: Error-based SQL injection(报错型注入) U: UNION query SQL injection(联合查询注入) S: Stacked queries SQL injection(堆叠查询注入) T: Time-based blind SQL injection(时间型盲注) Q: inline Query injection(内联查询注入) --time-sec=TIMESEC 延迟 DBMS 的响应秒数(默认为 5) --union-cols=UCOLS 设置联合查询注入测试的列数目范围 --union-char=UCHAR 用于暴力猜解列数的字符 --union-from=UFROM 设置联合查询注入 FROM 处用到的表 --dns-domain=DNS.. 设置用于 DNS 渗出攻击的域名(译者注: 推荐阅读《在SQL注入中使用DNS获取数据》 http://cb.drops.wiki/drops/tips-5283.html, 在后面的“技术”小节中也有相应解释) --second-url=SEC.. 设置二阶响应的结果显示页面的 URL(译者注: 该选项用于 SQL 二阶注入) --second-req=SEC.. 从文件读取 HTTP 二阶请求 指纹识别: -f, --fingerprint 执行广泛的 DBMS 版本指纹识别 枚举: 以下选项用于获取后端 DBMS 的信息,结构和数据表中的数据。 此外,还可以运行你输入的 SQL 语句 -a, --all 获取所有信息、数据 -b, --banner 获取 DBMS banner --current-user 获取 DBMS 当前用户 --current-db 获取 DBMS 当前数据库 --hostname 获取 DBMS 服务器的主机名 --is-dba 探测 DBMS 当前用户是否为 DBA(数据库管理员) --users 枚举出 DBMS 所有用户 --passwords 枚举出 DBMS 所有用户的密码哈希 --privileges 枚举出 DBMS 所有用户特权级 --roles 枚举出 DBMS 所有用户角色 --dbs 枚举出 DBMS 所有数据库 --tables 枚举出 DBMS 数据库中的所有表 --columns 枚举出 DBMS 表中的所有列 --schema 枚举出 DBMS 所有模式 --count 获取数据表数目 --dump 导出 DBMS 数据库表项 --dump-all 导出所有 DBMS 数据库表项 --search 搜索列,表和/或数据库名 --comments 枚举数据时检查 DBMS 注释 -D DB 指定要枚举的 DBMS 数据库 -T TBL 指定要枚举的 DBMS 数据表 -C COL 指定要枚举的 DBMS 数据列 -X EXCLUDE 指定不枚举的 DBMS 标识符 -U USER 指定枚举的 DBMS 用户 --exclude-sysdbs 枚举所有数据表时,指定排除特定系统数据库 --pivot-column=P.. 指定主列 --where=DUMPWHERE 在转储表时使用 WHERE 条件语句 --start=LIMITSTART 指定要导出的数据表条目开始行数 --stop=LIMITSTOP 指定要导出的数据表条目结束行数 --first=FIRSTCHAR 指定获取返回查询结果的开始字符位 --last=LASTCHAR 指定获取返回查询结果的结束字符位 --sql-query=QUERY 指定要执行的 SQL 语句 --sql-shell 调出交互式 SQL shell --sql-file=SQLFILE 执行文件中的 SQL 语句 暴力破解: 以下选项用于暴力破解测试 --common-tables 检测常见的表名是否存在 --common-columns 检测常用的列名是否存在 用户自定义函数注入: 以下选项用于创建用户自定义函数 --udf-inject 注入用户自定义函数 --shared-lib=SHLIB 共享库的本地路径 访问文件系统: 以下选项用于访问后端 DBMS 的底层文件系统 --file-read=FILE.. 读取后端 DBMS 文件系统中的文件 --file-write=FIL.. 写入到后端 DBMS 文件系统中的文件 --file-dest=FILE.. 使用绝对路径写入到后端 DBMS 中的文件 访问操作系统: 以下选项用于访问后端 DBMS 的底层操作系统 --os-cmd=OSCMD 执行操作系统命令 --os-shell 调出交互式操作系统 shell --os-pwn 调出 OOB shell,Meterpreter 或 VNC --os-smbrelay 一键调出 OOB shell,Meterpreter 或 VNC --os-bof 利用存储过程的缓冲区溢出 --priv-esc 数据库进程用户提权 --msf-path=MSFPATH Metasploit 框架的本地安装路径 --tmp-path=TMPPATH 远程临时文件目录的绝对路径 访问 Windows 注册表: 以下选项用于访问后端 DBMS 的 Windows 注册表 --reg-read 读取一个 Windows 注册表键值 --reg-add 写入一个 Windows 注册表键值数据 --reg-del 删除一个 Windows 注册表键值 --reg-key=REGKEY 指定 Windows 注册表键 --reg-value=REGVAL 指定 Windows 注册表键值 --reg-data=REGDATA 指定 Windows 注册表键值数据 --reg-type=REGTYPE 指定 Windows 注册表键值类型 通用选项: 以下选项用于设置通用的参数 -s SESSIONFILE 从文件(.sqlite)中读入会话信息 -t TRAFFICFILE 保存所有 HTTP 流量记录到指定文本文件 --batch 从不询问用户输入,使用默认配置 --binary-fields=.. 具有二进制值的结果字段(例如:"digest") --check-internet 在访问目标之前检查是否正常连接互联网 --crawl=CRAWLDEPTH 从目标 URL 开始爬取网站 --crawl-exclude=.. 用正则表达式筛选爬取的页面(例如:"logout") --csv-del=CSVDEL 指定输出到 CVS 文件时使用的分隔符(默认为“,”) --charset=CHARSET 指定 SQL 盲注字符集(例如:"0123456789abcdef") --dump-format=DU.. 导出数据的格式(CSV(默认),HTML 或 SQLITE) --encoding=ENCOD.. 指定获取数据时使用的字符编码(例如:GBK) --eta 显示每个结果输出的预计到达时间 --flush-session 清空当前目标的会话文件 --forms 解析并测试目标 URL 的表单 --fresh-queries 忽略存储在会话文件中的查询结果 --har=HARFILE 将所有 HTTP 流量记录到一个 HAR 文件中 --hex 获取数据时使用 hex 转换 --output-dir=OUT.. 自定义输出目录路径 --parse-errors 从响应中解析并显示 DBMS 错误信息 --preprocess=PRE.. 使用给定脚本预处理响应数据 --repair 重新导出具有未知字符的数据(?) --save=SAVECONFIG 将选项设置保存到一个 INI 配置文件 --scope=SCOPE 用正则表达式从提供的代理日志中过滤目标 --test-filter=TE.. 根据 payloads 和/或标题(例如:ROW)选择测试 --test-skip=TEST.. 根据 payloads 和/或标题(例如:BENCHMARK)跳过部分测试 --update 更新 sqlmap 杂项: -z MNEMONICS 使用短助记符(例如:“flu,bat,ban,tec=EU”) --alert=ALERT 在找到 SQL 注入时运行 OS 命令 --answers=ANSWERS 设置预定义回答(例如:“quit=N,follow=N”) --beep 出现问题提醒或在发现 SQL 注入时发出提示音 --cleanup 指定移除 DBMS 中的特定的 UDF 或者数据表 --dependencies 检查 sqlmap 缺少(可选)的依赖 --disable-coloring 关闭彩色控制台输出 --gpage=GOOGLEPAGE 指定页码使用 Google dork 结果 --identify-waf 针对 WAF/IPS 防护进行彻底的测试 --mobile 使用 HTTP User-Agent 模仿智能手机 --offline 在离线模式下工作(仅使用会话数据) --purge 安全删除 sqlmap data 目录所有内容 --skip-waf 跳过启发式检测 WAF/IPS 防护 --smart 只有在使用启发式检测时才进行彻底的测试 --sqlmap-shell 调出交互式 sqlmap shell --tmp-dir=TMPDIR 指定用于存储临时文件的本地目录 --web-root=WEBROOT 指定 Web 服务器根目录(例如:"/var/www") --wizard 适合初级用户的向导界面
输出详细等级
选项:-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 请求的日志文件。
从远程站点地图(.xml)解析目标
选项:-x
通过站点地图,站点管理者可以列出网站的所有页面位置,用于告知搜索引擎站点的内容结构。你可以使用选项 -x
提供站点地图地址给 sqlmap(例如:-x http://www.target.com/sitemap.xml
)以搜寻可用的目标 URLs。
从给定的文本文件读取多个目标进行扫描
选项:-m
通过文本文件提供一个目标 URLs 列表,sqlmap 会逐个进行扫描检测。
样本文件所提供的 URLs 列表示例:
www.target1.com/vuln1.php?q=foobar
www.target2.com/vuln2.asp?id=1
www.target3.com/vuln3/id/1*
从文件中载入 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
设置为 或更高,则 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 401(未授权)错误
开关 --ignore-401
如果你测试的目标站点偶尔会返回 HTTP 401(未授权)错误,而你想忽略它,不提供正确的凭据并继续测试,你可以使用开关--ignore-401
来关闭对应的出错提醒。
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
参数值。[
](https://octobug.gitbooks.io/sqlmap-wiki-zhcn/content/Users-manual/Usage/Request.html)
优化
下面的开关可以用于优化 sqlmap 的性能表现。
批量优化
开关:-o
设置这个开关表示隐含开启下面对应的选项和开关:
--keep-alive
--null-connection
--threads=3
默认值,可以设置更大值。
查看下面内容获取更多关于开关设置的详情。
输出预测
开关:--predict-output
这个开关用于推导算法,可对获取的数据特性进行线性数据分析预测。根据 txt/common-outputs.txt
里面的条目及集合论相关知识预测并给出可能性最高的字符数理统计表。如果目标字符值可以在最常见的输出结果中找到,那么接下来的字符数理统计表范围会逐渐缩小。配合从 DBMS 中获取的实例、表名和对应的权限,那么加速效果会显著提高。当然,你可以根据自身需求对常见的输出文件进行编辑,例如,你发现了数据库表名的常见模式或者其他模式。
值得注意的是,这个开关不能够和 --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 类型
选项:--dbms
默认情况下 sqlmap 会自动检测 Web 应用程序的后端 DBMS。sqlmap 完全支持以下数据库管理系统:
- MySQL
- Oracle
- PostgreSQL
- Microsoft SQL Server
- Microsoft Access
- IBM DB2
- SQLite
- Firebird
- Sybase
- SAP MaxDB
- HSQLDB
- Informix
如果由于某些原因 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