WordPress.org

Make WordPress Core

Changeset 1010 in tests


Ignore:
Timestamp:
09/07/12 20:11:29 (20 months ago)
Author:
ryan
Message:

Kses unit tests. Props duck_

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/kses.php

    r904 r1010  
    101101EOF; 
    102102 
    103     $this->assertEquals( $expected, wp_kses( $content, $allowedposttags ) ); 
     103        $this->assertEquals( $expected, wp_kses( $content, $allowedposttags ) ); 
     104    } 
     105 
     106    function test_wp_kses_bad_protocol() { 
     107        $bad = array( 
     108            'dummy:alert(1)', 
     109            'javascript:alert(1)', 
     110            'JaVaScRiPt:alert(1)', 
     111            'javascript:alert(1);', 
     112            'javascript:alert(1);', 
     113            'javascript:alert(1);', 
     114            'javascript&#0000058alert(1);', 
     115            'javascript:alert(1);', 
     116            'javascript:alert(1);', 
     117            'javascript:alert(1);', 
     118            'javascript:alert(1);', 
     119            'javascript:alert(1);', 
     120            '&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29', 
     121            'jav    ascript:alert(1);', 
     122            'jav	ascript:alert(1);', 
     123            'jav
ascript:alert(1);', 
     124            'jav
ascript:alert(1);', 
     125            '   javascript:alert(1);', 
     126            'javascript:javascript:alert(1);', 
     127            'javascript:javascript:alert(1);', 
     128            'javascript&#0000058javascript:alert(1);', 
     129            'javascript:javascript:alert(1);', 
     130            'javascript:javascript&#0000058alert(1);', 
     131            'javascript&#0000058alert(1)//?:', 
     132            'feed:javascript:alert(1)', 
     133            'feed:javascript:feed:javascript:feed:javascript:alert(1)', 
     134        ); 
     135        foreach ( $bad as $k => $x ) { 
     136            $result = wp_kses_bad_protocol( wp_kses_normalize_entities( $x ), wp_allowed_protocols() ); 
     137            if ( ! empty( $result ) && $result != 'alert(1);' && $result != 'alert(1)' ) { 
     138                switch ( $k ) { 
     139                    case 6: $this->assertEquals( 'javascript&#0000058alert(1);', $result ); break; 
     140                    case 12: 
     141                        $this->assertEquals( str_replace( '&', '&', $x ), $result ); 
     142                        break; 
     143                    case 22: $this->assertEquals( 'javascript&#0000058alert(1);', $result ); break; 
     144                    case 23: $this->assertEquals( 'javascript&#0000058alert(1)//?:', $result ); break; 
     145                    case 24: $this->assertEquals( 'feed:alert(1)', $result ); break; 
     146                    default: $this->fail( "wp_kses_bad_protocol failed on $x. Result: $result" ); 
     147                } 
     148            } 
     149        } 
     150 
     151        $safe = array( 
     152            'dummy:alert(1)', 
     153            'HTTP://example.org/', 
     154            'http://example.org/', 
     155            'http://example.org/', 
     156            'http://example.org/', 
     157            'https://example.org', 
     158            'http://example.org/wp-admin/post.php?post=2&action=edit', 
     159            'http://example.org/index.php?test='blah'', 
     160        ); 
     161        foreach ( $safe as $x ) { 
     162            $result = wp_kses_bad_protocol( wp_kses_normalize_entities( $x ), array( 'http', 'https', 'dummy' ) ); 
     163            if ( $result != $x && $result != 'http://example.org/' ) 
     164                $this->fail( "wp_kses_bad_protocol incorrectly blocked $x" ); 
     165        } 
     166    } 
     167 
     168    public function test_hackers_attacks() { 
     169        $xss = simplexml_load_file( DIR_TESTDATA . '/formatting/xssAttacks.xml' ); 
     170        foreach ( $xss->attack as $attack ) { 
     171            if ( in_array( $attack->name, array( 'IMG Embedded commands 2', 'US-ASCII encoding', 'OBJECT w/Flash 2', 'Character Encoding Example' ) ) ) 
     172                continue; 
     173 
     174            $code = (string) $attack->code; 
     175 
     176            if ( $code == 'See Below' ) 
     177                continue; 
     178 
     179            if ( substr( $code, 0, 4 ) == 'perl' ) { 
     180                $pos = strpos( $code, '"' ) + 1; 
     181                $code = substr( $code, $pos, strrpos($code, '"') - $pos ); 
     182                $code = str_replace( '\0', "\0", $code ); 
     183            } 
     184 
     185            $result = trim( wp_kses_data( $code ) ); 
     186 
     187            if ( $result == '' || $result == 'XSS' || $result == 'alert("XSS");' || $result == "alert('XSS');" ) 
     188                continue; 
     189 
     190            switch ( $attack->name ) { 
     191                case 'XSS Locator': 
     192                    $this->assertEquals('\';alert(String.fromCharCode(88,83,83))//\\\';alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//\\";alert(String.fromCharCode(88,83,83))//-->">\'>alert(String.fromCharCode(88,83,83))=', $result); 
     193                    break; 
     194                case 'XSS Quick Test': 
     195                    $this->assertEquals('\'\';!--"=', $result); 
     196                    break; 
     197                case 'SCRIPT w/Alert()': 
     198                    $this->assertEquals( "alert('XSS')", $result ); 
     199                    break; 
     200                case 'SCRIPT w/Char Code': 
     201                    $this->assertEquals('alert(String.fromCharCode(88,83,83))', $result); 
     202                    break; 
     203                case 'IMG STYLE w/expression': 
     204                    $this->assertEquals('exp/*', $result); 
     205                    break; 
     206                case 'List-style-image': 
     207                    $this->assertEquals('li {list-style-image: url("javascript:alert(\'XSS\')");}XSS', $result); 
     208                    break; 
     209                case 'STYLE': 
     210                    $this->assertEquals( "alert('XSS');", $result); 
     211                    break; 
     212                case 'STYLE w/background-image': 
     213                    $this->assertEquals('.XSS{background-image:url("javascript:alert(\'XSS\')");}<A></A>', $result); 
     214                    break; 
     215                case 'STYLE w/background': 
     216                    $this->assertEquals('BODY{background:url("javascript:alert(\'XSS\')")}', $result); 
     217                    break; 
     218                case 'Remote Stylesheet 2': 
     219                    $this->assertEquals( "@import'http://ha.ckers.org/xss.css';", $result ); 
     220                    break; 
     221                case 'Remote Stylesheet 3': 
     222                    $this->assertEquals( '&lt;META HTTP-EQUIV=&quot;Link&quot; Content=&quot;; REL=stylesheet"&gt;', $result ); 
     223                    break; 
     224                case 'Remote Stylesheet 4': 
     225                    $this->assertEquals('BODY{-moz-binding:url("http://ha.ckers.org/xssmoz.xml#xss")}', $result); 
     226                    break; 
     227                case 'XML data island w/CDATA': 
     228                    $this->assertEquals( "&lt;![CDATA[]]&gt;", $result ); 
     229                    break; 
     230                case 'XML data island w/comment': 
     231                    $this->assertEquals( "<I><B>&lt;IMG SRC=&quot;javas<!-- -->cript:alert('XSS')\"&gt;</B></I>", $result ); 
     232                    break; 
     233                case 'XML HTML+TIME': 
     234                    $this->assertEquals( '&lt;t:set attributeName=&quot;innerHTML&quot; to=&quot;XSSalert(\'XSS\')"&gt;', $result ); 
     235                    break; 
     236                case 'Commented-out Block': 
     237                    $this->assertEquals( "<!--[if gte IE 4]&gt;-->\nalert('XSS');", $result ); 
     238                    break; 
     239                case 'Cookie Manipulation': 
     240                    $this->assertEquals( '&lt;META HTTP-EQUIV=&quot;Set-Cookie&quot; Content=&quot;USERID=alert(\'XSS\')"&gt;', $result ); 
     241                    break; 
     242                case 'SSI': 
     243                    $this->assertEquals( '&lt;!--#exec cmd=&quot;/bin/echo &#039;<!--#exec cmd="/bin/echo \'=http://ha.ckers.org/xss.js&gt;\'"-->', $result ); 
     244                    break; 
     245                case 'PHP': 
     246                    $this->assertEquals( '&lt;? echo(&#039;alert("XSS")\'); ?&gt;', $result ); 
     247                    break; 
     248                case 'UTF-7 Encoding': 
     249                    $this->assertEquals( '+ADw-SCRIPT+AD4-alert(\'XSS\');+ADw-/SCRIPT+AD4-', $result ); 
     250                    break; 
     251                case 'Escaping JavaScript escapes': 
     252                    $this->assertEquals('\";alert(\'XSS\');//', $result); 
     253                    break; 
     254                case 'STYLE w/broken up JavaScript': 
     255                    $this->assertEquals( '@im\port\'\ja\vasc\ript:alert("XSS")\';', $result ); 
     256                    break; 
     257                case 'Null Chars 2': 
     258                    $this->assertEquals( '&amp;alert("XSS")', $result ); 
     259                    break; 
     260                case 'No Closing Script Tag': 
     261                    $this->assertEquals( '&lt;SCRIPT SRC=http://ha.ckers.org/xss.js', $result ); 
     262                    break; 
     263                case 'Half-Open HTML/JavaScript': 
     264                    $this->assertEquals( '&lt;IMG SRC=&quot;javascript:alert(&#039;XSS&#039;)&quot;', $result ); 
     265                    break; 
     266                case 'Double open angle brackets': 
     267                    $this->assertEquals( '&lt;IFRAME SRC=http://ha.ckers.org/scriptlet.html &lt;', $result ); 
     268                    break; 
     269                case 'Extraneous Open Brackets': 
     270                    $this->assertEquals( '&lt;alert("XSS");//&lt;', $result ); 
     271                    break; 
     272                case 'Malformed IMG Tags': 
     273                    $this->assertEquals('alert("XSS")"&gt;', $result); 
     274                    break; 
     275                case 'No Quotes/Semicolons': 
     276                    $this->assertEquals( "a=/XSS/\nalert(a.source)", $result ); 
     277                    break; 
     278                case 'Evade Regex Filter 1': 
     279                    $this->assertEquals( '" SRC="http://ha.ckers.org/xss.js"&gt;', $result ); 
     280                    break; 
     281                case 'Evade Regex Filter 4': 
     282                    $this->assertEquals( '\'" SRC="http://ha.ckers.org/xss.js"&gt;', $result ); 
     283                    break; 
     284                case 'Evade Regex Filter 5': 
     285                    $this->assertEquals( '` SRC="http://ha.ckers.org/xss.js"&gt;', $result ); 
     286                    break; 
     287                case 'Filter Evasion 1': 
     288                    $this->assertEquals( 'document.write("&lt;SCRI&quot;);PT SRC="http://ha.ckers.org/xss.js"&gt;', $result ); 
     289                    break; 
     290                case 'Filter Evasion 2': 
     291                    $this->assertEquals( '\'&gt;" SRC="http://ha.ckers.org/xss.js"&gt;', $result ); 
     292                    break; 
     293                default: 
     294                    $this->fail( 'KSES failed on ' . $attack->name . ': ' . $result ); 
     295            } 
     296        } 
    104297    } 
    105298} 
Note: See TracChangeset for help on using the changeset viewer.