安全圈 | 专注于最新网络信息安全讯息新闻

首页

阿裡xss挑戰賽思路及poc

作者 galluppi 时间 2020-03-03
all

先知社區的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整體有了更進一步的瞭解,而且包括瀏覽器差异、特殊字元差异等問題也值得去研究探索。