Server Gehackt!

ruNN0r

Erfahrenes Mitglied
hi,
ich habe für einen Bekannten eine kleine Seite gemacht und lustigerweise wurde die Gehackt!
Ich kann mir nur nicht vorstellen wie!?
Die haben Dateien auf den Server hochgeladen mit denen die von dem Server Spammails verschicken... Aber wie haben die die Dateien da hin bekommen?

In dem PHP script gibt es auch einen Upload aber der ist begrenze auf JPG dateien und die Dateien werden gleich in einen anderen Ordner geschoben sowie umbenannt!

Meine Frage: Ist das möglich das jemand Dateien auf den FTP Server lädt durch mein PHP script? Sowas habe ich noch nie erlebt! FTP Passwort oder ähnliches ist nirgendwo preisgegeben!

Der Techniker meinte: Der fehler liegt schon in der Startdatei da sind zu viele Variablen drin! Das finde ich irgendwie absurd. Wenn ich eine function.php mache ist die vollgestopft mit Variablen.

Hoffe es hat jemand eine Antwort für mich. Danke euch
 
In dem PHP script gibt es auch einen Upload aber der ist begrenze auf JPG dateien und die Dateien werden gleich in einen anderen Ordner geschoben sowie umbenannt!

Meine Frage: Ist das möglich das jemand Dateien auf den FTP Server lädt durch mein PHP script?

Ja, aber:
Du musst uns schon deinen Code zeigen. Wie prüfst du, ob es ein JPG Bild ist? Wie bennenst du die Dateien um?

Sowas habe ich noch nie erlebt! FTP Passwort oder ähnliches ist nirgendwo preisgegeben!

Ich weiß nicht genau wie es bei FTP ist, aber auf meinen Windows Root Server läuft seit ich ihn hab (2 Jahre) ein Bruteforce Angriff auf das Remote Desktop Passwort. Das sind manchmal 50.000 Versuche am Tag. Da ich den Benutzer "Administrator" umbenannt hab, wird es nie zum Erfolg führen, aber da sind einfach Bots am Werk, die wahllos Server angreifen. Und wenn dein FTP Passwort nicht sehr lang ist, kann es durchaus geknackt werden.
Aber es ist wahrscheinlicher, dass dein Skript den Fehler enthält.
 
Also meine Dateien werden hochgeladen (in den Tempordner den der Server vorgibt) dann wird der Mimetype überprüft. Danach wird die Datei in einen anderen Ordner kopiert mit der Benamung: [ID].jpg
Das heißt die Datei heißt immer *.jpg also meiner meinung nach kann das nicht der Fehler sein! Daran ist auch nicht zu ändern selbst wenn jemand die variablen in der Adressleiste selber ferstlegen könnte!

