Daniel: Sicherheitslücken - Konkret!

Hallo zusammen

Oft wird von Sicherheitslücken in Scripts wie zum Beispiel PHP und ASP gesprochen. Kann mir mal konkrete Beispiele geben, was der Surfer oder eben der Hacker anrichten kann wenn dies und jenes falsch oder "unsicher" programmiert wurde? Wie muss ich mir das vorstellen? Muss ich z.B. bestimmte Werte (bestimmte Zeichenfolgen oder so...) bei Formulareingaben oder in einem Query-String abfangen?

Kennt ihr einen Link zu diesem Thema?

  1. Merhaba!

    Kennt ihr einen Link zu diesem Thema?

    Zunächst ist ASP eine einzige Sicherheitslücke (Meinung).
    Ansonsten (PHP) mach Dich schlau bezüglich
    htmlentities(), nl2br(), htmlspecialchars.
    Das kannst Du prima bei http://www.php.net/
    oder auch http://www.php3-forum.de/ tun.

    Grüße

    Ollie

    --
    Die Welt ist grau.
    Und bunt.
    sh:( fo:| ch:? rl:? br:& n4:( ie:| mo:| va:) de:> zu:) fl:| ss:| ls:[ js:|
  2. Moin!

    Kann mir mal konkrete Beispiele geben, was der Surfer oder eben der Hacker anrichten kann wenn dies und jenes falsch oder "unsicher" programmiert wurde? Wie muss ich mir das vorstellen?

    Angenommen, du hast folgenden Code:
    <?php
      if ($username == 'admin' && $password == 'geheim')
      {
        $adminlogin = 'ja';
      }
    ....

    if ($adminlogin=='ja')
      {
        show_admin_menu();
      }
    ....
    ?>

    register_globals ist eingeschaltet, die oben genannten Variablen $username und $password kriegen ihre Werte aus einem simplen Formular mit zwei gleichnamigen Textfeldern.

    Was passiert, wenn man die Seite aber über folgenden Link aufruft?
    seite.php?adminlogin=ja

    ...

    - Sven Rautenberg

    --
    ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
  3. Hi,

    Oft wird von Sicherheitslücken in Scripts wie zum Beispiel PHP und ASP gesprochen. Kann mir mal konkrete Beispiele geben, was der Surfer oder eben der Hacker anrichten kann wenn dies und jenes falsch oder "unsicher" programmiert wurde? Wie muss ich mir das vorstellen? Muss ich z.B. bestimmte Werte (bestimmte Zeichenfolgen oder so...) bei Formulareingaben oder in einem Query-String abfangen?

    eine ähnliche Diskussion wurde weiter unten schon vom Zaun gebrochen. Wichtig ist, dass Du Dir bewusst wirst, was Du verhindern willst. (Als Beispiel: mich interessiert nicht, wenn jemand meinen Querystring manipuliert und sich seine ANzeige kaputt macht, da alle daten des querystrings sich nur auf das beschränken)
    Desweiteren solltest Du keiner Angabe, die nicht von Dir ist, trauen. Darunter zählen Formulareinträge, Post-Get-Requests, Clientseitige Absicherungen usw.
    Es gibt in php Funktionen, die gewisse Dinge schon abfangen, wenn sie richtig eingesetzt werden.

    ciao
    romy

    --
    DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
    sh:( fo:| ch:? rl:( br:& va:| zu:) ss:| ls:[
    Die Erklärung zum Selfcode findest du hier: http://emmanuel.dammerer.at/selfcode.html
    Einen Decoder für den Selfcode findest du hier: http://peter.in-berlin.de/projekte/selfcode
  4. Hallo zusammen

    Moinsen

    Ja ähm zu ASP weiss ich nix aber allgemein trau ich da ASP ne Menge zu ;) Vor garnicht so langer Zeit gabs mal ne heftige Sicherheitslücke bei ASP indem man nach dem script.asp lediglich einen . hinten dran schreiben konnte um den Quelltext einzusehen! Und da wir ja wissen wie schnell Microsoft Fehler korrigiert dann würde ich doch von asp abraten, naja jedem das seine.
    Aber mit den Fehlern ist das so wie mit dem Autofahren: fährst du einen Mercedes Benz hast du noch lange nicht die Gewissheit das, wenn du gegen einen Baum fährst auch überlebst. Das gleiche wäre wenn du einen Smart fahren würdest oder was ähnliches. Es kommt immer auf den Fahrer drauf an! Klar mit einem besseren Auto hast du sicherlich bessere Chancen zu überleben aber ohne den richtigen Fahrer... das ist das gleiche wie mit den Programmierern.

    Naja jedenfalls solltest du mit Sicherheit besonders bei Formularen und so immer überprüfen, woher kommen die Inhalte, dann bevor du es in der DB speicherst alles überprüfen lassen auch error_reporting(E_ALL); anzeigen lassen usw...

    Beispiel für Formular:

    if(!isset($_POST['name'], $_POST['email'], $_POST['hp'], $_POST['inhalt']))
    {
       die("Bitte Benutzen sie das Formular aus dem Gästebuch\n");
    }

    oder beim inserten in die DB:

    mysql_query("INSERT INTO gast (name,email,open,hp,inhalt,datum) VALUES ('".addslashes(htmlspecialchars($_POST['name']))."','".addslashes(htmlspecialchars($_POST['email']))."','".addslashes(htmlspecialchars($_POST['open']))."','".addslashes(htmlspecialchars($_POST['hp']))."','".addslashes(htmlspecialchars($_POST['content']))."','$datum')") OR die(mysql_error());

    usw...

    leider habe ich persönlich noch keine guten Seiten oder was ähnliches über Sicherheit gefunden, das wäre jedoch mal sehr interessant sowas zu lesen!

    LG Christoph

    --
    Ich bin ein spezialisz!
    (Zitat von VENGA JO)
    sh:) fo:) rl:° br:& ie:| mo:) va:) fl:) ss:| ls:< js:|
    Die Erklärung zum Selfcode findest du hier: http://emmanuel.dammerer.at/selfcode.html
    Einen Decoder für den Selfcode findest du hier: http://peter.in-berlin.de/projekte/selfcode
    1. Moin!

      Beispiel für Formular:

      if(!isset($_POST['name'], $_POST['email'], $_POST['hp'], $_POST['inhalt']))
      {
         die("Bitte Benutzen sie das Formular aus dem Gästebuch\n");
      }

      Kann man machen, muß man aber nicht. Hängt davon ab, wie das Skript reagiert, wenn gewisse Felder nicht vorhanden sind. Die Schlussfolgerung "Wenn alle genannten Felder vorhanden sind, dann kommt der Request vom Gästebuchformular" ist jedenfalls nicht zutreffend.

      oder beim inserten in die DB:

      mysql_query("INSERT INTO gast (name,email,open,hp,inhalt,datum) VALUES ('".addslashes(htmlspecialchars($_POST['name']))."','".addslashes(htmlspecialchars($_POST['email']))."','".addslashes(htmlspecialchars($_POST['open']))."','".addslashes(htmlspecialchars($_POST['hp']))."','".addslashes(htmlspecialchars($_POST['content']))."','$datum')") OR die(mysql_error());

      Warum benutzt du hier addslashes? Und htmlspecialchars?

      addslashes solltest du nicht benutzen, sondern mysql_escape_string(). Außerdem solltest du in diesem Fall sicherstellen, dass Magic_quotes_gpc ausgeschaltet ist, ansonsten wäre es sehr ratsam, die dadurch hinzugefügten Slashes vorher mit stripslashes zu entfernen!

      htmlspecialchars sollte man ebenfalls nicht benutzen, wenn man die Texte in die Datenbank speichert. Natürlich sollte man sie _irgendwann_ benutzen - aber eben nicht beim Speichern in die DB. Ich vertrete die These, dass die Daten möglichst lange unbehandelt und uncodiert bleiben sollten, so dass man am Ende noch jederzeit eine Codierung für die gewünschte Ausgabe machen kann, ohne andere Codierungen wieder rückgängig machen zu müssen. Typisches Beispiel dafür ist z.B.: Wann soll man Zeilenumbrüche in <br> wandeln? Natürlich erst bei einer Ausgabe, die dies erfordert. Üblicherweise wird es nämlich irgendwo immer auch die Möglichkeit geben, das Gespeicherte wieder bearbeiten zu lassen. Textareas mögen keine <br>s, sondern nur normale Zeilenumbrüche...

      - Sven Rautenberg

      --
      ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
      1. Moin!

        Hi Sven,

        Kann man machen, muß man aber nicht. Hängt davon ab, wie das Skript reagiert, wenn gewisse Felder nicht vorhanden sind. Die Schlussfolgerung "Wenn alle genannten Felder vorhanden sind, dann kommt der Request vom Gästebuchformular" ist jedenfalls nicht zutreffend.

        Naja ich meinte damit ehern, das man die wichtigsten Felder vom Formular dann so absichert, man hätte ja auch sein eigenes Formular schreiben können und dieses dann abschicken können. Sollte aber jeder selber so wissen. Eine andere Möglichkeit wusste ich jetzt nicht :/

        Warum benutzt du hier addslashes? Und htmlspecialchars?

        addslashes solltest du nicht benutzen, sondern mysql_escape_string(). Außerdem solltest du in diesem Fall sicherstellen, dass Magic_quotes_gpc ausgeschaltet ist, ansonsten wäre es sehr ratsam, die dadurch hinzugefügten Slashes vorher mit stripslashes zu entfernen!

        Dafür sollte ich wohl noch etwas mehr Code posten, was davor noch kommt:
        if(get_magic_quotes_gpc())
        {
          array_stripslashes($_GET);
          array_stripslashes($_POST);
          array_stripslashes($_COOKIE);
        }

        Die dazu gehörige Funktion die included wird:
        function array_stripslashes(&$input)
        {
         if(is_string($input))
         {
          $input = stripslashes($input);
         }
         else
         {
          if(is_array($input))
          {
           foreach($input AS $key => $value)
           {
             array_stripslashes($input[$key]);
           }
          }
         }
        }

        Ja und deswegen habe ich vorher htmlspecialchars benutzt da man eigentlich seine Daten immer vorher überprüfen sollte da sonst es einem Hacker per XSS die Möglichkeit gegeben wird das Programm zu missbrauchen! Jedenfalls meine Meinung. Desweiteren sollte man noch die Zeichen ' " und \ escapen lassen, quasi müssen da ein \ vorschreiben lassen. Sicherlich fragst du Dich warum habe ich die denn jetzt weggemacht wenn ich sie wieder hinzufüge. Nehmen wir mal an ich benutze kein stripslashes(). Wenn magic_quotes an ist ist ja alles gut. Dann hat PHP für uns vorsorglich die Zeichen escapet. Doch was ist wenn PHP das nicht macht? Denn ob PHP dies macht oder nicht hängt von der php.ini Datei ab. Und wenn er es nicht macht, dann kann dies den ganzen MySQL-Query zerhauen. Denn dann ist das sowas wie eine " ohne \ in einem PHP-String, welcher mit " startet und endet. Also, lieber Vorsicht als Nachsicht.

        Ja ist halt so meine These, lasse mich jedoch gerne vom Fachmann belehren!

        - Sven Rautenberg

        LG Christoph

        --
        Ich bin ein spezialisz!
        (Zitat von VENGA JO)
        sh:) fo:) rl:° br:& ie:| mo:) va:) fl:) ss:| ls:< js:|
        Die Erklärung zum Selfcode findest du hier: http://emmanuel.dammerer.at/selfcode.html
        Einen Decoder für den Selfcode findest du hier: http://peter.in-berlin.de/projekte/selfcode
  5. Hi!

    Kennt ihr einen Link zu diesem Thema?

    Wurde ja schon einiges genannt, vielleicht hilft Dir auch noch das: http://www.dclp-faq.de/search.php?l=20&q=sicherheit&x=0&y=0

    Grüße
    Andreas

  6. Hiya Daniel,

    Kennt ihr einen Link zu diesem Thema?

    Einige, aber est mal die Frage wie gut ist dein English?
    Icc hab leider in den letzen Monaten lernen muessen das es mit den
    English-Kentnissen oft nicht sehr weit ist. :(

    gruesse aus'm ruhrpott
      jens mueller

    --
    Alles sollte so einfach wie möglich gemacht werden,
    - aber nicht einfacher. / Albert Einstein Physiker (1879-1955)
    1. Hiya Daniel,

      Hi

      Kennt ihr einen Link zu diesem Thema?

      Auch ohne Englisch: http://www.php.net/manual/de/security.php

      Gruß Christoph

      --
      Ich bin ein spezialisz!
      (Zitat von VENGA JO)
      sh:) fo:) rl:° br:& ie:| mo:) va:) fl:) ss:| ls:< js:|
      Die Erklärung zum Selfcode findest du hier: http://emmanuel.dammerer.at/selfcode.html
      Einen Decoder für den Selfcode findest du hier: http://peter.in-berlin.de/projekte/selfcode