Web 安全实战:DVWA Low 级别手工检测 SQL 注入完整教程(原理 + 实操分步详解)
Web 安全实战:DVWA Low 级别手工检测 SQL 注入完整教程(原理 + 实操分步详解)
文章前言
SQL 注入(SQLi)是 Web 安全中最经典、危害最高的高危漏洞之一,大量企业站点、管理后台曾因未过滤用户输入,导致数据库脱库、数据篡改、服务器沦陷等严重安全事故。 很多新手入门 SQL 注入时,直接上手工具扫描,忽略手工判断注入点的核心思路。本文依托 DVWA 靶场 Low 安全等级,从零演示纯手工识别、验证、利用 SQL 注入漏洞全流程,拆解底层 SQL 语句原理,适合 Web 安全入门、渗透测试实训、网络安全课程作业使用,步骤可复现,附完整实验截图与原理剖析。
实验环境:DVWA 1.10 + PHP + MySQL;安全级别:Low(无输入过滤,最适合新手理解注入逻辑)
一、SQL 注入漏洞基础原理
1.1 漏洞产生根源
Web 程序接收用户可控输入(URL 参数、表单、Cookie 等),未做过滤、转义、预处理,直接拼接进 SQL 查询语句执行,攻击者可通过特殊字符破坏原有 SQL 语句逻辑,篡改查询逻辑。
DVWA Low 等级后端核心查询代码(PHP):
php
运行
$query = "SELECT * FROM users WHERE id='" . $_GET['id'] . "'";代码直接读取 URL 传入的id参数,原样拼接进 SQL,无任何防护,是典型的危险写法。
1.2 单引号为什么是注入判断核心标识
MySQL 中字符串使用单引号'包裹,当输入'会提前闭合原有 SQL 语句的引号,造成语法报错;输入成对''可抵消引号破坏,消除报错,以此判断页面是否存在注入点。
二、实验前置准备
- 启动 DVWA 靶场,登录管理员账号
- 左侧导航切换至
Setup / Reset DB重置数据库 - 进入
DVWA Security,将安全级别调整为Low并提交 - 切换到
SQL Injection功能页面,进入实验靶点
三、分步手工识别 SQL 注入(完整实操)
步骤 1:测试页面正常查询逻辑
在User ID输入框输入数字1,点击Submit提交。 页面返回:ID=1,用户名 admin,姓氏 admin。 底层执行 SQL:
sql
SELECT * FROM users WHERE id='1';作用:确认页面接收 ID 参数、正常查询数据库,明确基础查询逻辑。
步骤 2:异常输入1',通过报错判断存在注入风险
输入 payload:1'提交,页面直接返回 MySQL 语法错误:
plaintext
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1''报错原理:
用户输入1'拼接后完整 SQL:
sql
SELECT * FROM users WHERE id='1'';原始语句末尾自带单引号,我们输入的'多闭合一层引号,SQL 引号不匹配,数据库抛出语法错误。
关键结论:页面直接输出数据库报错,说明输入内容直接拼接 SQL,存在极高 SQL 注入风险。
步骤 3:输入1''验证注入漏洞真实存在
输入 payload:1''提交,页面不再报错,正常返回 ID=1 用户数据。 拼接后 SQL 语句:
sql
SELECT * FROM users WHERE id='1''';逻辑说明:我们输入两个单引号,第一个闭合原有查询,第二个和后端自带的引号配对抵消,语法恢复正常,无报错。 这一步实锤页面存在可利用的 SQL 注入漏洞。
步骤 4:万能注入 payload' or '1'='1脱库所有用户
输入核心注入语句:' or '1'='1,提交后页面打印出数据库users表全部 6 条用户数据。
拆解拼接后的完整 SQL:
原始模板:
sql
SELECT * FROM users WHERE id='【用户输入】';带入恶意输入后:
sql
SELECT * FROM users WHERE id='' or '1'='1';逻辑拆解:
- 第一个
'闭合id=后的原有单引号; or是 SQL 逻辑或,只要任意一侧条件成立,整条 where 语句结果为真;'1'='1是永久成立的恒真条件;- 后端末尾自带的
'和语句内'1的前引号配对,语法合法。
最终WHERE条件等价于WHERE true,查询返回 users 表全部记录,实现数据库信息泄露。
四、手工注入核心判断技巧总结
4.1 快速判断是否存在注入点(手工三步法)
- 数字测试:输入正常数字,确认页面能正常查询数据;
- 单引号报错测试:输入
',页面出现数据库语法报错 → 大概率存在注入; - 双引号抵消验证:输入
'',报错消失、页面正常展示数据 → 确认漏洞可利用。
4.2 万能恒真 payload 作用
' or '1'='1是字符型 SQL 注入最基础利用语句,适用于单引号包裹字符串的查询场景,可一次性查询表内全部数据,是手工验证漏洞可用性的标准载荷。
4.3 区分数字型 / 字符型注入
- 字符型(本次实验):查询参数用单引号包裹,必须用
'闭合才能注入; - 数字型:参数无引号包裹,直接输入
or 1=1即可实现脱库。
五、漏洞危害与防护方案
5.1 SQL 注入可造成的危害
- 敏感数据泄露:账号、密码、手机号、后台管理员信息全部脱库;
- 恶意篡改数据:更新、删除数据库内全部业务数据;
- 服务器提权:配合数据库高权限执行系统命令,拿下服务器控制权;
- 业务瘫痪:删除核心业务表,导致网站无法访问。
5.2 生产环境防护手段(开发必看)
- 使用预编译语句(参数化查询):PHP PDO、Java MyBatis 预编译,彻底隔离输入与 SQL 语句;
- 输入白名单过滤:ID 类参数仅允许数字,拒绝单引号、or、union 等特殊字符;
- 关闭详细数据库报错:线上环境统一返回自定义错误页面,禁止输出 SQL 语法报错;
- 最小权限数据库账号:Web 程序连接数据库账号仅分配查询权限,禁止 drop、alter 等高权限操作;
- 部署 WAF Web 应用防火墙:拦截携带注入特征的恶意请求。
六、实验总结
本文通过 DVWA Low 靶场完整演示纯手工识别 SQL 注入全流程,从正常访问、单引号报错探测、双引号漏洞确认,到万能语句批量读取数据库数据,完整复现字符型注入原理。 手工检测是渗透测试的基础,工具扫描仅作为辅助;只有理解底层 SQL 拼接逻辑,才能精准判断复杂场景下的注入漏洞,同时在开发中针对性规避此类高危安全缺陷。
拓展练习:可尝试 DVWA Medium、High 安全级别,对比不同过滤策略下手工注入的绕过思路,进阶学习 Union 查询、盲注等注入手法。
