首页 > 其他分享 >DOM型xss靶场实验

DOM型xss靶场实验

时间:2024-06-08 22:31:01浏览次数:21  
标签:xss somebody get h2 DOM innerHTML Ma 靶场 wey

DOM型xss可以使用js去控制标签中的内容。

我使用的是一个在线的dom型xss平台,靶场链接:Challenges

第一关Ma Spaghet!:

Ma Spaghet! 关卡

<h2 id="spaghet"></h2>
<script>
    spaghet.innerHTML = (new URL(location).searchParams.get('somebody') || "Somebody") + " Toucha Ma Spaghet!"
</script>

(new URL(location).searchParams.get('somebody') || "Somebody") + " Toucha Ma Spaghet!" 这里的意思为获取url中的get参数somebody,如果有那么就设置h2的值为get参数的值,如果没有则设置h2的值为Somebody") + " Toucha Ma Spaghet!

(1):当get参数中存在somebody时,h2回显

(2):当get参数中不存在somebody时,h2回显

这里存在一个问题,somebody传谁就显示谁,那么我们传递给js代码给h2时:

从上面可以看到,当?somebody=<script>alert(1)</script>时,并没有弹窗,正常在h2标签中会执行,但是这里不能执行的原因为:

spaghet.innerHTML = (new URL(location).searchParams.get('somebody') || "Somebody") + " Toucha Ma Spaghet!"

h2的id为spaghet,我们使用innerHTML将我们get参数传递到h2标签中。

我们去官网查看可以发现:https://developer.mozilla.org/zh-CN/docs/Web/API/Element/innerHTML

在html 5中指定不执行由 innerHTML 插入的 <script></script>标签,这就是不能弹窗的原因。

innerHTML 只过滤了<script>,我们可以写其他的来触发:当传递其他的可以触发js的时就不能过滤。

?somebody=<img src=1 one rror="alert(1)">

总结:

innerHTML 有类似效果的时innerText:

真正防止xss的是innerText,不是innerHTMLinnerHTML 只能过滤<script></script>

当我们将innerHTML 换为innerText后,再次传第相同的somebody参数。

<script>
    spaghet.innerText = (new URL(location).searchParams.get('somebody') || "Somebody") + " Toucha Ma Spaghet!"
</script>

传递后发现:并没有触发。所以innerText才是真正可以用来防止xss的。当我们写页面元素时建议使用innerText。

第二关Jefff:

Jefff 关卡

<h2 id="maname"></h2>
<script>
    let jeff = (new URL(location).searchParams.get('jeff') || "JEFFF")
    let ma = ""
    eval(`ma = "Ma name ${jeff}"`)    ---其中的动作为给变量ma赋值。
    setTimeout(_ => {
        maname.innerText = ma
    }, 1000)
</script>
eval  ---js中的一个执行函数。
setTimeout  ---定时器,上面表示在1秒后执行定时器中的动作。


分析:我们可以看到给h2传参使用的是innerText,所以我们想在maname.innerText = ma上面做基本不可能了。
我们只能考虑在eval中做。

解决方法1: 尝试闭合双引号,之后在其中闭合单引号。所以我们需要在传递的变量jeff上做。

jeff=asd" ;alert(12);//

eval(`ma = "Ma name asd" ;alert(12);//"`)     --- // 可以将后面多出的双引号注释掉。

我们可以看到,传递的值jeff=asd" ;alert(12);// 时就会弹窗,说明这里存在DOM型xss的漏洞

解决方法二:

可以使用连接符的方式来做:

jeff=asd" ;-alert(12)-" 

第三关:

<div id="uganda"></div>
<script>
    let wey = (new URL(location).searchParams.get('wey') || "do you know da wey?");
    wey = wey.replace(/[<>]/g, '')
    uganda.innerHTML = `<input type="text" placeholder="${wey}" class="form-control">`
</script>

wey = wey.replace(/[<>]/g, '') ----- 过滤了 < 和 > ;

解决方法:

闭合双引号。

wey=asd" onclick="alert(12)

虽然上面可以触发,但是需要用户的参与(点击输入框),与自动触发不符合。所以我们需要使用下面的一个方法。

onfocus

是获取焦点的意思,获取焦点以后就可以触发它的动作(弹窗)。onfocus不可以自动聚焦,所以我们还需要一个函数autofocus来自动聚焦,这样就不需要用户的参与就可以触发了。

wey=asd" onfocus="alert(12)"  autofocus="true

这样就可以不需要用户的参与就可以弹窗了。

第四关:

<!-- Challenge -->
<form id="ricardo" method="GET">
    <input name="milos" type="text" class="form-control" placeholder="True" value="True">
</form>
<script>
    ricardo.action = (new URL(location).searchParams.get('ricardo') || '#')
    setTimeout(_ => {
        ricardo.submit()
    }, 2000)
</script>

这段代码的意思为在2秒后对from表单进行提交,提交的位置就是ricardo.action 接收到的路径,路径由get参数中的ricardo提供。
在action中可以识别js伪协议,那么就好办了。

解决方法:

ricardo=javascript:alert(12)

第五关:

