当前位置: 首页 > news >正文

DVWA实战:从零到一,手把手拆解SQL手工注入全流程

1. 环境准备与靶场搭建

第一次接触SQL注入时,我盯着屏幕上那个简单的输入框发呆了十分钟——谁能想到在这个看似无害的文本框背后,竟藏着直通数据库的暗道?DVWA(Damn Vulnerable Web Application)就像个精心设计的黑客游乐场,特别适合新手来摸清这些暗道机关。

装DVWA其实比想象中简单。我用的是Windows系统,直接下载了XAMPP集成环境,把DVWA压缩包解压到htdocs目录下。启动Apache和MySQL服务后,在浏览器输入http://localhost/dvwa就能看到登录页面。默认账号是admin,密码password,记得登录后要先去"DVWA Security"把安全级别调到Low,不然很多漏洞都被防护机制过滤掉了。

注意:实验结束后务必关闭DVWA服务,真实环境中运行这种脆弱系统相当于给黑客发邀请函

2. 初探SQL注入点

在DVWA左侧菜单找到SQL Injection,页面就一个孤零零的输入框。我输入数字1点击提交,页面返回了用户ID为1的姓名信息。这时候按下F12打开开发者工具,在Network标签里能看到实际发送的请求是http://localhost/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#

关键转折点出现在我输入1'时——页面突然蹦出MySQL报错信息。这个单引号就像钥匙插进锁孔的声音,暴露出后端代码是直接用字符串拼接SQL语句:

SELECT first_name, last_name FROM users WHERE user_id = '$id'

为了确认注入类型,我又测试了两组神奇的组合拳:

  • 输入1' and '1'='1返回正常结果
  • 输入1' and '1'='2返回空内容

这就像在问数据库两个问题:"1=1对吗?"(当然对)、"1=2对吗?"(当然不对)。数据库诚实的回答让我们确认:此处存在字符型SQL注入漏洞。

3. 手工注入七步走

3.1 判断字段数量

输入1' order by 2#能正常返回数据,但1' order by 3#就报错,说明查询结果只有两列。这里的#号是MySQL注释符,相当于把后面可能存在的单引号都给屏蔽了,避免语法错误。

3.2 定位回显位

用联合查询来探测显示位置:

1' union select 1,2#

页面第二列显示了数字2,说明这里是数据回显位。我更喜欢用更直观的测试:

1' union select '左边','右边'#

果然页面上清晰显示出"左边"和"右边"两个词。

3.3 提取数据库信息

在回显位换上数据库函数,信息就像开了闸的洪水般涌出:

1' union select database(),user()#

返回结果告诉我:当前数据库叫dvwa,操作者账号是root——这相当于拿到了金库钥匙还知道了保安的名字!

3.4 爆破表结构

information_schema是MySQL自带的元数据库,相当于数据库的户口本。通过这个"户口本"可以查dvwa数据库的所有表:

1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa'#

group_concat函数把多行结果拼接成字符串返回,结果显示出guestbook和users两个表。看到users表名时我眼睛一亮——这里肯定存着用户凭证。

3.5 获取字段明细

继续深挖users表结构:

1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#

返回的user_id,first_name,last_name,user,password等字段名,简直像拿到了数据库的藏宝图。

3.6 提取核心数据

最激动人心的时刻到了:

1' union select user,password from users#

屏幕上赫然显示着所有用户名和MD5加密的密码!用在线解密网站破解admin的密码,果然就是"password"的MD5值。整个过程就像在玩数字版的密室逃脱,每个SQL语句都是打开新房间的密码。

4. 漏洞原理深度解析

回头看DVWA的Low级别源码,问题出在直接拼接用户输入:

$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";

当我输入1' union select 1,2#时,最终执行的SQL变成:

SELECT first_name, last_name FROM users WHERE user_id = '1' union select 1,2#'

攻击者通过精心构造的输入,把原本的数据查询变成了"查询+任意指令"的组合拳。这就像去餐厅点餐时,服务员把你的点菜单和厨房操作手册一起交给了厨师。

