目录

线上靶场网址

Ma Spaghet!

Jefff

Ugandan Knuckles

Ricardo Milos

Ah That's Hawt

Ligma

Mafia

Ok, Boomer


线上靶场网址

WarmupsXSS Game: Learn Cross Site Scripting (XSS) by completing challenges!https://xss.pwnfunction.com/warmups

Ma Spaghet!

关键代码分析:

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

1、URLSearchParams接口定义了一些实用的方法来处理URL的查询字符串。

URLSearchParams()是一个可以操作查询字符串的对象。

常用方法:    1、构造查询字符串                   2、获取查询字符串参数

2、innerHTML:它是一个字符串,用来设置或获取位于对象起始和结束标签内的HTML。相当于获取HTML当前标签的起始和结束里面的内容。

使用get方法传递URL,没有其他过滤方式,我们尝试使用<script>alert(1)</script>绕过一下

没有弹窗,我们再找找原因?

由于是因为<script>语句是由innerHTML标签传上去的,我们先查看innerHTML的作用: 在HTML5中指定不执行innerHTML中插入的<script>标签

所以换成<img  src=1  οnerrοr=alert(1337)>再试试,成功了

Jefff

关键代码分析:

eval(`ma = "Ma name ${jeff}"`)setTimeout(_ => {maname.innerText = ma}, 1000)

1、使用模板字符串传递jefff

2、setTimeout:在指定的延迟时间之后调用一个函数或执行一个代码片段

3、innerText:用来定义对象所要输出的文本

首先我们直接尝试将alert(1)传递进去试一下

没有成功,上述方法组合:eval(`ma = "Ma name ${alert(1337)}"`),我们分析一下这个语句

eval虽然仅接受第一个参数,但是会先执行第二个参数,虽然第二个参数可以执行,但是不会接受

第二个参数执行后的结果。

我们首先得将双引号闭合在执行alert,就是将双引号里面的字符串作为第一个参数,alert(1337)作为第二个参数执行

最后组合成:eval(`ma = "Ma name ${aa";alert(1337)//}"`)  ,成功了

Ugandan Knuckles

关键代码分析:

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

1、replace:使用其他文本字符串并根据所指定的字符数替换某文本字符串中的部分文本,在题目中相当于将/[<>]等符号替换成空

2、placeholder:该提示会在输入字段为空时显示,并会在字段获得焦点时消失。

因为对尖括号进行了转义,所以我们首先尝试使用编码将尖括号绕过。

在编码前,我们要确定首先进行HTML实体编码,在进行urlencode编码。原因:因为我们输入的字符串是在URL栏里面,所以我们得进行urlencode编码,但是urlencode编码会在URL栏中被解析,解析后的内容再传入HTML中,我们需要保证在进入HTML之前尖括号不会被解析就需要先进行HTML实体编码,再urlencode编码,这样我们的解析顺序为先进行urlencode解析,再HTML实体编码解析

我们填入的是1"><img src=1 οnerrοr=alert(1337)>,因为HTML自动纠错的功能,我们只需要编码1"><   即可,这时我们输入的内容为:%26%2349%3B%26%2334%3B%26%2362%3B%26%2360%3Bimg src=1 οnerrοr=alert(1337)

没有成功,我们查看一下网页源代码

从源代码可以看出我们已经绕过了尖括号,但是img没有逃出双引号。经过多次尝试也没有绕过双引号,所以我们得换一个方向进行绕过。

由题目中可知我们输入的数据是在<input>标签里面,我们借用onfocus和autofocus进行绕过

1、onfocus:在对象获得焦点(光标)时发生

2、autofocus:自动聚焦

所以我们输入的数据是:1" οnfοcus="alert(1337)" autofocus=" ,成功了

查看源代码是:

Ricardo Milos

关键代码分析:

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

1、action:提交行为,action属性用于规定当提交表单时,向何处发送表单数据,此方法没有被限制,可以直接使用javascript提交alert(1337)

2、submit:相当于提交按钮

我们直接提交:javascript:alert(1337)

需要注意的是,里面有setTimeout函数,所以会延迟两秒再弹窗

Ah That's Hawt

关键代码分析:

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

