目录
1.ma,Spaghet
2.Jefff
3.Ugandan Knuckles
4.Ricardo Milos
5. Ligma
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可以将字符串当作代码执行,但是,里面还是一层字符串,执行不了。