☰
sqlmap 报错 your sqlmap version is outdated 与 SQL 注入检测参数速查
2026/10/14 14:38:40 网站建设 项目流程

sqlmap 报错 your sqlmap version is outdated 与 SQL 注入检测参数速查

仅供已获得书面授权的安全测试使用。

sqlmap 是开源的 SQL 注入检测与数据提取工具,用 Python 编写,支持 MySQL、PostgreSQL、Microsoft SQL Server、Oracle、SQLite 等主流数据库。它把「判断注入点 → 识别数据库类型 → 枚举库表 → 提取数据」整条链路自动化,另外提供读取目标主机文件与执行系统命令的能力。

跑 sqlmap 时最常撞到的两类报错,一类是版本落后的提示行,一类是在 Kali 上直接用 pip 升级时报externally-managed-environment。这两个都在下面给出处置方法。

报错 your sqlmap version is outdated

执行任何一次扫描,sqlmap 启动时都会检查自身版本,落后时在输出里插一行警告:

[17:12:30] [INFO] testing connection to the target URL [17:12:30] [WARNING] your sqlmap version is outdated

这行只是提示,不影响本次扫描继续跑完。判定本地版本落后多少,看--version的输出版本号:

sqlmap --version # 1.9.11#stable

#stable表示稳定分支。sqlmap 上游稳定版 1.10 于 2026 年 1 月 1 日发布(官方 wiki 的 History 页有记录),此后按 1.10.x 递增。Kali 仓库里的版本通常落后于上游,实测 Kali GNU/Linux Rolling 2025.4 仍是 1.9.11。

报错 error: externally-managed-environment

在 Kali 2024 之后的版本上直接用 pip 升级,会先被 PEP 668 拦下,报错原文:

error: externally-managed-environment × This environment is externally managed ╰─> To install Python packages system-wide, try apt install python3-xyz, where xyz is the package you are trying to install.

原因是 Kali 把系统 Python 标记为「外部管理」,禁止 pip 直接写入系统 site-packages,避免与 apt 管理的包互相覆盖。三种处置方式,按场景选:

# 1) 能走 apt 的,优先走发行版包 sudo apt install sqlmap # 2) 需要上游新版的,装进虚拟环境 python3 -m venv /opt/sqlmap-venv /opt/sqlmap-venv/bin/pip install sqlmap # 3) 明确知道风险、只在本机测试时,加参数放行 pip install sqlmap --upgrade --break-system-packages

第 3 种会绕开系统的保护机制,可能与 apt 装的同名包冲突,只在确认不会破坏系统 Python 的环境里用。想彻底避开版本管理问题,直接拉开发仓库,用源码跑:

git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev python3 sqlmap-dev/sqlmap.py --version

指定目标

  • -u URL:把注入点写在参数值位置
  • -r req.txt:从原始 HTTP 请求文件读取,适合 POST、带 Cookie 或 Token 的接口
  • --forms:自动解析页面表单并逐个测试
  • --crawl=N:从目标 URL 爬取 N 层链接后再测
  • -p param:只测指定参数,跳过其余
  • --data:手动指定 POST 数据

从抓包工具把完整请求导出成 req.txt 再交给-r,能保留认证头与 Cookie,比手工拼-u可靠。排除爬取范围用--crawl-exclude,例如排掉登出链接:

sqlmap -r req.txt --crawl=2 --crawl-exclude="logout" --batch

请求控制

  • --batch:所有交互提问取默认值,脚本化调用必须开
  • --random-agent:每次请求使用随机 User-Agent
  • --proxy=http://ip:port:走代理,便于在抓包工具里观察流量
  • --delay=N:请求间隔秒数,默认 0
  • --timeout=N:单次请求超时,默认 30 秒
  • --retries=N:连接失败重试次数,默认 3
  • --safe-url与--safe-freq:每发 N 次注入请求就访问一次正常地址,降低被 WAF 判定为异常的几率,两个参数必须成对使用
  • --csrf-token与--csrf-url:面向带 CSRF Token 的表单,指定 Token 的参数名与获取页面

--safe-freq单独使用会直接报错,源码里的判定是它必须配合--safe-url或--safe-req。同理--csrf-url、--csrf-method、--csrf-data都依赖--csrf-token,且--csrf-url与--threads不能同时使用。

检测强度

  • --level 1~5:决定测试哪些位置,默认 1
  • --risk 1~3:决定载荷有多激进,默认 1
  • --technique:启用的注入技术集合,默认 BEUSTQ
  • --dbms:指定后端数据库类型,跳过指纹识别
  • --tamper:加载改写脚本,绕过 WAF 特征
  • --threads:最大并发 HTTP 请求数,默认 1
  • --time-sec:时间盲注的判定延迟秒数,默认 5