Hier mal das script in dem sich angeblich zu viele Variablen befinden!
Bitte nicht lachen wegen den Bildervariablen. Er wollte das so! :D
PHP:
<?php
ob_start ();
session_start ();
include("cfg/mysql.inc.php");
include("cfg/functions.inc.php");
if($lang){
  setcookie("sprache","it",time()+3600);
}
$_lang=$_COOKIE['sprache'];
?>
<head>
  <title>Titel der Seite</title>

  <link rel='stylesheet' href='css/style.css' type='text/css'>
  <script language="JavaScript" src="js/bbcode.js"></script>
  <script language="JavaScript" src="js/cross.js"></script>

  <body class="css" onload='setBallon("BallonTip");'>
    <br>
    <?php
      if(file_exists("pics/$go.jpg")){
        $_pic="$go.jpg";
      }else{
        if($goto){
          if(file_exists("pics/7.jpg")){
            $_pic="7.jpg";

          }else{
            $_pic="1.jpg";
          }
        }else if($goto2){
          if(file_exists("pics/2.jpg")){
            $_pic="2.jpg";

          }else{
            $_pic="1.jpg";
          }
        }else{
          $_pic="1.jpg";
        }
      }
    ?>
    <table width='1000' cellpadding='0' cellspacing='0' align='center' class='border'>
      <tr>
        <td colspan='2'><img src='pics/<? echo $_pic; ?>'></td>
      </tr>
    <?php
      if(isset($login)){
        if($_POST['login_nick']=="***" && $_POST['login_pass']=="***"){
          $_SESSION['admin']=1;
        }else{
          echo"Login fehlgeschlagen. Falsche Logindaten";
        }
      }
      if($admin || $_SESSION['admin']==1){
        echo"<tr><td colspan='2'>";
        if($_SESSION['admin']==1){
          echo"
            Eingeloggt.
            <a href='start.php?goto2=n/news/make_news.php'>News Erstellen</a> |
            <a href='start.php?goto2=n/forum/kath_make.php'>Forum Kathegorie erstellen</a> |
            <a href='start.php?goto2=n/forum/kath_sort.php'>Forum Sortieren</a>
          ";
        }else{
          echo"
            <form action='start.php?admin=1' method='post'>
              Nick: <input type='text' name='login_nick'>
              Passwort: <input type='password' name='login_pass'>
              <input type='submit' name='login' value='Login'>
            </form>
          ";
        }
        echo"</td></tr>";
      }
    ?>
      <tr>
        <td colspan='2' height='30' bgcolor='#4C0F0A'>
          <?php
            include("menu.php");
          ?>
        </td>
      </tr>
      <tr>
        <td valign='top'>
            <?php

              $startseite="1.php";
              $error="error/404.php";

              if(!isset($go)){
                $go = "$startseite";
              }
              


              if(file_exists($go."_".$_lang.".php")){
                @include($go."_".$_lang.".php");
              }else if(file_exists($go.".php")){
                @include($go.".php");
              }else if(!empty($goto) || !empty($goto2)){
                @include($goto);
                @include($goto2);
              }else{
                @include($error);
              }




            ?>
        </td>
      </tr>
    </table>



  </body>
</head>
<?
ob_end_flush ();
?>
Noch zur Info: register_globals ist ON! Aber ich übergebe alle wichtigen Variablen wie z.B. logins usw. immer mit der $_Post[''] Methode. Andere Wichtige Variablen beginnen immer mit $_ und meines Wissens können solche Variablen nicht über die Adressleiste eingegben werden. Auch wenn würden diese sofort durch das einbinden der mysql.inc.php überschrieben werden! Also woran kann es liegen?
 
