WordPress.org

Make WordPress Core

Changeset 1010 in tests


Ignore:
Timestamp:
09/07/2012 08:11:29 PM (6 years 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.