常规选项

译自:General

下面的选项用于设置 sqlmap 的常规参数。

从已存储(.sqlite)文件读取会话

选项:-s

sqlmap 会在专用的输出目录中自动为每一个目标分别建立持久会话 SQLite 文件,该文件会存储用于恢复会话的所有数据。如果用户需要指定会话文件的具体存储位置(例如:将所有目标的会话数据存储在同一个位置),则可以使用这个选项。

记录 HTTP(s) 访问信息到文本文件

选项:-t

这个选项需要一个指定文本文件地址的参数,用于写入 sqlmap 产生的所有 HTTP(s) 流量信息——包括 HTTP(S) 请求 和 HTTP(S) 响应。

这个选项主要用于调试——当你向开发人员提供潜在 bug 报告时,可把这个文件一并带上。

以非交互式模式运行

开关:--batch

当你需要以批处理模式运行 sqlmap,避免任何用户干预 sqlmap 的运行,可以强制使用 --batch 这个开关。这样,当 sqlmap 需要用户输入信息时,都将会以默认参数运行。

二进制内容检索

选项:--binary-fields

为了便于检索存储二进制数值(例如:数据列 password 存储了密码哈希值二进制数据)的数据表字段的内容,可使用 --binary-fields 选项对该数据列进行(额外)适当处理。所有的这些数据域(例如:数据表的列)都将被取出并以十六进制格式展示,便于后续被其他工具(例如:john)处理。

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

选项:--charset

在布尔型盲注(Boolean-based blind)和时间型盲注(Time-based blind)中,用户可以强制使用自定义字符集来加快数据检索过程。例如,在导出消息摘要值(例如:SHA1)时,通过使用(例如)--charset="0123456789abcdef",预期的请求数比常规运行大约少 30%。

从目标 URL 开始爬取站点

选项:--crawl

sqlmap 可以从给定的目标站点开始收集(抓取)存在潜在漏洞的链接。使用这个选项可以设置爬取的深度(到起始位置的距离),这样 sqlmap 爬取到对应深度就不会继续进行。

针对 MySQL 目标的运行示例:

  1. $ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/" --batch --crawl=3
  2. [...]
  3. [xx:xx:53] [INFO] starting crawler
  4. [xx:xx:53] [INFO] searching for links with depth 1
  5. [xx:xx:53] [WARNING] running in a single-thread mode. This could take a while
  6. [xx:xx:53] [INFO] searching for links with depth 2
  7. [xx:xx:54] [INFO] heuristics detected web page charset 'ascii'
  8. [xx:xx:00] [INFO] 42/56 links visited (75%)
  9. [...]

选项:--crawl-exclude

使用这个选项可以通过正则表达式来排除不想抓取的页面。例如,如果你想要跳过所有包含 logout 关键字的链接,你可以使用 --crawl-exclude=logout

指定 CSV 输出的分隔符

选项:--csv-del

当导出数据到 CSV 格式文件(--dump-format=CSV),数据条目需要使用“分隔符”(默认为 ,)进行划分。如果用户想要覆盖默认分隔符,可以使用这个选项(例如:--csv-del=";")。

DBMS(Database Management System,数据库管理系统)认证凭证

选项:--dbms-cred

某些情况下,用户可能会因为当前 DBMS 用户的权限问题而导致操作失败,这时就可以使用这个选项。在这种情景下,如果用户使用这个选项来 admin 用户凭证,sqlmap 会尝试使用相应的认证信息与“以其他身份运行”机制(例如:Microsoft SQL Server 的 OPENROWSET)来重新运行。

导出数据的格式

选项:--dump-format

当导出数据表数据到输出目录的相应文件时,sqlmap 支持三种不同的数据导出格式:CSVHTMLSQLITE。默认的输出格式是 CSV,每一条数据以 ,(或者使用 --csv-del 指定其他符号)为分隔符逐行存储到文本文件中。如果是使用 HTML 格式,则输出会被存储为 HTML 文件,每行数据会被存储为表格的一行到 HTML 文件中。如果是使用 SQLITE,数据则会被存储到 SQLITE 数据库,原先的数据表会被转换成具有相同名字的 SQLITE 数据表。

