玩转DVWA 之XSS DOM

本文深入探讨了XSS中的DOM型攻击,解释了DOM的本质和XSS DOM攻击原理。通过DVWA(Damn Vulnerable Web Application)的不同级别实例,详细展示了攻击过程,包括如何利用document对象的方法插入恶意代码,以及在不同防护级别下攻击者如何调整策略。在Low级别,payload直接执行;Medium级别利用<img>标签的onerror事件绕过过滤;High级别采用#注释绕过白名单;Impossible级别则由于编码处理导致攻击无效。

XSS是Cross Site Scripting的缩写,意为跨站脚本攻击。XSS分为反射型、DOM型、存储型,本篇来聊一聊DOM型攻击。

一、什么是DOM

DOM是一种思想,是访问结构化文档的方式。

根据W3C定义,DOM分为核心DOM ,XML DOM,HTML DOM。

DOM是Javascript操作网页的接口。当浏览器载入 HTML 文档, 它就会成为 Document 对象。HTML DOM 模型被构造为对象的树。

 

二、什么是XSS DOM 攻击

XSS DOM攻击就是利用document对象的方法写入可执行代码。

常用的document对象的方法如下。

document.getElementById(id):获取带有执行id的节点(元素);

document.getElementsByClassName(class):获取所有指定类型的节点

document.write():写入html,script代码。

例如DVWA的DOM利用,就是用document.write()中插入script执行代码

在整个过程中,只有受害者的端网页脚本修改了,服务器响应的页面没有发生变化。

三、DVWA中DOM利用

选择级别

