PHP Schwachstelle im Upload Skript? (Security)

/root

Lt. Commander
Dabei seit
Okt. 2007
Beiträge
1.285
Hallo Leute,

Ist das Upload Sript sicher?

Der Benutzer kann von einer HTML Seite einen Dateinamen eingeben ($filename) der dann von der lokalen Webseite mediaserver.intra heruntergeladen wird. Die Dateien sind dann über DLNA erreichbar.

Könnte man so nicht auch php files o.ä. uploaden (z.b. php-shells) und damit den webserver kompromittieren?

Ich hab mal nur eine Suche nach dem string "php" eingebaut (ist auskommentiert), reicht das oder habt ihr bessere Ideen für die Input Validation?

PHP:
<!DOCTYPE html>
<html>
<body>
<?php
$filename = $_GET["url"];
/*
if (strpos($filename,'php') !== false) {
    exit ("Upload was not successful: File not found!");
}
*/
$url = "http://mediaserver.intra/media/".$filename;
if(($content = file_get_contents($url)) === false) die("Upload was not successful: File not found!");:q
$extension = end((explode(".", $filename)));
switch($extension) {
  case "mp3":
    file_put_contents('/opt/media/audio/'.$filename, $content);
    break;
  case "mp4":
    file_put_contents('/opt/media/video/'.$filename, $content);
    break;
  case "png":
    file_put_contents('/opt/media/image/'.$filename, $content);
    break;
  default:
    die("Upload was not successful: Unknown extension!");
  }
echo "Upload was successful!";
$previous = "javascript:history.go(-1)";
if(isset($_SERVER['HTTP_REFERER'])) {
  $previous = $_SERVER['HTTP_REFERER'];
}
echo '<br><br><a href="'.$previous.'">Back</a>';

?>
</body>
</html>

lg
 
Dein ernst?

Zumindest mal den Inputstring satinizen, satinizen immer kontextsensitiv.

In dem Fall also alle Zeichen killen dir irgendwie als Filesystem-Anweisungen interpretiert werden können. Doppelpunkte, Slashes...
 
Und wo ist da das Upload-Script? Es wird doch bloß "http://mediaserver.intra/media/".$filename nach '/opt/media/audio/'.$filename geschrieben?! Wenn du nen Dateinamen erwartest, dann filter bitte auch danach. http://php.net/basename
 
ok, mit etwas recherche hab ich jetzt mal whitelisting probiert nachdem ich relativ genau weiß wie die files aussehen:

PHP:
// check input
$pattern = '/^[a-zA-Z0-9]+\.\b(jpg|mp4|mp3)\b$/';
$check=preg_match($pattern, $filename, $matches);
if ($check != 1) {
  die("denied");
}

reicht das?
 
Wenn du wirklich nur Files erwartest, keine Ordnerstrukturen... ja, sieht vernünftig aus.
 
Ist aber unbrauchbar, insofern Umlaute vorkommen (was bei Musik ja nicht selten vorkommt). Wenn dann doch bitte richtig mit Klassen (und Unicode-Modifier) oder besser
Code:
basename( $filename );
// oder
pathinfo( $filename, PATHINFO_BASENAME );
Die beiden \b-s sind übrigens überflüssig, da du ein Mal den Punkt und ein Mal das Ende matcht (trifft immer zu).
 
Hi,

ja, es geht nur um files.
danke für die hilfe! :schluck:
Ergänzung ()

@yuuri

meinst do so erweitern?

PHP:
$filename = $_GET["url"];
$filename=basename( $filename );
// check input
$pattern = '/^[a-zA-Z0-9]+\.(jpg|mp4|mp3)$/';
$check=preg_match($pattern, $filename, $matches);
if ($check != 1) {
  die("denied");
}

umlaute werden nicht benötigt, nur alphanumerische dateinamern erlaubt.
 
Zuletzt bearbeitet:
Zurück
Top