强制指定检索数据编码

选项:--encoding

为了对字符数据进行合理的编码,sqlmap 使用从 Web 服务器提供的信息(例如:HTTP 请求头 Content-Type),或是使用第三方库 chardet 进行推导。

尽管如此,有时候还是需要对编码进行指定,特别是当获取的数据包含国际化的非 ASCII 字符时(例如:encoding=GBK)。同时,需要注意的是,如果目标机器数据库存储的数据内容与数据库连接器编码不兼容,则会不可逆转地出现编码信息丢失的情况。

预估完成时间

开关:--eta

sqlmap 支持实时计算并显示获取查询结果的预估时间。如果使用的技术是任意一种 SQL 盲注,则会显示获取输出的时间。

针对 Oracle 目标进行布尔型盲注的例子:

  1. $ python sqlmap.py -u "http://192.168.136.131/sqlmap/oracle/get_int_bool.php?id\
  2. =1" -b --eta
  3. [...]
  4. [hh:mm:01] [INFO] the back-end DBMS is Oracle
  5. [hh:mm:01] [INFO] fetching banner
  6. [hh:mm:01] [INFO] retrieving the length of query output
  7. [hh:mm:01] [INFO] retrieved: 64
  8. 17% [========> ] 11/64 ETA 00:19

接着:

  1. 100% [===================================================] 64/64
  2. [hh:mm:53] [INFO] retrieved: Oracle Database 10g Enterprise Edition Release 10.2
  3. .0.1.0 - Prod
  4. web application technology: PHP 5.2.6, Apache 2.2.9
  5. back-end DBMS: Oracle
  6. banner: 'Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod'

从上面可以看出,sqlmap 会先计算出查询结果的长度,然后预估完成的时间,并显示出完成的百分比及接收到的字符数。

清空会话文件

选项:--flush-session

经过上面的相关描述,相信你已经熟悉了会话文件的相关概念,值得注意的是,你可以通过选项 --flush-session 来清空会话文件内容。这样你可以避免 sqlmap 默认的缓存机制。也可以手动移除相关的会话文件。

解析并测试表单输入域

开关:--forms

例如你需要针对_搜索框_进行 SQL 注入测试,或者你想绕过登录验证(通常是 usernamepassword 两个输入框),你可以通过给 sqlmap 传入请求文件(-r),并设置好(--data)相关的提交数据,或者直接让 sqlmap 自动为你完成相关操作。

上面提及的两个实例,及其他 HTML 响应体中出现的 <form><input> 标签,都可以使用这个开关。

配合存在表单的目标 URL(-u)使用 sqlmap 的 --forms 开关,sqlmap 会自动为你请求对应目标 URL,解析相关的表单,并引导你基于表单输入域(参数)而非提供的目标 URL 进行 SQL 注入测试。

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

开关:--fresh-queries

经过上面的描述,相信你已经熟悉了会话文件的概念,值得注意的是,你可以使用--fresh-queries 这个开关忽略指定的会话文件。这样你就可以保持某次运行的特定会话文件内容不被修改,从而避免查询结果的重复尝试/恢复。

使用 DBMS hex 函数获取数据

开关:--hex

很多情况下,获取非 ASCII 数据都会有特殊要求。其中一个解决方案就是使用 DBMS hex 函数。开启这个开关,数据在被获取之前,会被编码成十六进制格式,并在随后被解码成原先的格式。

