做渗透测试绕不开 sqlmap,做 sqlmap 实战绕不开靶场。很多人学数据库注入时,上来就想着拿真实站点练手,这种心态很危险——技术没练熟,先把自己送进去了。我自己带新人时,一直建议先在本地靶场把流程彻底跑通,再谈下一步。这篇就手把手带你把 sqlmap 数据库注入测试完整过一遍:从靶场环境搭建、常用参数理解到一次完整的拖库实战,再到常见报错排查,全部按实操顺序来。不管你是刚入门的渗透测试学习者,还是想系统整理 sqlmap 使用的工程师,这份教程都能直接照着敲,建议先收藏再慢慢练。
1. 准备动手前,先把靶场搭起来
1.1 选哪个靶场:DVWA、SQLi-Labs 还是 Pikachu
做 sqlmap 练习,第一步不是学命令,而是准备一个安全的靶场。本地靶场的好处是:随便跑、随便炸、坏了重来。常见的选择有三个,各有侧重。
DVWA 适合入门,自带 SQL Injection 模块,难度从 low 到 impossible 分级,还能练登录后的注入场景。SQLi-Labs 是专门为 SQL 注入设计的靶场,关卡很多,从 GET 到 POST、盲注、报错注入、堆叠注入都有,练 sqlmap 最合适。Pikachu 更偏综合,里面也有一整套 SQL 注入练习,界面友好,适合做整体渗透流程练习。
我给新人的建议是首推 SQLi-Labs,因为它每一关都精心设计了不同的注入点,用 sqlmap 跑起来特别能看出命令和参数差异;DVWA 作为辅助,用来练需要登录的注入场景。两者配合,基本覆盖日常百分之八十的注入测试需求。如果你还想做点综合演练,再加一个 Pikachu,三个靶场交替练,sqlmap 的核心用法就稳了。
1.2 用 Docker 快速搭建 SQLi-Labs 和 DVWA
手动下载源码配 Apache、MySQL 比较麻烦,最省事的是用 Docker。只要机器上装了 Docker,几条命令就能把靶场跑起来。下面以 Kali 或任意 Linux 系统为例:
bash复制# 拉取 SQLi-Labs 镜像
docker pull acgpiano/sqli-labs
# 启动容器,把 80 端口映射到本机 8080
docker run -d --name sqli-labs -p 8080:80 acgpiano/sqli-labs
启动后浏览器访问 http://127.0.0.1:8080,就能看到 SQLi-Labs 的首页。先点 “Setup/reset Database for labs” 初始化数据库,然后从 Less-1 开始。这里我特意用 8080 端口而不是 80,是为了避开常见 web 服务占用,也方便映射多个靶场。
DVWA 的搭建稍微复杂一点,因为要同时启动 MySQL 和应用进程。推荐用官方编排文件:
bash复制git clone https://github.com/digininja/DVWA.git
cd DVWA
docker-compose up -d
启动后访问 http://127.0.0.1 或映射端口,默认账号 admin / password。登录后先到 “DVWA Security” 把等级调到 low,再到 SQL Injection 模块做测试。我特别提醒一下:DVWA 也有传统 XAMPP 部署方式,但 Docker 方式不会污染宿主机,重装也干净,适合反复折腾。
1.3 本地环境自检清单
靶场搭建完,先别急着跑 sqlmap。用浏览器手动测一下,确认三件事:页面能不能正常打开,数据库初始化有没有报错;登录类靶场能不能用默认密码进入;以及一个带参数的 URL 是否正常响应。比如 SQLi-Labs 的 http://127.0.0.1:8080/Less-1/?id=1,手动把 id 改成 1',看页面是否出现数据库报错。
第三步很重要,因为 sqlmap 只是自动化工具,它能不能出结果,取决于目标页面有没有可探测的入口。如果手动改参数后页面完全没变化,sqlmap 大概率也会空手而归。这一步也顺便帮你理解“注入点”这个概念:不是所有参数都能注入,要有一点可探测的异常。等这三项都通过了,再开终端敲命令。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. sqlmap 基础原理与关键参数
2.1 sqlmap 到底在干什么
一句话理解 sqlmap:它是一个自动化检测和利用 SQL 注入漏洞的工具。它的核心工作分三步:先对目标 URL 中的参数发送测试载荷,观察响应差异;一旦确认存在注入,继续探测数据库类型、版本,判断注入类型;然后根据注入类型自动选择合适的利用方式,把数据从数据库里一条条“问”出来。
在靶场练习中,你会看到 sqlmap 输出大量像 [INFO] testing connection to the target URL 这样的日志,不用慌,那是它在逐步测试。真正要重点看的输出有三个:Parameter: id (GET) 表示它发现哪个参数可疑;Type: boolean-based blind 表示注入类型
