返回介绍

常规选项

发布于 2024-06-22 19:17:49 字数 29166 浏览 0 评论 0 收藏 0

译自:General

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

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

选项:-s

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

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

选项:-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 字典),用户可以使用选项 --base64 声明,使 sqlmap 能正确地使用参数值进行测试。

使用例子:(注意: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 的运行,可以强制使用 --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 目标的运行示例:

$ 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(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 目标进行布尔型盲注的例子:

$ 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

经过上面的相关描述,相信你已经熟悉了会话文件的相关概念,值得注意的是,你可以通过选项 --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 目标的例子:

$ 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 应用配置了调试模式,后端 DBMS 的错误信息会在 HTTP 响应请求中显示,sqlmap 会对其进行解析并展示。

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

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

使用此选项,可在(HTTP)请求数据被发送之前先由给定的前处理脚本处理(如微调请求内容)。例如,追加 query 参数到 POST 请求体的前处理脚本如下:

#!/usr/bin/env python

def preprocess(req):
    if req.data:
        req.data += b'&foo=bar'

后处理(响应)

响应:--postprocess

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

#!/usr/bin/env python

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

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

选项:--save

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

更新 sqlmap

开关:--update

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

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文