一些有趣的XSS注入GAME

目录

1.ma,Spaghet

2.Jefff

[3.Ugandan Knuckles](#3.Ugandan Knuckles)

[4.Ricardo Milos](#4.Ricardo Milos)

[5. Ligma](#5. Ligma)

[6.Ah That's Hawt](#6.Ah That's Hawt)

7.Msfia

8.Ok,Boomer


1.ma,Spaghet

innerHTML :设置 innerHTML 的值可以让你轻松地将当前元素的内容替换为新的内容。

HTML 5 中指定不执行由 innerHTML 插入的 <script> 标签。

payload: ?somebody=<img%20src=1%20οnerrοr="alert(1337)"%20>

2.Jefff

innerTEXT:在一个节点上设置 innerText 会移除该节点的所有子节点,并用给定的字符串值的单一文本节点代替它们。

简单说就是标签不起作用,直接当成字符串了

setTimeout:全局的 setTimeout() 方法设置一个定时器,一旦定时器到期,就会执行一个函数或指定的代码片段。只能执行一次

所以:这里只能从eval这里破局!

首先通过引号闭合前面的内容,让我们的执行的命令逃逸出来!然后在闭合后面的引号

3.Ugandan Knuckles

可以看见这里被<>被过滤了

我们可以想到onclick这个属性

但是这样写的话有点不满足要求,因为它与用户交互了

input使用这样一个属性 onfocus ,autofocus

这里autofucus默认是yes.

4.Ricardo Milos

这里action为注入点

5. Ligma

这里过滤了英文和数字

这样感觉有点无从下手的感觉,这里只能使用编码了,看下源码!

jsfuck编码

由于URL不识别有些符号,需要对它进行URL编码

6.Ah That's Hawt

分析代码发现()不能使用了

试试能不能通过编码的方式来代替()

但是简单的使用%28 %29并不起作用

因为当浏览器将数据传到后端以后,因为转为()了,还是会被过滤

将%编码试试,%25,这样到后端以后就会变成%28 %29,如果js能够解码的话,最后传到页面的时候在解码%28,%29为(),这样不就实现了嘛

但是,js对符号并不进行解码,只对字符串和标识符进行编码。

那能不能将这一串变为字符串,然后对其解码呢?

当然是可以的,location,可以将其后面的内容当作字符串

7.Msfia

这里当alert,confirm prompt都不能使用

这里有三个方法:

方法1:匿名函数

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

Function()() 第二个括号的作用,为了执行第一个括号里面的内容

这里得/ /代表之前得是函数,固定格式

方法2:

parseInt 和toString两个搭档

parseInt('alert',30) 得到一个数n,n..toString(30)就变回来了

注意:这里只能30以上36以下,因为30进制才包含t,parseInt最大只能写36

不过这里需要的是:toString转换之后是字符串

需要使用alert()将其当成js代码执行

方法3:

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

location.hash可以获取#后面的值,#后面的值不会被认为传递的参数

但是得到的是一个字符串,我们需要执行它

最终的payload:?mafia=eval(location.hash.slice(1))#alert(1337)

8.Ok,Boomer

由于我们的输入被过滤框架过滤了,所以,这里基本上没什么希望了

然后我们将目光放在了setTimeOut这个函数这里

发现它2s后执行了一个ok。感觉没啥用

那如果我们能够将这个OK换成我们注入的代码,那是不是就实现注入了呢?

这里需要用到一个DOM破坏的知识

举个栗子:

通过这种方式我们就可以拿到这个标签

通过这种方式我们可以执行标签里面的内容,但是发现它返回的是HTMLFormElent这个玩意

我们写的不是dadsa吗,怎么输出个这个

那是因为:所以元素的顶点就是object,object得toString方法最终得到得是一个元素,如果没有自己的toString方法的话,将会继承object的,返回类似这样的一个值

那怎么得到一个有自己toString方法的元素呢?

复制代码
Object.getOwnPropertyNames(window) .filter(p => p.match(/Element$/)) .map(p => window[p]) .filter(p => p && p.prototype && p.prototype.toString !== Object.prototype.toString)

我们可以得到两种标签对象:HTMLAreaElement ()& HTMLAnchorElement ()

HTMLAnchorElement () 就是a标签,它会将href属性后面内容当字符串输出

利用这点,我们可以实现恶意代码注入

全局的 setTimeout() 方法设置一个定时器,一旦定时器到期,就会执行一个函数或指定的代码片段。setTimeout()可以允许将函数当作字符串执行,a 标签得href可以自动替换成字符串

OK,答案一下就出来了

我们可以<a id=ok href="javascript:alert(1337)">

但是,发现没反应。那是因为javascript被这个框架过滤了,黑名单

换一个它白名单里面的就行了

但是!经过测试,并不是所有的都行

tel ,cid callto 这三个都行

总结:a标签可以让href属性后面内容当作字符串,而不是返回object对象

当我们执行标签代码时,标签会调用toString方法,将内容转换为字符串

我发现一个有意思的点:

href后面转化为我们想要的字符串了

这样看起来没什么问题

这样又有问题了

又正常了

这说明setTimeout执行的是alert函数,而前面的javascript:应该是每传进来,不然就语法错误。

我理解的是javascript:将后面的alert字符串替换成alert js代码,类似于eval的作用,传进setTimeout的时候就不是字符串,而是js代码

但是setTimeout()传进去又变成字符串了,不过不影响,它能将字符串当函数执行

是不是糊涂了

如果我们不经过前面的javascript:将其变成字符串,那么传进去后时候就会带两个引号,那么就算setTimeout可以将字符串当作代码执行,但是,里面还是一层字符串,执行不了。

相关推荐
mldong12 分钟前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排1 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60611 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角2 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!3 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰3 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi4 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen5 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马6 小时前
AI源码分析:拆解模型底层实现逻辑
前端
IT_陈寒6 小时前
React子组件莫名其妙重渲染?你可能漏了这个Hook
前端·人工智能·后端