Changeset 1900

Show
Ignore:
Timestamp:
08/31/2013 11:20:42 AM (8 months ago)
Author:
BrianKoontz
Message:

Fixed XSS vulnerability, affects only sites not running under
mod_rewrite. Refs #1153

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/wikka.php

    r1842 r1900  
    7171/**#@-*/ 
    7272// ----------------------------- END BASIC CONSTANTS --------------------------- 
     73 
     74// ----------------------------- HELPER FUNCTIONS --------------------------- 
     75/** 
     76 * Shamelessly lifted from libs/Wakka.class.php.  See that file for 
     77 * documentation, credits, etc. 
     78 * @see Wakka::hsc_secure() 
     79**/ 
     80if(!function_exists('hsc_secure')) 
     81{ 
     82        function hsc_secure($string, $quote_style=ENT_COMPAT) 
     83        { 
     84                // init 
     85                $aTransSpecchar = array('&' => '&', 
     86                                                                '"' => '"', 
     87                                                                '<' => '&lt;', 
     88                                                                '>' => '&gt;' 
     89                                                                );                      // ENT_COMPAT set 
     90                if (ENT_NOQUOTES == $quote_style)       // don't convert double quotes 
     91                { 
     92                        unset($aTransSpecchar['"']); 
     93                } 
     94                elseif (ENT_QUOTES == $quote_style)     // convert single quotes as well 
     95                { 
     96                        $aTransSpecchar["'"] = '&#39;'; // (apos) htmlspecialchars() uses '&#039;' 
     97                } 
     98 
     99                // return translated string 
     100                return strtr($string,$aTransSpecchar); 
     101        } 
     102} 
     103 
     104/** 
     105 * Shamelessly lifted from libs/Wakka.class.php.  See that file for 
     106 * documentation, credits, etc. 
     107 * @see Wakka::htmlspecialchars_ent() 
     108**/ 
     109if(!function_exists('htmlspecialchars_ent')) 
     110{ 
     111        function htmlspecialchars_ent($text,$quote_style=ENT_COMPAT,$doctype='HTML') 
     112        { 
     113                // re-establish default if overwritten because of third parameter 
     114                // [ENT_COMPAT] => 2 
     115                // [ENT_QUOTES] => 3 
     116                // [ENT_NOQUOTES] => 0 
     117                if (!in_array($quote_style,array(ENT_COMPAT,ENT_QUOTES,ENT_NOQUOTES))) 
     118                { 
     119                        $quote_style = ENT_COMPAT; 
     120                } 
     121 
     122                // define patterns 
     123                $terminator = ';|(?=($|[\n<]|&lt;))';   // semicolon; or end-of-string, newline or tag 
     124                $numdec = '#[0-9]+';                                    // numeric character reference (decimal) 
     125                $numhex = '#x[0-9a-f]+';                                // numeric character reference (hexadecimal) 
     126                if ($doctype == 'XML')                                  // pure XML allows only named entities for special chars 
     127                { 
     128                        // only valid named entities in XML (case-sensitive) 
     129                        $named = 'lt|gt|quot|apos|amp'; 
     130                        $ignore_case = ''; 
     131                        $entitystring = $named.'|'.$numdec.'|'.$numhex; 
     132                } 
     133                else                                                                    // (X)HTML 
     134                { 
     135                        $alpha  = '[a-z]+';                                     // character entity reference TODO $named='eacute|egrave|ccirc|...' 
     136                        $ignore_case = 'i';                                     // names can consist of upper and lower case letters 
     137                        $entitystring = $alpha.'|'.$numdec.'|'.$numhex; 
     138                } 
     139                $escaped_entity = '&amp;('.$entitystring.')('.$terminator.')'; 
     140 
     141                // execute our replacement hsc_secure() function, passing on optional parameters 
     142                $output = hsc_secure($text,$quote_style); 
     143 
     144                // "repair" escaped entities 
     145                // modifiers: s = across lines, i = case-insensitive 
     146                $output = preg_replace('/'.$escaped_entity.'/s'.$ignore_case,"&$1;",$output); 
     147 
     148                // return output 
     149                return $output; 
     150        } 
     151} 
     152 
     153/** 
     154 * Shamelessly lifted from libs/Wakka.class.php.  See that file for 
     155 * documentation, credits, etc. 
     156 * @see Wakka::GetSafeVar() 
     157**/ 
     158if(!function_exists('GetSafeVar')) 
     159{ 
     160        function GetSafeVar($varname, $gpc='get') 
     161        { 
     162                $safe_var = NULL; 
     163                if ($gpc == 'post') 
     164                { 
     165                        $safe_var = isset($_POST[$varname]) ? $_POST[$varname] : NULL; 
     166                } 
     167                elseif ($gpc == 'get') 
     168                { 
     169                        $safe_var = isset($_GET[$varname]) ? $_GET[$varname] : NULL; 
     170                } 
     171                elseif ($gpc == 'cookie') 
     172                { 
     173                        $safe_var = isset($_COOKIE[$varname]) ? $_COOKIE[$varname] : NULL; 
     174                } 
     175                return (htmlspecialchars_ent($safe_var)); 
     176        } 
     177} 
     178// ----------------------------- END HELPER FUNCTIONS -------------------------- 
    73179 
    74180// ------------ CRITICAL ERROR MESSAGES USED BEFORE LANG FILE LOADED ----------- 
     
    521627         */ 
    522628        $installAction = 'default'; 
    523         if (isset($_GET['installAction'])) $installAction = trim($_GET['installAction']);       #312 
     629        if (isset($_GET['installAction'])) $installAction = trim(GetSafeVar('installAction'));  #312 
    524630        if (file_exists('setup'.DIRECTORY_SEPARATOR.'header.php')) 
    525631        include('setup'.DIRECTORY_SEPARATOR.'header.php'); else print '<em class="error">'.ERROR_SETUP_HEADER_MISSING.'</em>'; #89 
     
    551657 * @todo files action uses POST, everything else uses GET #312 
    552658 */ 
    553 $wakka = $_GET['wakka']; #312 
     659$wakka = GetSafeVar('wakka'); #312 
    554660 
    555661/**