5. 防御措施对比

DVWA的四个安全级别展示了防御手段的进化史:

Medium级别用了mysqli_real_escape_string过滤特殊字符,但数字型注入仍可能绕过。High级别增加了LIMIT 1限制和页面分离,给自动化工具制造障碍。最严密的Impossible级别则祭出三大杀器:

  1. PDO预处理语句
  2. CSRF令牌验证
  3. 严格的类型检查
$data = $db->prepare('SELECT ... WHERE user_id = (:id) LIMIT 1;'); $data->bindParam(':id', $id, PDO::PARAM_INT);

这种参数化查询就像把用户输入装进防爆箱再处理,彻底切断了注入通道。

http://www.jsqmd.com/news/667166/

相关文章:

  • MIPI CSI-2笔记(23) -- 从PPI接口到数据流:一个RAW8传输的D-PHY实现剖析
  • 基于51单片机的CO2浓度智能监测与自适应报警系统设计
  • FreeRTOS任务优先级设置指南:以温湿度监测和LED控制为例(避坑分享)
  • Mos:重塑Mac鼠标滚动体验的智能平滑引擎
  • IWR6843ISK原始ADC数据捕获与解析实战:从二进制文件到信号矩阵
  • 企业级vscode-drawio离线部署:内网环境安全集成与团队协作解决方案
  • 如何用500KB的AlienFX Tools替代臃肿的AWCC:Alienware设备终极控制指南
  • 别只调参了!深入CIFAR-10:用PyTorch可视化工具理解CNN到底学到了什么
  • STM32驱动高精度称重模块:HX711 24位ADC的电路设计与代码实战
  • ConvNeXt 系列改进:引入 FasterNet 部分卷积(PConv),大幅降低 ConvNeXt 内存访问冗余与 FLOPS
  • 从GUI到爬虫:实战盘点Python回调函数(Callback)的5个高频应用场景
  • 终极ADB和Fastboot驱动一键安装解决方案:告别Android连接烦恼
  • Open WebUI终极部署指南:高效搭建私有AI聊天平台
  • IWR6843ISK+DCA1000 LVDS原始ADC数据解析实战
  • CBAM_ASPP实战:在语义分割中融合通道与空间注意力,提升多尺度特征融合精度
  • 从ICCID解码到设备入网:物联网卡唯一标识的实战指南
  • 为什么92%的制造企业AGI试点在6个月内失败?SITS2026案例拆解4个被忽视的OT-IT融合硬门槛
  • 从RSCU堆积图到密码子偏好性:一次R语言ggplot2的实战调优
  • 深入解析中科蓝讯内存架构:从COM区到Bank区的设计哲学
  • GHelper架构解析与实战指南:华硕笔记本轻量级控制工具的技术实现与应用
  • 给工科生的Elsevier投稿避坑指南:从《海洋工程》期刊审稿人视角看论文结构与语言
  • 微软PICT组合测试工具:如何用10%的测试用例覆盖90%的缺陷
  • 紧急通报:2026年起所有新建应急指挥中心须通过AGI预警兼容性认证——SITS2026最新《智能预警基础设施强制接入规范》逐条解读(含过渡期豁免申请入口)
  • 【2026 AGI实战指南】:基于SITS2026实测数据的7层能力评估矩阵与团队就绪度自检清单
  • 用Pascal VOC 2012数据集练手YOLOv5:从XML标签转换到训练完成的保姆级避坑指南
  • Win11Debloat:如何用3分钟为你的Windows系统完成专业级“瘦身手术“?
  • 面试官问LFU缓存,我用C++手撕了一个O(1)实现(附LeetCode 460题解)
  • Unity Gameplay Ability System:3步构建专业级游戏技能框架 [特殊字符]
  • PyTorch C++扩展编译报错:cl编译器路径缺失与ninja未找到的排查与修复
  • AGI驱动的机器人正突破奇点:SITS2026披露7项未公开技术参数与实时响应延迟数据(<87ms)