DVWA 之 XSS(DOM)

本文介绍了XSS(跨站脚本攻击)的概念及其不同难度级别的实现方法,包括如何利用DOM-based XSS漏洞进行攻击。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

目录

1、级别:Low 

 2、级别:Medium

 3、级别:High

4、级别:Impossible


XSS 简介

XSS(Cross Site Script),全称跨站脚本攻击,为了与 CSS(Cascading Style Sheet) 有所区别,所以在安全领域称为 XSS。
XSS 攻击,通常指黑客通过 HTML 注入 篡改网页,插入恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击行为。

详细介绍可以看之前的文章:【Web安全】跨站脚本攻击XSS_RexHarrr的博客-CSDN博客

DOM—based XSS漏洞的产生

DOM—based XSS漏洞是基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM—based XSS漏洞。


可能触发DOM型XSS的属性:

document.referer属性

window.name属性

location属性

innerHTML属性

documen.write属性

1、级别:Low 

看一下源码:


<?php

# No protections, anything goes

?>

 Nothing~转战网页源代码

 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。

document.location.href 当前页面完整 URL

substring(start,stop)方法用于提取字符串中介于两个指定下标之间的字符。

decodeURI() 函数可对 encodeURI() 函数编码过的 URI 进行解码。

document.write是JavaScript中对document.open所开启的文档流(document stream操作的API方法,它能够直接在文档流中写入字符串,一旦文档流已经关闭,那document.write就会重新利用document.open打开新的文档流并写入,此时原来的文档流会被清空,已渲染好的页面就会被清除,浏览器将重新构建DOM并渲染新的页面

这段代码的意思就是说如果存在default,则取出 default 的值赋值给变量lang,然后写入<option value='"lang"'>"decodeURL(lang)</option>,也就是说我们可以注入一些 JS 代码进去,然后这部分会被包含到 lang 变量中,最终回显到页面上。                         

构造注入payload:?default=<script>alert(document.cookie)</script>

 2、级别:Medium

源码:


<?php

// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
    $default = $_GET['default'];
    
    # Do not allow script tags
    if (stripos ($default, "<script") !== false) {
        header ("location: ?default=English");
        exit;
    }
}

?>

array_key_exists() 函数检查某个数组中是否存在指定的键名,如果键名存在返回 true,键名不存在则返回 false。

stripos(string,find,start) 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)。

header() 函数向客户端发送原始的 HTTP 报头。

 “script” 标签被过滤了,当函数匹配到 <script 字符串的时候就会将URL后面的参数修正为 ?default=English,我们不能直接注入 JS 代码了。 

采用图片插入语句法:

HTML 的 < img > 标签定义 HTML 页面中的图像,该标签支持 onerror 事件,在装载文档或图像的过程中如果发生了错误就会触发。使用这些内容构造出 payload 如下,因为我们没有图片可供载入,因此会出错从而触发 onerror 事件输出 cookie。

构造payload:

?default=English</option></select><img src = 1 onerror = alert(document.cookie)> 

(这里的标签 </option></select> 是根据页面源码写的)

 注入后的网页代码

 3、级别:High

源码:


<?php

// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {

    # White list the allowable languages
    switch ($_GET['default']) {
        case "French":
        case "English":
        case "German":
        case "Spanish":
            # ok
            break;
        default:
            header ("location: ?default=English");
            exit;
    }
}

?>

 这里用switch:case来给default赋值,相当于设置了白名单,只允许传 default值为EnglishFrenchGermanSpanish 其中一个。

可以在注入的 payload 中加入注释符 “#”,注释后边的内容不会发送到服务端,但是会被前端代码所执行。

payload:

?default=English #<script>alert(document.cookie)</script>

 

4、级别:Impossible

源码:


<?php

# Don't need to do anything, protection handled on the client side

?>

 意思是不需要做任何事,保护在客户端处理。  

 看下网页源代码:

 这里的语句变了,并没有对我们输入的内容进行URL解码,所以我们输入的任何内容都是经过URL编码,然后直接赋值。因此不存在XSS漏洞。

### 关于DVWAXSS DOM漏洞的信息 在探讨DVWA(Damn Vulnerable Web Application)中的DOM型跨站脚本攻击(XSS)时,需理解DOM操作如何影响Web应用程序的安全性。DOM XSS发生在客户端JavaScript代码解析并执行来自不受信任的数据源的恶意输入之时[^1]。 对于`http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=<script>alert(1)</script>`这样的URL请求,在未加防护的情况下,服务器返回固定内容给浏览器渲染,而浏览器依据接收到的HTML文档构建DOM树,并处理其中嵌入或由外部引入的JavaScript逻辑。如果这些逻辑不当使用了查询字符串参数,则可能导致安全风险。例如上述案例展示了通过修改URL中的`default`参数传递一段简单的JavaScript弹窗命令,实现了向页面注入可被执行的脚本片段的目的。 然而值得注意的是并非所有情况下都能轻易达成这种攻击效果。某些场景下虽然允许用户提交特定形式的数据至前端显示区域,但由于编码机制的存在使得原始意图被改变——即所输入的内容可能先经历了一轮转义转换再参与后续流程;另外还有些情形里尽管表面上看似可以绕过初步筛查手段实施payload投递,实则因更深层次防御措施如正则表达式匹配替换等生效阻止了最终危害的发生。比如有实例提到即使尝试发送带有<script>标签的有效载荷也未能触发预期行为,因为目标位置处存在针对此类结构的关键字过滤规则,迫使攻击者寻找其他途径完成相同目的,像利用图像加载失败后的回调函数作为新的突破口:<img src="nonexistent.jpg" onerror="alert('xss')">[^4]。 #### 解决方案建议 为了有效防范这类基于DOM的操作引发的安全隐患: - **验证与净化输入**:确保所有来源于用户的输入都经过严格的校验过程去除潜在危险成分后再用于更新界面状态; - **采用上下文敏感输出编码**:根据不同展示环境特点分别应用适合的方式对特殊字符做适当变换防止其被解释成活动指令的一部分; - **最小权限原则**:仅授予必要的功能访问权利给各部分组件减少不必要的暴露面; - **定期审查第三方库和服务集成情况**:及时跟进官方发布的补丁信息修补已知缺陷。 ```javascript // 假设有一个接收用户输入并将其反映到页面上的简单例子 function updatePageContent(userInput){ // 不要这样做 - 存在高危风险 document.getElementById("content").innerHTML = userInput; // 应该这样做 - 使用textContent代替innerHTML以避免HTML/JS注入 document.getElementById("content").textContent = userInput; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RexHarrr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值