先知社區的XSS挑戰,不只是過濾的繞過,還需要結合很多瀏覽器、HTML、CSS、JS的知識點,最後也只做出來9道題~~離2000的ECS還差那麼一點點_(:з」∠)_
完整writeup可以查看先知社區,部落格裏主要記錄我的一些解題思路。
0x01文件上傳
查看原始程式碼可以得知,這裡的觸發點在檔名
自測的情况下通過抓包修改可以成功彈窗,這道題的難點在於如何把一個self xss變成可以攻擊的向量。
當時首先想到了通過中間服務器POST表單進行提交,但是如何在表單中構造檔案就成了問題。
作為安全性原則,input標籤中的檔案類型在定義時會生成一個檔案對象,而服務端是沒有許可權來控制這個檔對象的,當然flash是否能够完成對檔案對象的控制這裡沒有嘗試,暫時存疑。
無法控制檔案對象,那麼是否能够通過POST數據來構造一個檔案提交呢?
這裡又有問題,text型的PSOT數據無法更改文件上傳時http頭中的boundary,最終還是在先知社區找到了解決方法。
https://xianzhi.aliyun.com/forum/read/224.html
通過<textarea>欄位可以偽造文件上傳。
在中間服務器上構造form表單,包含<textarea>欄位,再使用js自動表單提交。覈心程式碼是這一句
<textarea id="fileToUpload" name='fileToUpload"; filename="<img src=x onerror=alert(1)>121111.gif'>GIF89a hacked.gif</textarea>
這裡還有兩個點,一個是textarea沒有filename欄位,所以我們通過閉合引號來偽造,但是firefox和chrome會對雙引號進行轉義,囙此這種管道只能在IE11下成功。另一個點是上傳文件進行了檔案類型的檢測,這裡面最容易構造的是gif檔案。
0x04 referrer
觸發點在
所以需要中間頁面來跳轉,關於攜帶refer的跳轉管道可以參考這篇部落格
http://wps2015.org/2016/06/27/unusual-xss/
這裡的問題在於傳遞後中間refer會被firefox和chrome編碼,所以只在win7的IE11中測試成功了。
後來有大牛提到這裡可以使用flash做跳轉,就可以支持win10的IE,經過測試確實有效。
0x05跳轉
這道題使用
進行跳轉,只有跳轉失敗,才會執行到觸發點上,所以關鍵問題是如何跳轉失敗。
這個點過濾了crlf,囙此我當時想只能從協定下手,很自然的想到之前被提的較多的gopher協定,所以直接進行測試。
http://ec2-13-58-146-2.us-east-2.compute.amazonaws.com/xss5.php?url=gopher://'><script>alert(123)</script><'
發現沒有跳轉,能够進入觸發點,接下來就是構造傳統的payload了。
分析這個點之所以這樣,個人猜測是非http協定瀏覽器在進行執行時策略不同,不一定都是跳轉,有的可能是彈框,比如FTP,有的可能是加載相關挿件,比如迅雷的下載協定等。
0x06強制下載
和上一題類似,關鍵點在於不能讓
執行成功,這裡我使用%00%0a進行繞過,還可以通過fuzz去發現更多的bypass手段。
filename=%00%0a1.php&url=http://phantom0301.cc/alixss2.html
繞過後就可以執行到觸發點,觸發XSS。
0x07 text/plain
這道題有些迷,題目本身通過設定text/plain強制輸出文字,我們可以用MIME Sniffing去繞過,我構造了一個iso檔案,檔案中寫入paylaod,在相容模式下的IE11中可以觸發,而小夥伴另一個版本的IE11可以無條件觸發。由於需要相容模式的先決條件,所以這道題當時並不算通過。在這裡就不多說了,等待官方writeup。
0x10 MVM
考察的點是angularJS的範本注入,在兩個花括弧中angular會解析支持的操作。
網上關於這個點給出的paylaod是
\{\{constructor.constructor('alert()')()\}\}
一共40個字元(忽視我用來轉義的斜杠),為什麼要數字元數呢?因為這道題的難點在於限制字元只能小於36個。
對於懂angularJS的同學,這道題可能要簡單很多,我之前有研究過python的Jinja範本注入,其實兩者有很多相似之處。這個點無非是要通過constructor.constructor得到一個匿名函數類型,進而執行彈窗操作,那麼突破點就是如何能够構造一個盡可能短的匿名函數類型。
首先,我們要先得到一個JS的變數,為下一步用搆造函數得到底層的類型做準備,作為前端小白,只能對照angularJS的手册,一個個嘗試,我先後嘗試了’’,1,(),[]等多個資料結構,最後找到了如下paylaod
\{\{''.sub.constructor('alert()')()\}\}
剛剛好~~
0x12 preview
還是一個利用MIME Sniffing來完成的題。
題目請求url後,需要請求的資源符合所規定的MIME類型,利用這裡構造后綴名、檔案標識與Content-Type不符合的檔案進行請求,在IE11下能够成功彈窗。
http://ec2-13-58-146-2.us-east-2.compute.amazonaws.com/xss12.php?url=http://phantom0301.cc/img/1.avi
其中1.avi的內容如下
0x13 REQUEST_URI
觸發點如下
這道題上上面的一道題類似,通過GET變數添加的管道在php檔案後面攜帶paylaod
xss13.php?<script>alert(123)</script>
難點在於input標籤是hidden的,囙此一些on的事件無法成功觸發,同時使用htmlspecialchars過濾標籤。
這個在網上可以找到很多類似的討論,不用再這裡細說。
首先使用單引號閉合前一内容,新增accesskey標籤,使用onclick標籤,這樣在firefox下使用Ctrl+Shift+accesskey標籤值得組合就可以觸發onclick事件。
完整payload如下
0x16 PHP_SELF
RPO attack
將payload利用絕對路徑/相對路徑的管道寫入CSS檔案中,利用IE的CSS樣式XSS方法觸發彈框,我這裡只找到了IE7 IE6成功執行的payload。
0x17 passive element
div標籤中過濾尖括弧,同樣有很多種繞過手法,我這裡使用了和Hideen那道題一樣的觸發思路:
在需要快速鍵的情况下觸發成功。
小結
真正完成9道題,實現了11道題的彈框。裡面大多數題都需要自己去不斷嘗試,前前後後做了5天左右的樣子,頭腦風暴的感覺很好,而且幾道沒有做出來的題都有進一步fuzz測試的思路,可以對XSS整體有了更進一步的瞭解,而且包括瀏覽器差异、特殊字元差异等問題也值得去研究探索。