当前位置: 首页 > news >正文

DOM型xss靶场实验

xss是什么?

XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制--例如同源策略(same origin policy)。这种类型的漏洞由于被黑客用来编写危害性更大的网络钓鱼(Phishing)攻击而变得广为人知。对于跨站脚本攻击,黑客界共识是:跨站脚本攻击是新型的"缓冲区溢出攻击",而JavaScript是新型的"ShellCode"。

什么是基于DOM的XSS?

基于DOM的XSS(Cross-Site Scripting)是一种常见的网络安全漏洞,它利用了浏览器中的DOM(文档对象模型)来执行恶意脚本。DOM是浏览器将HTML文档解析为可操作对象的表示方式。

基于DOM的XSS攻击通常发生在客户端,攻击者通过注入恶意脚本代码,使得浏览器在解析和执行页面时执行这些脚本。这些恶意脚本可以窃取用户的敏感信息、修改页面内容、重定向用户到恶意网站等。

我使用的是一个在线的dom型xss平台

靶场链接:Challenges

第一关Ma Spaghet!:

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

在script标签里边,使用get传参的方式给somebody传一个值,如果没有传值,默认传Somebody+Toucha Ma Spaghet!,然后赋值给spaghet,放在h2标签中,这里的spaghet后边加了一个innerHTMl的属性。

(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>

这里我们看似插入进去,但是不会执行 ,当?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%20src=1%20onerror="alert(6666)">

innerHTML 有类似效果的时innerText:

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

第二关Jefff:

<!-- Challenge -->
<h2 id="maname"></h2>
<script>let jeff = (new URL(location).searchParams.get('jeff') || "JEFFF")let ma = ""eval(`ma = "Ma name ${jeff}"`)setTimeout(_ => {maname.innerText = ma}, 1000)
</script>
分析:

我们可以看到给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的漏洞

解决方法2:

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

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

第三关: Ugandan Knuckles

<!-- Challenge -->
<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(55)

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

onfocus

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

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

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

第四关:Ricardo Milos

<!-- 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(55)

第五关:Ah That's Hawt

<!-- 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.replace进行了过滤,但是我们可以使用编码的方式来绕过它的过滤。

解决方法:
markassbrownlee=<img src=1 onerror="alert(1)">

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

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

markassbrownlee=<img src=1 onerror="alert(1)">
实体编码:
markassbrownlee=<img src=1 onerror="alert&#x0028;&#x0031;&#x0029;">
urlcode编码:
markassbrownlee=<img src=1 onerror="alert%26%23x0028%3B%26%23x0031%3B%26%23x0029%3B">当参数在url中传递过去后会解码,漏出实体编码,实体编码就可以绕过过滤传递给h2正常执行。

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【基础算法总结】多源 BFS_多源最短路问题
  • 基于django的双选宠物托管服务平台/python宠物托管系统
  • 设计模式反模式:UML图示常见误用案例分析
  • 深度学习入门-01
  • 车载以太网自动化测试套件—AETP.UDS
  • 一条sql 在MySQL中是如何执行的
  • YoloV8改进策略:Block改进|LeYOLO,一种用于目标检测的新型可扩展且高效的CNN架构|复现LeYolo,轻量级Yolo改进
  • Linux学习第60天:Linux驱动开发的一些总结
  • 利用CICD管道和MLOps自动化微调、部署亚马逊云科技上的AI大语言模型
  • 10 个 C# 关键字和功能
  • vue中父组件向子组件传值,子组件向父组件传值,简洁易懂
  • web前端之html弹窗面板的popover新属性
  • NC 把二叉树打印成多行
  • 2、Future与CompletableFuture实战
  • Positional Encoding | 位置编码【详解】
  • __proto__ 和 prototype的关系
  • ECMAScript6(0):ES6简明参考手册
  • GitUp, 你不可错过的秀外慧中的git工具
  • JS学习笔记——闭包
  • k8s 面向应用开发者的基础命令
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • PHP那些事儿
  • Redash本地开发环境搭建
  • 当SetTimeout遇到了字符串
  • 构建工具 - 收藏集 - 掘金
  • 基于HAProxy的高性能缓存服务器nuster
  • 近期前端发展计划
  • 马上搞懂 GeoJSON
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 设计模式(12)迭代器模式(讲解+应用)
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​数据结构之初始二叉树(3)
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #70结构体案例1(导师,学生,成绩)
  • #window11设置系统变量#
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (+4)2.2UML建模图
  • (1)STL算法之遍历容器
  • (Python) SOAP Web Service (HTTP POST)
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (一)基于IDEA的JAVA基础10
  • (转)树状数组
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .mysql secret在哪_MySQL如何使用索引
  • .net core控制台应用程序初识
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法
  • .net Signalr 使用笔记
  • .NET WPF 抖动动画
  • .net 连接达梦数据库开发环境部署