Zuletzt bearbeitet:
Um es mal mit den Worten von phpsec zu sagen :
[...]if your session mechanism consists of nothing more than session_start(), you are vulnerable.
Da ich bei dir ausser session_start() nichts sehen kann halte ich folgende Zeilen schonmal für problematisch
PHP:
if($admin || $_SESSION['admin']==1){
        echo"<tr><td colspan='2'>";
        if($_SESSION['admin']==1){
Was die Prüfung auf $admin soll ist mir sowieso schleierhaft. Erst recht bei register_globals ON.

Du scheinst dir außerdem mancher Sachen etwas zu sicher zu sein.
Remote File Inclusion / Local File Inclusion sind Stichwörter mit denen du dich mal auseinander setzen kannst.
 
$admin ist nur dazu da damit sich das Login öffnet. Ansonsten ist einfach "unsichtbar".

Also ich habe mir deine Stichwörter mal angesehen und folgendes gefunden:
http://blog.botnetzprovider.de/webserver-hacken-remote-file-inclusion-c99-php-shell/
das fand ich sehr interessant und irgendwie auch erschreckend! Ist das denn so einfach möglich? Wenn ich nun bei der Variable $admin den Pfad eintragen würde? dafür müsste ich doch eig. include($admin) machen oder nicht?
 
Zuletzt bearbeitet:
$admin ist nur dazu da damit sich das Login öffnet. Ansonsten ist einfach "unsichtbar".
Das fällt ganz schwer unter das Thema "Security through obscurity" und sollte vermieden werden.

Die Aussage "Der fehler liegt schon in der Startdatei da sind zu viele Variablen drin!" ist natürlich Schwachsinn. Da steckt genauso viel Wahrheit wie in "Wer einen längeren Deutschaufsatz schreibt der macht auch mehr Fehler.".
Die Wahrscheinlichkeit Fehler zu machen erhöht sich natürlich, aber die Anzahl der Variablen allein schon als Fehler zu bezeichnen ist ein bischen kurz gedacht.

Du solltest dich übrigens bei der Suche nach der anfälligen Datei nicht nur auf bestimmte Dateien beschränken, weil du alle anderen für sicher ( oder sogar "unsichtbar" ) hältst, sondern lieber alles checken.
 
Ich habe meinen Post oben geändert. beim abschicken habe ich gesehen das du geschrieben hast.

Also ich habe mir deine Stichwörter mal angesehen und folgendes gefunden:
http://blog.botnetzprovider.de/webserver-hacken-remote-file-inclusion-c99-php-shell/
das fand ich sehr interessant und irgendwie auch erschreckend! Ist das denn so einfach möglich? Wenn ich nun bei der Variable $admin den Pfad eintragen würde? dafür müsste ich doch eig. include($admin) machen oder nicht?


Also $admin würde ich durch $_GET['admin']ersetzen. Sollte ich so das Problem beheben wenn ich alle Dateien durchgehe und zusehe das alle Variablen richtig angesprochen werden?
 
Ich würde dir in deinem Falle davon abraten auch nur irgend etwas über die URL zu übergeben ($_GET[]), da die Daten dort direkt manipuliert werden können und noch mehr Schaden angerichtet werden könnte als eh schon geschehen.
Vllt. solltest du drüber nachdenken eine Art Startseite zu basteln, die den gesamten Content von einer Datenbank aus einließt - das würde zumindest das Problem deiner "unsichtbaren" Seiten beheben, falls das Ganze über eine Switch-Anweisung realisiert wird.

Trotzdem noch 'n schönen Abend.
 
ok dann werde ich die register_globals 0 setzen und die Seite ändern.
Jedoch wenn ich z.B. hier im Forum auf etwas gehe werden dort auch daten über die URL übergeben. Wie schützen die sich?
Aber was ich meist über die URL übergebe sind z.B. solche sachen:
Ich will eine News Löschen dann hänge ich den Wert (ID) in die URL. bei Register_globals 0 geht das nicht mehr. Also muss ich meine Variable per POST versenden. Aber bei einem Normalem Link geht das ja nicht so einfach...
Würde ich das Problem damit lösen können?
http://www.tutorials.de/javascript-tutorials/290694-x-href-mit-parametern-via-post-versenden.html
Leider sind da keine Antworten daher wollte ich hier nochmal nachfragen.
 
Du hast mich etwas falsch verstanden. Ich wollte nicht sagen das $admin die Schwachstelle in deinem Code ist.
Lass es mich nochmal kurz zusammen fassen.
1. Die Prüfung auf $admin um ein Login-Form zu verbergen ist unsauber. (s.o. Security through obscurity)
2. Du verlässt dich auf eine in einer Session gesetzten Variable ($_SESSION['admin']), das ist u.U. nicht so sicher wie du denkst. (s.o phpsec Guide
3. Mein Hinweis auf RFI / LFI bezog sich nicht auf $admin sondern auf includes mit Variablen:
Ich wäre beispielsweise in der Lage Dank folgender Zeilen in deinem Code beliebige Dateien zu inkludieren.Beispielsweise andere .php-Datein aber auch log-Dateien oder config/ini-Dateien usw.
PHP:
}else if(file_exists($go.".php")){
                @include($go.".php");

Du warst vermutlich der Annahme das wäre nicht möglich da du ein .php anhängst. Und das meinte ich mit
Du scheinst dir außerdem mancher Sachen etwas zu sicher zu sein.

//e

Ich will eine News Löschen dann hänge ich den Wert (ID) in die URL. bei Register_globals 0 geht das nicht mehr.
Wie kommst du denn darauf? Natürlich geht das noch.
 
Zuletzt bearbeitet:
Zurück