1、使用replace过滤了/[\(\`\)\\]

我们使用编码进行绕过测试,()先进行实体编码再urlencode编码:%26%2340%3B%26%2341%3B

<img src=1 οnerrοr=alert%26%2340%3B1337%26%2341%3B>

成功了,那我们还可以尝试其他绕过函数

<a href=javascript:alert%26%2340%3B1337%26%2341%3B>aaa</a>,需要点击aaa进行交互才能执行弹窗函数

<a 标签中可以使用%2528和%2529,URL模块可以识别JavaScript协议进行URL解码

<a href=javascript:alert%25281337%2529>aaa</a>

Ligma

关键代码分析:

balls = (new URL(location).searchParams.get('balls') || "Ninja has Ligma")
balls = balls.replace(/[A-Za-z0-9]/g, '')
eval(balls)

将[A-Za-z0-9]都进行了过滤,我们不能使用字母也不能使用数字,这时我们可以使用另一种特殊编码方式:JSFuck - Write any JavaScript with 6 Characters: []()!+

先在这个网页将alert(1337)编码

再将这个编码结果拿去进行urlencode编码后才能放入URL栏里面执行

Mafia

关键代码分析:

mafia = (new URL(location).searchParams.get('mafia') || '1+1')
mafia = mafia.slice(0, 50)
mafia = mafia.replace(/[\`\'\"\+\-\!\\\[\]]/gi, '_')
mafia = mafia.replace(/alert/g, '_')
eval(mafia)

1、slice:可提取字符串的某个部分,并以新的字符串返回被提取的部分。

2、过滤了:[\`\'\"\+\-\!\\\[\]]和alert字符串

所以我们得将alter改变一下,所以我们使用parseInt函数(能将字符串转化成一串数字,并且使用..toString()可以转回来)

我们使用eval提交数据:我们提交(8680439..toString(30))(1337)会变成eval((8680439..toString(30))(1337)),所以我们直接提交eval(8680439..toString(30))(1337)

成功弹窗

location.hash.slice(1):把#号后面的第一位取出来,我们可以在#后面传值alert(1),这样就把alert(1)提取出来了,然后使用eval执行

eval(location.hash.slice(1))#alert(1337)

Function    构造函数,语句与语句之间要加分割符

ALERT(1337):传递的参数

.source.toLowerCase():将ALERT转成小写

Function(/ALERT(1337)/.source.toLowerCase())()

Ok, Boomer

关键代码分析:

<h2 id="boomer">Ok, Boomer.</h2>
<script>boomer.innerHTML = DOMPurify.sanitize(new URL(location).searchParams.get('boomer') || "Ok, Boomer")setTimeout(ok, 2000)
</script>

DOMPurify:DOMPurify是一个开源的基于DOM的快速XSS净化工具。输入HTML元素,然后通过DOM解析递归元素节点,进行净化,输出安全的HTML。

我们可以尝试绕过这个框架,但是得先了解这个框架:

找到这个框架的版本(查看源码)-->  这个使用的框架为DOMPurify2.0.7

第一种方法:通过名称空间混淆突变XSS绕过DOMPurify

操作流程:解析、循环删除危险函数、还原成HTML代码、序列化、解析(多次解析后可能DOM树不一样)

html规范中,不允许form元素的子元素是form。那么说明嵌套form元素是不被允许的。这会导致嵌套里面的form元素被html解析器忽略,就是第二个form会自动消失。然而我们可以通过带有错误嵌套标签的稍微损坏的标记,可以创建嵌套表单。通过div将第二个form嵌套进来了

例子:<form id="outer"><div></form><form id="inner"><input>

这不是任何特定浏览器中的错误;它直接来自HTML规范,并在解析HTML的算法中进行了描述。

​        1、当你打开一个<form>标签时,解析器需要使用表单元素指针打开的(在规范中是这样调用的)。如果指针不是null,则form无法创建元素。

​       2、结束<form>标记时,表单元素指针始终设置为null。

​         一开始,表单元素指针指向id="outer"。然后,出现一个div,</form>将表单元素指针设置为null。因为是null,所以id="inner"可以创建下一个表单;并且因为我们目前在div中,所以有一个form嵌套在form里.

现在,如果我们尝试序列化生成的DOM树,我们将得到以下标记:

<form id="outer"><div><form id="inner"><input></form></div></form>

所以这证明了序列化后再次解析不能保证返回原始DOM树。

默认情况下,所有元素都在HTML命名空间中;但是,如果解析器遇到<svg> or <math>元素,则它分别"切换"到SVG和MathML命名空间。并且这两个命名空间都会产生外部内容。

在外部内容中,标记的解析方式与普通HTML不同。这可以在解析<style>元素时清楚地显示出来。在HTML命名空间中,<style>只能包含文本;没有后代,并且不解码HTML实体。外部内容并非如此:外部内容<style>可以有子元素,并且实体被解码。

例子:<style><a>ABC</style><svg><style><a>ABC

在不同的情况下<style>的作用不同:html style只有文本内容,而svg style像普通元素一样被解析。

       猜想:如果我们位于<svg>或者<math>中,那么所有元素也会位于非HTML命名空间中,然而事实并非如此。HTML标准中包含名为MathML text integration point (MathML文本集成点)以及HTML integration point (HTML集成点)的元素,这些元素的子元素都具有HTML命名空间。

     注意style作为math的直接子元素在 MathML命名空间中,而第二个style在mtext下则是 HTML命名空间中。这是因为 mtext是MathML文本集成点并使解析器切换命名空间。

<mtext>:MathML <mtext>元素用于呈现没有符号含义的任意文本,例如注释或注解。

只要遇到文本集群点,就能自动切换命名空间。

PS:不是所以文本集群点都会切换命名空间。html规范中,大部分Mathml文本集成点的子元素都是HTML命名空间的啊,但是除了<mglyph><malignmark>。当这两个直接是Mathml文本集成点的直接子元素的时候。他们不会切换命名空间。

<form><math><mtext><form><mg1yph><sty1e></math><img src οnerrοr=alert(1)></style></mg1yph></form></mtext></math></form>

所以现在第二个html form没有被创建,mglyph现在是mtext的直接子元素,在MathML命名空间中。因此,style它也在MathM命名空间中,因此其内容不被视为文本。然后</math>关闭<math>元素,现在img在HTML命名空间中创建,导致XSS

所以我们使用:<form><math><mtext></form><form><mglyph><style></math><img src οnerrοr=alert(1337)> 绕过

 第二种方法:DOM clobbering

抓取一个元素,设置一个监听器,当点击它时会弹窗,使用window.id (id为名称),这样可以直接抓取该名称的代码,通过DOM把一些东西覆盖掉来达到攻击的手段。

<a id="ok" href="tel:alert(1)">aaa</a>

我们还可以使用:<a id="ok" href="cid:alert(1337)">aaa</a>

XSS线上靶场---Warmups相关推荐

  1. JAVA 线上故障排查套路,从 CPU、磁盘、内存、网络到GC 一条龙!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数 ...

  2. JAVA 线上故障排查完整套路,从 CPU、磁盘、内存、网络、GC 一条龙!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:fredal https://fredal.xin/java ...

  3. JAVA 线上故障排查完整套路!牛掰!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源丨8rr.co/kV3R 线上故障主要会包括 CPU.磁盘.内 ...

  4. JAVA 线上故障排查指南!

    来源:https://fredal.xin/java-error-check 线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依 ...

  5. 线上经验总结:一台 Java 服务器可以跑多少个线程?

    一台java服务器能跑多少个线程? 这个问题来自一次线上报警如下图,超过了我们的配置阈值. 京东自研UMP监控分析 打出jstack文件,通过IBM Thread and Monitor Dump A ...

  6. 从 CPU、磁盘、内存、网络、GC 一条龙!JAVA 线上故障排查完整套路

    线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍.同时例如jstack.jmap等工具也是不囿于一个方面的问题的,基 ...

  7. java gc日志乱码_6000+字,30+张图。JAVA线上故障排查全套路总结。

     fredalxin|https://sourl.cn/duWZhd 线上故障主要会包括 cpu.磁盘.内存以及 网络 问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次 ...

  8. 一整套Java线上故障排查技巧,爱了!

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:腾讯推出高性能 RPC 开发框架 个人原创100W+访问量博客:点击前往,查看更多 来源:fredal.xin/ ...

  9. 线上故障排查全套路盘点,运维大哥请自查!

    [欢迎关注微信公众号:厦门微思网络] 线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍.同时例如jstack.jma ...

最新文章

  1. 不抓包,如何学得了 TCP
  2. wxWidgets:wxFont实例
  3. java java se_Java SE 7、8、9 –推动Java前进
  4. 打开软件就遍历桌面和D盘的软件名通过UDP广播的方式发出。服务器监听指定的端口可以获得文件夹名称。不会暴露自己的IP
  5. vue添加html开启服务器_vue服务端渲染添加缓存
  6. 基于关系推理的自监督学习无标记训练
  7. Scratch二次开发——如何创建单独的Scratch作品展示页?
  8. FIFO IP核的使用
  9. XMAN misc writeup
  10. 取消大小周易,取消周报难
  11. 计算机 90学时培训总结,90学时的培训心得体会
  12. STEAM上的一款电路模拟神器 — CRUMB Circuit Simulator
  13. Linux系统安全基础
  14. unity倍镜瞄准镜
  15. 含有一般疑问句的歌_七年级——一般现在时
  16. 大整数加减乘除的实现
  17. 【HTML5 笔记】基础内容
  18. 像素格式结构-PIXELFORMATDESCRIPTOR
  19. 驾驶证到期换证(SH)
  20. Halcon平铺tile三算子浅析

热门文章

  1. unity第三天:物体的碰撞器与触发器
  2. 牛客练习赛77 小G的约数(整除分块)
  3. 免费提供各种网络创业项目资源给你们(wcceo.com)
  4. 抖音广告怎么吸引用户?这三大方面不容忽视
  5. 火星在处女座(负的房子水星)在占星家夏尔马与Hemant
  6. M24C02和AT24C02读写失败的原因
  7. 瓦力机器人故障维修_管道故障“瓦力”上 机器人管网检测显身手
  8. 迪士尼、无聊猿,与IP帝国的崛起
  9. 柬埔寨最新咨讯及吴哥遗迹全接触
  10. flash 3d示例