2014-05-14 36 views
0

我試圖在教程網站上執行Reflective XSS攻擊。該網頁基本上由帶有輸入字段和提交按鈕的表單組成。提交表單時,輸入字段的內容顯示在同一網頁上。瀏覽器如何在一個編碼標籤內渲染這個內嵌JavaScript?

我發現該網站是黑名單腳本標記和一些JavaScript方法,以防止XSS攻擊。所以,我決定編碼我的輸入,然後嘗試提交表單。我嘗試了2個不同的輸入,其中一個工作,另一個沒有。

當我想:

<body onload="&#97lert('Hi')"></body> 

它的工作,並顯示一個警告框。但是,當我在HTML標記中編碼一些字符時,如:

&#60body onload="&#97lert('Hi')"&#62&#60/body&#62 

它沒有工作!它只是打印<body onload="alert('Hi')"></body>,因爲它在網頁上!

我知道瀏覽器在解析HTML文檔時執行內嵌JavaScript(請糾正我,如果我錯了)。但是,我無法理解瀏覽器爲什麼會針對我提到的不同輸入顯示不同的行爲。

---------------------------------------------- - - - - - - - -編輯 - - - - - - - - - - - - - - - - - -----------------------

我厭倦了一個沒有XSS保護的更基本的XSS教程。再次:

<script>alert("Hi")</script> - >工作!

&#60s&#99ript&#62&#97lert("Hi")&#60/s&#99ript&#62 - >沒有工作! (在網頁上打印爲字符串)

所以基本上,如果我在JavaScript中編碼任何東西,它的工作原理。但是,如果我編碼任何HTML,它不會執行該HTML內的JavaScript!

+0

*「我知道瀏覽器在解析HTML文檔時執行內嵌JavaScript」*這是正確的,但是您的內容不是內嵌JavaScript,它是一個onload事件。 ''會內嵌javascript。屬性確實被轉換爲一個字符串,其中的html實體替換爲實際的字符,這就是爲什麼您的頁面加載時的警報有效。 –

+0

啊!我明白。感謝您的澄清。 –

+0

-1 ?!太寬泛?!認真?我不認爲這個問題太寬泛。我只需要回答這個問題中提到的案例。我沒有要求完整的渲染過程! –

回答

1

當一個HTML頁面說&#60body它把它一樣,如果它說&lt;body

也就是說,它只是顯示的編碼的字符,不分析他們的HTML。所以,你沒有創造與onload一個新的標籤屬性http://jsfiddle.net/SSfNw/1/

alert(document.body.innerHTML); 
// When an HTML page says &lt;body It treats it the same as if it said &lt;body 
你的情況

所以,你永遠不會創建一個body標籤,只是內容最終得到搬進body標籤http://jsfiddle.net/SSfNw/2/

alert(document.body.innerHTML) 
// &lt;body onload="alert('Hi')"&gt;&lt;/body&gt; 

在案例<body onload="&#97lert('Hi')"></body>中,解析器能夠在body標籤內創建body標籤,並且還能夠創建onload屬性。一旦在屬性中,所有東西都被解析爲一個字符串。

+0

所以,問題是編碼的HTML編碼的字符不被解析?但是,如果我編碼警報方法,則可以將其作爲JavaScript進行檢測。這是我覺得有點混亂。 –

+0

謝謝!現在更清楚了。 –

2

我不能拿出話來描述正確,所以我只給你一個例子。比方說,我們有這個字符串:

<div>Hello World! &lt;span id="foo"&gt;Foobar&lt;/span&gt;</div> 

當這個被解析,你結束了一個div元素包含文本

Hello World! <span id="foo">Foobar</span> 

注意,雖然有一些看起來像HTML在文本內部,它仍然只是文本,而不是HTML。爲了使該文本成爲html,必須再次解析。

屬性的工作方式有點不同,屬性中的html實體第一次得到解析。

TL;博士:

如果您正在使用剔除標籤服務,沒有什麼可以做,除非劇本是寫在導致在字符串中得到解析兩次的方式知之甚少。

演示:http://jsfiddle.net/W6UhU/請注意如何設置div的內部html等於它的內部文本後,跨度成爲html元素而不是字符串。

+0

我明白這一點。但是瀏覽器解析HTML標籤和編碼HTML標籤的方式有什麼不同嗎?因爲,非編碼HTML正文標籤中的警報正在執行,但編碼標籤中的警告不是! –

+0

編碼後的html標籤保持不變,因爲您已經通過執行所述測試發現了該標籤。 html標籤的屬性被解析,而不是html標籤的字符串不會。 –

+0

好的。我想我這次得到了。因爲標籤沒有被編碼,所以它的屬性將被解析,並且這將執行警告方法。然而,在另一種情況下,由於標籤是編碼的,因此它將原樣離開標籤,因此,該屬性不被解析。如果我錯了,請糾正我。 –