SVG XSS的一個黑魔法 2016-03-09

起因

深入研究這個SVG黑魔法大概用了我三個多小時的時間,起因是**@陳碩**小伙伴問了我一個XSS相關的問題,讓我很感興趣,隨后就深入研究了一下,整個過程很辛苦,但也很有趣。 :)

疑問

陳碩給了我兩個代碼,問我為什么一個可以執行,另一個不可以執行。

1、可以執行XSS的代碼:
<svg><script>alert&#40;1)</script>

如圖:

69823981

2、不可以執行XSS的代碼:
<script>alert&#40;1)</script>

那么問題來了,為什么加了<svg>的可以執行?

順騰摸瓜

@陳碩給了我一篇深入理解瀏覽器解析機制和XSS向量編碼讓我參考。

其中提到在HTML中有五類元素:

  1. 空元素(Void elements),如<area>,<br>,<base>等等
  2. 原始文本元素(Raw text elements),有<script><style>
  3. RCDATA元素(RCDATA elements),有<textarea><title>
  4. 外部元素(Foreign elements),例如MathML命名空間或者SVG命名空間的元素
  5. 基本元素(Normal elements),即除了以上4種元素以外的元素

五類元素的區別如下:

  1. 空元素,不能容納任何內容(因為它們沒有閉合標簽,沒有內容能夠放在開始標簽和閉合標簽中間)。
  2. 原始文本元素,可以容納文本。
  3. RCDATA元素,可以容納文本和字符引用。
  4. 外部元素,可以容納文本、字符引用、CDATA段、其他元素和注釋
  5. 基本元素,可以容納文本、字符引用、其他元素和注釋

按照文章中提到的html解析流程,解析到<svg>的時候會變成**標簽開始狀態(Tag open state),然后到標簽名狀態(Tag name state),等等,最終到數據狀態(Data state),并釋放當前標簽的token,當解析器處于數據狀態(Data state)**時,它會繼續解析,每當發現一個完整的標簽,就會釋放出一個token。

恍然大悟

按照上面的邏輯并沒有什么問題,但是主要問題是為什么XSS代碼執行了?

隨后在網上看了很多很多資料,查閱過的資料我會寫到文章最后的參考里面

深入理解瀏覽器解析機制和XSS向量編碼我們已經可以知道,svg屬于外部元素,也就是Foreign elements
whatwg中也有提到。

  • Foreign elements
    Elements from the MathML namespace and the SVG namespace.

可見Foreign elemnts來源于MathMLSVG命名空間。

MathML指的是什么?

191500825

**XML?。?!XML?。?!XML?。?!

那么我猜,<svg>遵循XMLSVG的定義。

我們知道,在XML中,&#40;會被解析成

代碼:

<xml>
	<name>aaa</name>
	<value>aaaaaaa&#40;</value>
</xml>

如圖:

3600381109

當然,SVG標準中也定義了script標簽的存在。

1175812720

所以,這個XSS之所以能夠執行是因為遵循了svg及xml的標準

總結&隨便說點什么

學XSS還是要深入了解原理啊!這里的原理指的不僅僅是js代碼,各種事件等等,而應該更深層次的去理解。

這應該是我第一次對技術上的東西這么刨根問底研究個透吧,真心非常感謝**@陳碩**,讓我感覺到了自己真的在成長。

參考資料

一级A片不卡在线观看