<!-- Challenge -->
<h2 id="will"></h2>
<script>
    smith = (new URL(location).searchParams.get('markassbrownlee') || "Ah That's Hawt")
    smith = smith.replace(/[\(\`\)\\]/g, '')
    will.innerHTML = smith
</script>

 smith = smith.replace(/[\(\`\)\\]/g, '')  -----过滤了( , ) ,反引号,转义字符。

 分析:
虽然使用smith.replace进行了过滤,但是我们可以使用编码的方式来绕过它的过滤。

解决方法:

markassbrownlee=<img src=1 one rror="alert(1)">

传递的参数在url中,所以如果我们直接将(1)进行urlcode编码浏览器传递给smith时会自动解码,但是在url中要遵守url规则,不能直接传递实体编码。

所以我们可以先将(1)进行实体编码,再对实体编码进行urlcode编码。

markassbrownlee=<img src=1 one rror="alert(1)">
实体编码:
markassbrownlee=<img src=1 one rror="alert&#x0028;&#x0031;&#x0029;">
urlcode编码:
markassbrownlee=<img src=1 one rror="alert%26%23x0028%3B%26%23x0031%3B%26%23x0029%3B">

当参数在url中传递过去后会解码,漏出实体编码,实体编码就可以绕过过滤传递给h2正常执行。

传递参数进去:发现此时就可以进行弹窗了。

标签:xss,somebody,get,h2,DOM,innerHTML,Ma,靶场,wey
From: https://blog.csdn.net/qq_64302290/article/details/139552003

相关文章

  • Vulnhub靶场:NAPPING: 1.0.1
    1.环境搭建靶机下载:Napping:1.0.1~VulnHub将靶机导入到OracleVMVirtualBox中,网络设置仅主机模式,和kali使用相同的网卡开启靶机2.渗透过程使用nmap工具扫描进行主机发现扫描nmap-sn192.168.56.0/24发现靶机ip地址,使用nmap工具进行端口扫描nmap-sS192.16......
  • 记录自己在xss-labs靶场的通关记录
    一:靶场下载及搭建xss-labs下载地址:xss-labs:xss跨站漏洞平台-GitCodephpstudy集成开发环境安装:[靶场环境篇]phpstudy集成环境安装教程(特别详细)_phpstudy集成环境-CSDN博客我们下载完之后,就可以进行xss-labs-master的搭建,我本人下载的phpstudy是2018年版的将xss-......
  • pikachu靶场(File Inclusion(文件包含)通关教程)
    1.FileInclusion(local)本地文件包含1.1打开网站,发现有个下拉框,随便选择一个,然后点击提交1.2发现图中有个参数变了,其他的也会变,猜测这里可能有其他隐藏的文件1.3直接进行抓包 ,右键发送到爆破模块1.4 选择爆破方式为sniper,选择爆破点 1.5设置攻击字典,选择数字,从1......
  • DVWA靶场学习(一)—— Brute Force
    BruteForce暴力破解其实就是利用不同的账户和密码进行多次尝试。因为用户在设置密码时可能会选用比较容易记忆的口令,因此,可以使用一些保存常用密码的字典或者结合用户的个人信息进行爆破。DVWA安全等级有Low,Medium,High和Impossible四种,随着安全等级的提高,网站的防护等级和攻击......
  • JavaScript第十一讲:DOM编程“事件”
    前言当涉及到DOM(DocumentObjectModel)的事件时,JavaScript提供了许多内置的事件处理器,用于处理用户在网页上执行的各种操作。1.焦点事件当元素获得或失去焦点时触发。onfocus:当元素获得焦点时触发。onblur:当元素失去焦点时触发。//假设有一个输入框<inputtype="......
  • 微前端学习笔记(5):从import-html-entry发微DOM/JS/CSS隔离
    import-html-entry 是qiankun中一个举足轻重的依赖,用于获取子应用的HTML和JS,同时对HTML和JS进行了各自的处理,以便于子应用在父应用中加载。 import-html-entry主要是实现了以下几个能力拉取url对应的html并且对html进行了一系列的处理拉取上述html中所......
  • JavaScript-DOM
    JavaScript-DOM1.DOM介绍DOM:DocumentObjectModel文档对象模型。也就是JavaScript将HTML文档的各个组成部分封装为对象。HTML文档是浏览器解析。封装的对象分为Document:整个文档对象Element:元素对象Attribute:属性对象Text:文本对象Comment:注释对象2.获取DOM对象......
  • 【Web API DOM09】元素在页面中尺寸、位置获取
    一:如何获取宽高、位置1获取元素宽高offsetWidth和offsetHeight获取元素自身宽高,包含元素自身内容+padding+border获取可视宽高;如果盒子隐藏,获取结果为0获取的是数值型数据clientWidth和clientHeight获取元素可见部分宽高(不包含边框、margin、滚动条等)2获取元素位置off......
  • 【Web API DOM10】日期(时间)对象
    一:实例化1获取系统当前时间即创建日期对象constdate=newDate()console.log(date)2024年6月5日周三 2获取指定的时间以获取2025年6月29日为例constdate=newDate('2025-6-29')console.log(date)二:日期对象方法1使用场景:日期对象返回数据如上图,无法直接使......
  • DOM是什么?含12种DOM节点类型概述
    DOM是javascript操作网页的接口,全称为文档对象模型(DocumentObjectModel)。它的作用是将网页转为一个javascript对象,从而可以使用javascript对网页进行各种操作(比如增删内容)。浏览器会根据DOM模型,将HTML文档解析成一系列的节点,再由这些节点组成一个树状结构。DOM的最小......