Shadowcrow: Remote File Include Vulnerability

Beitrag lesen

hi $name,

in einem include der (fast) überall eingebunden wird:

// Are we using the default language or user's choice?
function setupLanguage() {
global $config, $user_lang, $tb_language;

$path = $_SERVER['DOCUMENT_ROOT'] . $config['talkback_path'] . 'language/';

if ($_REQUEST['language'] && $_REQUEST['language'] != $config['default_language']) {
  // visitor has selected a language
  $language_file          = $path . $_REQUEST['language'] . '.php';


>   
> Genau hier ^^^ ist z.B. ein Punkt, an dem man ansetzen muss: Die Variable language kommt von außerhalb und wird ohne zu filtern in einen Pfad eingebaut! Was gibt language denn an? Dir hilft bestimmt einer Funktionen [basename](http://de.php.net/manual/de/function.basename.php) oder [dirname](http://de.php.net/manual/de/function.dirname.php) weiter.  
  
nach allem was ich sehen kann ist das das erste auftreten (initalisierung) der language\_file, hier wird der wert zugewiesen. die datei heißt commen\_functions und wird in die bandersnatch.php (das gästebuchscript) eingebunden und dieses ruft dann zur bildschirmausgabe die jubjub.php auf, und in der lag der hund begraben. in der jubjub.php wurde ungeprüft die language\_file includiert, was es ermöglichte ihr einfach einen neuen wert zuzuweisen.  
  
ich glaube zwar nicht, das da das probleml liegt, aber wäre es nicht möglich am ende der funktion (anstatt des return) einfach mit case "abfragen" welchen wert sie hat?  
~~~php
  
switch ($language_file) (  
 case "language/english.php"  
 return $language_file;  
  break 1;  
 case "language/german.php"  
 return $language_file;  
  break 1;  
 default:  
 $language_file = "language/english.php";  
 return $language_file; }

immerhin darf sie ja nur einen von zwei werten haben - englisch oder deutsch. das mag zwar so ziemlich jede eleganz vermissen lassen, müßte aber funktionieren?

und dann in der jubjub.php die language_file folgerndermaßen includieren:

  
switch ($language_file) (  
 case "language/english.php"  
 include "$language_file";  
  break 1;  
 case "language/german.php"  
 include "$language_file";  
  break 1;  
 default:  
 die (); )

wie gesagt: nicht schön aber selten.

sorry, falls ich nerven sollte, aber ich versuche da gedanklich durchzusteigen.

gruss und danke
shadow

--
If there's anything more important than my ego around, I want it caught and shot, now.