<think>我们正在处理一个关于DVWA靶场中XSS DOM型漏洞的问题。用户提到在操作时“不出现语言”,这通常是指在下拉选择框中没有出现预期的语言选项,或者页面没有正常显示语言选择下拉框。根据引用内容,特别是引用[3]和[4],我们知道在DVWADOMXSS中,不同安全级别(Low, Medium, High)对输入的处理不同,可能导致下拉框不显示语言选项。 分析引用: 引用[3]提到,在Medium级别,后端代码使用stripos检测输入中是否有"<script"标签,如果存在则跳转到default=English。同时,由于注入需要闭合option和select标签,用户可能因为注入代码破坏了页面结构导致语言选择框不显示。 引用[4]提到High级别,它使用了白名单机制,只有指定的语言(French, English, German, Spanish)才会被接受,否则跳转到default=English。如果用户输入不在白名单中,也会被重定向到默认语言。 用户遇到的问题可能是由于注入代码后,页面结构被破坏或者重定向导致语言下拉框不显示。 解决方案思路: 1. 检查注入代码是否破坏了页面结构:在Medium级别中,注入代码需要先闭合option和select标签,然后插入恶意标签。如果闭合标签不正确,可能导致整个下拉框消失。 2. 检查是否因为重定向而看不到语言选择框:在Medium和High级别中,如果输入包含黑名单内容(如<script)或者不在白名单中,会被重定向到默认语言页面,此时页面可能只显示默认语言,而没有下拉框(因为重定向后参数变为default=English,并且可能没有重新显示选择框?但实际上,在DVWA中,即使重定向也会显示下拉框,但选中的是默认语言,所以用户可能误以为没有显示)。 但是,根据用户描述“不出现语言”,可能是下拉框完全消失了。这通常是因为注入的代码没有正确闭合标签,导致后面的HTML结构被破坏。 根据引用[3]的示例,在Medium级别,正确的注入方式应该是: </option></select><img src=1 onerror=alert(1)> 这样,先闭合option和select标签,然后插入一个img标签(利用onerror事件执行JS)。 如果用户使用了类似上面的注入代码,但是可能没有完全闭合标签,或者插入的标签有误,导致整个select标签后面的内容被破坏,从而语言下拉框消失。 另外,在High级别,由于白名单机制,用户无法通过修改default参数来注入,因为不在白名单的参数会被重定向。因此,在High级别下,无法通过常规的default参数注入XSS(除非绕过白名单,但引用[4]中的代码显示白名单是严格的,所以暂时没有绕过方法)。所以,在High级别,用户可能无法复现XSS漏洞,但这不是问题,因为题目要求就是如此。 用户的问题可能是发生在Medium级别,因为Low级别没有过滤,直接输入即可,而High级别无法注入(除了白名单的值)。所以,我们重点考虑Medium级别。 解决方案: 1. 检查注入字符串是否正确闭合了标签。正确的注入字符串应该是:`</option></select><img src=1 onerror=alert(1)>`。 2. 如果页面没有出现弹窗,并且语言下拉框消失了,说明注入成功破坏了页面结构(这正是我们想要的,因为要执行XSS),但同时也会导致下拉框消失。如果用户希望看到下拉框,那么注入后下拉框被破坏是正常现象,因为我们已经用</select>结束了这个下拉框,后面添加了一个图片,所以下拉框不会显示。 但是,如果用户是在练习XSS漏洞,那么注入后下拉框消失是正常现象,因为我们的恶意代码已经执行了(如果弹窗出现的话)。如果用户希望页面正常显示下拉框,那么只能不进行注入,或者使用不破坏页面结构的注入方式(但在Medium级别中,由于过滤了script标签,我们只能使用其他标签并且需要闭合select标签,所以破坏结构是必然的)。 另一种可能是:在注入后,由于重定向,页面被刷新到了默认语言,此时参数变为default=English,那么注入的代码就不存在了,页面会正常显示下拉框(选中的是English)。这发生在用户输入中包含<script标签的情况下,因为Medium级别的代码会检测到<script而重定向。所以,用户应该避免使用<script>标签,而是使用其他标签(如img)并且不要包含<script字符串。 因此,我们总结: - 在Medium级别,不要使用<script>标签,而是使用其他标签(如img)并确保正确闭合option和select标签。 - 注入字符串:`</option></select><img src=1 onerror=alert(1)>` 这样,页面会先闭合当前的option和select,然后插入img标签。由于img的src=1是一个不存在的图片,所以会触发onerror事件,执行alert(1)。 - 注入后,原来的下拉框会被破坏,所以不会显示,但会显示一个破损的图片(如果图片存在就显示图片,不存在则显示破损图标),同时弹窗。 如果用户想要在注入后仍然显示下拉框,那是不可能的,因为我们已经用</select>闭合了,而且后面没有重新生成一个下拉框。 所以,用户的问题“不出现语言”可能是因为注入了破坏结构的代码导致下拉框消失,这是正常现象。如果用户没有看到弹窗,那么可能是注入方式不对,或者没有正确闭合标签。 另外,在High级别,由于白名单机制,用户无法注入,所以不会出现弹窗,但语言下拉框会正常显示(除非用户输入了白名单中的语言,否则会被重定向到English,但下拉框仍然存在)。 因此,针对用户的问题,我们给出以下步骤: 1. 确认当前安全级别:如果是Low级别,直接使用`<script>alert(1)</script>`,这样不会破坏下拉框(因为Low级别没有过滤,直接插入到option中,但是script标签在option内部是不合法的,所以可能不会执行?但实际上在Low级别,DVWA的代码是直接将default参数值写入option,所以如果输入包含script标签,那么就会形成一个option内部有script标签,这是不规范的,但浏览器可能会执行。不过,根据引用[3],Low级别是直接插入即可,所以应该会执行。而且不会破坏下拉框,因为整个字符串被当作一个option的值,所以下拉框仍然存在,但可能显示的是整个字符串(包括script标签)作为选项。所以,在Low级别,注入后下拉框仍然存在,但选项内容变了。 2. 在Medium级别,按照引用[3]的方法注入:`</option></select><img src=1 onerror=alert(1)>`,这样会破坏下拉框,但会执行alert。 3. 如果用户是在High级别,则无法通过参数注入XSS(因为白名单),所以不会出现弹窗,但语言下拉框会正常显示(因为重定向到English后,default=English,页面正常显示)。 所以,用户的问题可能是在Medium级别注入后没有看到下拉框,这是正常现象,因为注入破坏了DOM结构。 如果用户希望在不破坏下拉框的情况下注入XSS,这在Medium级别是不可能的,因为我们需要闭合select标签来逃逸,然后执行任意标签。唯一的办法是使用不会破坏结构的注入,但在option标签内,只能包含文本,不能包含其他标签(除了<script>,但script标签被过滤了)。所以,在Medium级别,我们必须破坏结构。 因此,解决办法就是按照正确的方式注入,并接受下拉框被破坏的结果。 如果用户没有看到弹窗,那么可能是注入字符串输入不正确。请确保在输入框中输入完整的注入字符串:`</option></select><img src=1 onerror=alert(1)>`,然后点击选择(或者直接按回车)。注意,在Medium级别,输入框在URL栏下面,有一个输入框和一个选择按钮(或者是一个下拉框?实际上,在DOMXSS中,DVWA的界面是一个下拉选择框,但用户也可以修改URL参数)。在DVWA DOM XSS中,通常是通过修改URL的default参数,例如:`?default=<注入字符串>`。 另外,在Medium级别,由于后端会检查输入中是否包含"<script",所以我们的注入字符串中不能包含"<script",而上面的注入字符串是不包含的,所以不会触发重定向。 所以,最终建议: 在Medium级别,使用以下URL(假设DVWA的地址是http://localhost/dvwa/vulnerabilities/xss_d/): http://localhost/dvwa/vulnerabilities/xss_d/?default=</option></select><img src=1 onerror=alert(1)> 这样,页面加载时,下拉框会被破坏,但是会弹窗。 如果用户希望恢复语言下拉框,只需要重新访问不带参数的URL:http://localhost/dvwa/vulnerabilities/xss_d/,或者将参数改为白名单中的语言(如?default=English)。 综上所述,用户的问题“不出现语言”可能是因为成功注入了破坏结构的代码,这是正常现象。如果用户没有成功注入(即没有弹窗),请检查注入字符串是否正确,以及是否在正确的安全级别下操作。 </think> 针对DVWA靶场中XSS DOM型漏洞测试时语言下拉框不显示的问题,结合引用内容分析,解决方案如下: ### 问题原因分析 1. **DOM结构破坏** 注入代码未正确闭合HTML标签(如`</option></select>`),导致语言选择框被破坏[^3]。 2. **安全级别过滤机制** - **Medium级**:检测到`<script`标签会强制跳转到`default=English`[^3] - **High级**:非白名单语言(French/English/German/Spanish)会触发重定向[^4] 3. **标签嵌套限制** `<select>`标签内仅允许`<option>`标签,注入标签需先闭合父标签[^3] ### 解决方案步骤 #### 1. 检查安全级别设置 ```bash # 确认DVWA安全级别 Low级:直接注入 Medium级:需绕过<script检测 High级:白名单限制(需特殊绕过技巧) ``` #### 2. 修复注入代码结构(针对Medium级) ```html 正确注入格式: </option></select><img src=1 onerror=alert(1)> ``` **关键点**: - 先闭合`</option>`和`</select>`释放DOM空间 - 使用非`<script>`标签(如`<img>`)触发XSS[^3] - 避免包含`<script`字符串防止重定向 #### 3. High级白名单绕过方法 ```javascript // 利用URL片段标识符(#)绕过服务端验证 ?default=Spanish#<script>alert(1)</script> ``` **原理**: 服务端只检查`?default=`参数(白名单验证),`#`后的内容仅客户端处理[^4] #### 4. 终极测试方案 ```http GET /vulnerabilities/xss_d/?default=</option></select><svg onload=alert(1)> HTTP/1.1 ``` **优势**: - 避免`<script>`触发过滤 - 闭合标签恢复DOM完整性 - 使用SVG标签增强兼容性 ### 修复建议(开发者视角) ```javascript // 前端防护示例(输出编码) document.getElementById('output').innerHTML = encodeHTML(userInput); // 实现HTML实体编码函数 function encodeHTML(str) { return str.replace(/[&<>"']/g, tag => ({'&':'&','<':'<','>':'>','"':'"',"'":'''})[tag]); } ``` > 关键:对所有DOM输出点进行上下文敏感编码(HTML/URL/JS)[^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值