针对 PostgreSQL 目标的例子:

  1. $ python sqlmap.py -u "http://192.168.48.130/sqlmap/pgsql/get_int.php?id=1" --b\
  2. anner --hex -v 3 --parse-errors
  3. [...]
  4. [xx:xx:14] [INFO] fetching banner
  5. [xx:xx:14] [PAYLOAD] 1 AND 5849=CAST((CHR(58)||CHR(118)||CHR(116)||CHR(106)||CHR
  6. (58))||(ENCODE(CONVERT_TO((COALESCE(CAST(VERSION() AS CHARACTER(10000)),(CHR(32)
  7. ))),(CHR(85)||CHR(84)||CHR(70)||CHR(56))),(CHR(72)||CHR(69)||CHR(88))))::text||(
  8. CHR(58)||CHR(110)||CHR(120)||CHR(98)||CHR(58)) AS NUMERIC)
  9. [xx:xx:15] [INFO] parsed error message: 'pg_query() [<a href='function.pg-query'
  10. >function.pg-query</a>]: Query failed: ERROR: invalid input syntax for type num
  11. eric: ":vtj:506f737467726553514c20382e332e39206f6e20693438362d70632d6c696e75782d
  12. 676e752c20636f6d70696c656420627920474343206763632d342e332e7265616c20284465626961
  13. 6e2032e332e322d312e312920342e332e32:nxb:" in <b>/var/www/sqlmap/libs/pgsql.inc.p
  14. hp</b> on line <b>35</b>'
  15. [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
  16. [...]

指定输出目录路径

选项:--output-dir

默认情况下,sqlmap 会将会话和结果文件存储在命名为 output 的子目录中。如果你想要使用不同的存储位置,可以用这个选项(例如:--output-dir=/tmp)。

从响应页面中解析 DBMS 错误信息

开关:--parse-errors

如果 Web 应用配置了调试模式,后端 DBMS 的错误信息会在 HTTP 响应请求中显示,sqlmap 会对其进行解析并展示。

这个特性对调试非常有用,例如可以用来理解为什么特定枚举或接管开关会失效——可能是会话用户出现权限问题,在这种情况下,你可以看到 Access denied for user <SESSION USER>(拒绝用户<会话用户>访问)的 DBMS 错误信息。

针对 Microsoft SQL Server 目标的例子:

  1. $ python sqlmap.py -u "http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1"\
  2. --parse-errors
  3. [...]
  4. [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
  5. e rangefor current UNION query injection technique test
  6. [xx:xx:17] [INFO] parsed error message: 'Microsoft OLE DB Provider for ODBC Driv
  7. ers (0x80040E14)
  8. [Microsoft][ODBC SQL Server Driver][SQL Server]The ORDER BY position number 10 i
  9. s out of range of the number of items in the select list.
  10. <b>/sqlmap/mssql/iis/get_int.asp, line 27</b>'
  11. [xx:xx:17] [INFO] parsed error message: 'Microsoft OLE DB Provider for ODBC Driv
  12. ers (0x80040E14)
  13. [Microsoft][ODBC SQL Server Driver][SQL Server]The ORDER BY position number 6 is
  14. out of range of the number of items in the select list.
  15. <b>/sqlmap/mssql/iis/get_int.asp, line 27</b>'
  16. [xx:xx:17] [INFO] parsed error message: 'Microsoft OLE DB Provider for ODBC Driv
  17. ers (0x80040E14)
  18. [Microsoft][ODBC SQL Server Driver][SQL Server]The ORDER BY position number 4 is
  19. out of range of the number of items in the select list.
  20. <b>/sqlmap/mssql/iis/get_int.asp, line 27</b>'
  21. [xx:xx:17] [INFO] target URL appears to have 3 columns in query
  22. [...]

预处理响应数据

选项:--preprocess

使用此选项可在 sqlmap 检测引擎工作之前对(HTTP)响应数据使用预处理脚本(例如,解码数据或删除无用数据)。例如,将所有小写字符转换为大写的预处理脚本可以是:

  1. #!/usr/bin/env python#!/usr/bin/env
  2. def preprocess(page, headers=None, code=None):
  3. return page.upper() if page else page, headers, code

保存相关选项到 INI 配置文件

选项:--save

使用此开关可以将命令行上的相关选项保存到 INI 配置文件中。同时可以通过以上描述的 -c 选项对生成的文件进行编辑。

更新 sqlmap

开关:--update

使用此开关,你可以直接从 Git 仓库 将该工具升级到最新的开发版本。当然,网络连接必不可少。

当然,如果上面的操作失败,你可以直接在 sqlmap 所在目录运行 git pull。这样的执行效果和使用开关 --update 一样。如果你是在 Windows 上使用 sqlmap,可以使用 SmartGit 客户端。

在向邮件列表反馈任何潜在 bug 之前,强烈建议先尝试上面描述的方法。