--technique的字母含义:B 布尔盲注(Boolean-based blind)、E 报错注入(Error-based)、U 联合查询(Union query-based)、S 堆叠查询(Stacked queries)、T 时间盲注(Time-based blind)、Q 内联查询(Inline queries)。收窄字母集能显著减少请求量,例如只留--technique=BEU。其中 T 时间盲注每条请求都要等满--time-sec秒,是最慢的一类。

等级与风险等级影响的是两个不同维度。--level决定测试哪些位置,等级越高,参与注入测试的位置越多,通常从 URL 与 POST 参数扩展到 Cookie、User-Agent、Referer 等请求头;--risk决定载荷有多激进,风险 3 会包含 UPDATE 一类会改写数据的语句。某个等级具体覆盖哪些位置,以 sqlmap 官方 wiki 的 Usage 页为准。

数据提取

  • --dbs:列出数据库名
  • --tables:列出表名
  • --columns:列出字段名
  • --dump:导出表内容
  • -D db -T table -C col:限定到具体库、表、字段
  • --count:只统计行数
  • --exclude-sysdbs:排除系统库
  • --output-dir=DIR:自定义输出目录
  • --flush-session:清除该目标的会话缓存
  • --file-read=FILE:读取后端数据库所在主机的文件
  • --os-shell:尝试获取一个交互式系统 shell

默认输出目录是~/.local/share/sqlmap/output/<host>/,实测该目录位于/root/.local/share/sqlmap,每个目标一个子目录,里面保存注入载荷日志与会话缓存。导出格式默认为 CSV,这一点在源码lib/core/defaults.py的dumpFormat项里可以确认。--file-read与--os-shell已经越过数据库边界,进入目标主机文件系统与命令执行层面,只在授权书明确写了这一层的场景使用。

常用命令

判断注入点并列出库名:

sqlmap -u "https://target.example.com/item.php?id=1" --batch --dbs

--batch让所有交互提问取默认值,不加这个参数,进程会停在提问处不再往下走。

测试 POST 登录接口,从抓包文件读取请求:

sqlmap -r login.txt -p username --level=3 --risk=2 --dbms=mysql --batch

枚举并导出指定表:

sqlmap -u "https://target.example.com/item.php?id=1" \ -D appdb -T users -C username,password --dump --batch

报错注入配合绕过脚本与代理:

sqlmap -u "https://target.example.com/item.php?id=1" \ --technique=E --tamper=space2comment --random-agent \ --proxy=http://127.0.0.1:8080 --threads=4

改了参数但结果没有变化,先清会话缓存:

sqlmap -u "https://target.example.com/item.php?id=1" --flush-session --batch

sqlmap 会按目标缓存测试结论,不清缓存会直接复用上一次的判定结果。

常见运行报错

连接不上目标:

[CRITICAL] unable to connect to the target URL. sqlmap is going to retry the request(s) [CRITICAL] all tested parameters do not appear to be injectable.

第一行是网络层连不上(域名解析、端口不通、被 WAF 拦),第二行才是参数层面没测出注入点。两者容易混看:如果只有第二行、没有第一行,说明请求发出去了、响应也回来了,纯粹是参数不可注入。先确认连通性再怀疑注入点:

curl -s -o /dev/null -w "%{http_code}\n" "https://target.example.com/item.php?id=1"

忘了加 --batch 卡在提问处:

[INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/target.example.com' [WARNING] the web server responded with... do you want to keep testing the others? [y/n]

进程停在[y/n]这类提问上不动,是没加--batch。脚本化调用时必须开这个参数,否则容器里没有交互终端,任务会一直挂住直到超时。

--safe-freq 单独使用直接退出:

[CRITICAL] --safe-freq must be used together with --safe-url or --safe-req

源码里的判定是这两个参数必须成对出现,补上--safe-url即可。

注意事项

  • --batch会替使用者做全部决定,包括在部分分支上选取风险更高的载荷。首次接触的目标建议先用默认的 level 1、risk 1,确认结果后再逐级提高。
  • 提高--level与--risk会成倍增加请求量,带 WAF 或限速的目标容易触发封禁,也可能对业务造成压力。
  • --threads默认是 1。提到 4 以上需要确认目标能承受;时间盲注场景提高并发会互相干扰判定,反而变慢。
  • 不适用边界:sqlmap 不覆盖 NoSQL 注入与业务逻辑越权;堆叠查询(S)在后端驱动只允许单条语句时不可用;接口已强制参数化(预编译语句)时无法产出注入点。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询