sqlmap

sqlmap 是一款开源的自动化 SQL 注入检测与利用工具,支持多种数据库与注入方式,常用于 Web 安全测试与渗透。


命令行用法概览

用法: python sqlmap.py [选项]

查看简要帮助:sqlmap -h
查看完整帮助:sqlmap -hh
查看版本:sqlmap --version
输出详细度:-v 0-6(默认 1,数字越大输出越详细)


目标(Target)

至少需要指定下列之一来定义目标:

选项说明
-u URL / --url=URL目标 URL(如 http://www.site.com/vuln.php?id=1
-d DIRECT直连数据库的连接字符串
-l LOGFILE从 Burp/WebScarab 代理日志中解析目标 URL
-m BULKFILE从文本文件中读取多个目标 URL 进行扫描
-r REQUESTFILE从文件加载原始 HTTP 请求
-g GOOGLEDORK将 Google dork 结果作为目标 URL 进行测试
-c CONFIGFILE从 INI 配置文件加载选项

请求(Request)

控制如何与目标 URL 通信:

选项说明
-A / --user-agent自定义 HTTP User-Agent
-H / --header额外请求头(如 X-Forwarded-For: 127.0.0.1
--method=METHOD强制使用指定 HTTP 方法(如 PUT)
--data=DATAPOST 提交的数据(如 id=1
--param-del=CHAR参数分隔符(默认 GET/POST 为 &
--cookie=COOKIECookie 头内容
--cookie-del=CHARCookie 内键值分隔符(默认 ;
--random-agent随机选择 User-Agent
--proxy=PROXY使用 HTTP(S) 代理(如 http://127.0.0.1:8080
--tor使用 Tor 代理
--delay=SECONDS每次请求之间的延迟(秒)
--timeout=SECONDS连接超时时间(默认 30)
--retries=RETRIES超时重试次数(默认 3)
--force-ssl强制使用 HTTPS

优化(Optimization)

选项说明
-o开启常用优化(keep-alive、null-connection、threads=3)
--keep-alive使用持久连接
--null-connection仅获取响应长度、不取正文(盲注时省带宽)
--threads=THREADS最大并发请求数(默认 1,最大 10)

注入(Injection)

选项说明
-p TESTPARAMETER指定要测试的参数(逗号分隔)
--skip=PARAM跳过对某参数的测试
--dbms=DBMS指定后端数据库类型(如 MySQL、Oracle)
--os=OS指定后端操作系统(Linux/Windows)
--prefix=PREFIX注入载荷的前缀
--suffix=SUFFIX注入载荷的后缀
--tamper=TAMPER使用的 tamper 脚本(逗号分隔,见 tamper/ 目录)

检测(Detection)

选项说明
--level=LEVEL测试深度 1–5(默认 1,越高测试越多)
--risk=RISK风险等级 1–3(默认 1,3 会测 OR 等高风险载荷)
--string=STRING布尔盲注为 True 时页面应包含的字符串
--not-string=NOTSTRING布尔盲注为 False 时页面应包含的字符串
--regexp=REGEXP用正则匹配 True 响应
--code=CODE用 HTTP 状态码判断 True(如 --code=200
--smart启发式:只对“像有注入”的参数做完整测试

技术(Techniques)

选项说明
--technique=TECH要使用的注入技术字母组合,默认 BEUSTQ
B 布尔盲注 E 报错 U UNION S 堆叠 T 时间盲注 Q 内联
--time-sec=SEC时间盲注的延迟秒数(默认 5)
--union-cols=MIN-MAXUNION 测试列数范围(如 12-16
--union-char=CHARUNION 测试时填充列用的字符(默认 NULL)
--dns-domain=DOMAINDNS 外带攻击时你控制的域名

指纹与枚举(Fingerprint & Enumeration)

选项说明
-f / --fingerprint详细指纹识别 DBMS 版本
-b / --banner获取 DBMS 版本信息
--current-user当前数据库用户
--current-db当前数据库名
--hostname数据库服务器主机名
--is-dba当前用户是否为 DBA
--users枚举数据库用户
--passwords枚举用户密码哈希(可字典破解)
--privileges枚举用户权限
--dbs枚举数据库列表
--tables枚举表(需配合 -D 指定库)
--columns枚举列(需配合 -D -T
--schema导出库/表/列结构
--count仅统计表行数
--dump导出表数据(需 -T,可选 -D -C
--dump-all导出所有可访问表数据
-D DB指定数据库名
-T TBL指定表名
-C COL指定列名(逗号分隔)
--exclude-sysdbs枚举时排除系统库
--where=DUMPWHERE导出时附加 WHERE 条件
--start=L / --stop=L导出起始/结束行
--sql-query=QUERY执行自定义 SQL
--sql-shell交互式 SQL 外壳

文件与系统(File & OS)

选项说明
--file-read=FILE读取数据库服务器上的文件
--file-write=F local上传本地文件到服务器
--file-dest=F remote远程写入路径(与 --file-write 配合)
--os-cmd=CMD执行系统命令
--os-shell获取交互式系统 Shell

通用(General)

选项说明
-s SESSIONFILE从 .sqlite 会话文件恢复
-t TRAFFICFILE将 HTTP 流量记录到文本文件
--batch非交互模式,一律用默认选择
--answers=ANSWERS预设答案(如 quit=N,follow=N
--flush-session清空当前目标的会话缓存
--fresh-queries忽略会话中已缓存的查询结果
--output-dir=DIR自定义输出目录
--save=CONFIG将当前选项保存为 INI 配置
-c CONFIGFILE从 INI 文件加载选项

常用示例

# 检测 GET 参数注入
sqlmap -u "http://target.com/page?id=1"

# 指定参数、数据库类型,并取 banner
sqlmap -u "http://target.com/page?id=1" -p id --dbms=mysql -b

# POST 注入,带 Cookie
sqlmap -u "http://target.com/login" --data="user=admin&pass=123" --cookie="session=xxx" -p user,pass

# 从 Burp 保存的请求文件扫描
sqlmap -r request.txt

# 枚举库、表,并导出指定表
sqlmap -u "http://target.com/page?id=1" --dbs
sqlmap -u "http://target.com/page?id=1" -D 库名 --tables
sqlmap -u "http://target.com/page?id=1" -D 库名 -T 表名 --dump

# 仅使用 UNION 与报错,加快测试
sqlmap -u "http://target.com/page?id=1" --technique=EU --batch

完整选项列表请执行 sqlmap -hh 或查阅 官方 Usage 文档