一些有趣的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可以将字符串当作代码执行,但是,里面还是一层字符串,执行不了。

相关推荐
活宝小娜2 小时前
vue不刷新浏览器更新页面的方法
前端·javascript·vue.js
程序视点2 小时前
【Vue3新工具】Pinia.js:提升开发效率,更轻量、更高效的状态管理方案!
前端·javascript·vue.js·typescript·vue·ecmascript
coldriversnow2 小时前
在Vue中,vue document.onkeydown 无效
前端·javascript·vue.js
我开心就好o2 小时前
uniapp点左上角返回键, 重复来回跳转的问题 解决方案
前端·javascript·uni-app
开心工作室_kaic3 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
刚刚好ā3 小时前
js作用域超全介绍--全局作用域、局部作用、块级作用域
前端·javascript·vue.js·vue
沉默璇年4 小时前
react中useMemo的使用场景
前端·react.js·前端框架
yqcoder4 小时前
reactflow 中 useNodesState 模块作用
开发语言·前端·javascript
2401_882727575 小时前
BY组态-低代码web可视化组件
前端·后端·物联网·低代码·数学建模·前端框架
SoaringHeart5 小时前
Flutter进阶:基于 MLKit 的 OCR 文字识别
前端·flutter