TED116: Sicherheit eines cgi-skripts

Hallöle,

als Anfänger in puncto cgi-Programmierung (perl) habe ich nun eine Frage an das Forum. Leider habe ich im Archiv noch nicht so das passende für mich gefunden.

Nachdem ich mittlerweile ein paar cgi-Programme geschrieben habe (Formularmailer, counter, Suchmaschine), sollten diese nun bevor sie ins WEB gestellt werden auf ihre Sicherheit überprüft werden. Gibt es da irgendwelche Tipps + Tricks?
Oder auf was muss ich achten?

viele Grüße und ein fröhliches Schaffen (auch wenn erst Dienstag ist).

TED116

  1. Moin,

    Nachdem ich mittlerweile ein paar cgi-Programme geschrieben habe (Formularmailer, counter, Suchmaschine), sollten diese nun bevor sie ins WEB gestellt werden auf ihre Sicherheit überprüft werden. Gibt es da irgendwelche Tipps + Tricks?
    Oder auf was muss ich achten?

    Im Web findet sich bereits zahlreiche Dokumentation zu Thema "cgi-security", Beispiel: http://cgi.resourceindex.com/Documentation/Security/.

    Dinge, die mir spontan zu diesem Thema einfallen sind (ohne Anspruch auf Vollständigkeit).

    • Als erstes sollte man peinlich genau darauf achten, daß  cgi-Skripte nur ausgeführt und nicht etwa downgeloadet werden können. Normalerweise sollte das kein Thema sein, aber bei einigen exotischeren Webservern sollte man wenigstens mal nachgucken...

    • Man kann sich in keiner Weise darauf verlassen, daß die Formularfelder, welche Du für das cgi-Skript vorgesehen hast, irgendetwas damit zu tun haben, was dann tatsächlich beim Skript ankommt. Es ist immer möglich, sich irgendein eigenes unsinniges Formular zu basteln und ein

    <form action="http://Dein.Ahnungsloses.CgiScript.com" method="post">

    voranzustellen.

    • Man kann sich auch nicht darauf verlassen, daß Zeichenketten aus Formularfeldern eine bestimmte Maximallänge nicht überschreiten. Bösartige User könnten z.B. in ein Feld mit der Bezeichnung "eMail" den Inhalt einer 5 MB großen Textdatei kopieren und das dann abschicken. Bei Perl ist dies aufgrund der automatisch-flexiblen Stringverwaltung meist weniger ein Problem als z.B. bei schlecht programmierten C-Programmen, in denen oft die Länge der String-Buffer fest begrenzt wird. Geschickte Hacker können sogar Buffer-Überläufe dazu ausnutzen, daß unerwünschter Code auf dem Server-Rechner ausgeführt wird. Eine Idee wäre evtl., gleich ganz am Anfang des Skriptes zu testen, ob CONTENT_LENGTH sich innerhalb vernünftiger Maßstäbe bewegt und im Falle von z.B. CONTENT_LENGTH>10^5 das Skript gleich abzubrechen oder so.

    • Wenn von perl aus Systemkommandos ausgeführt werden, ist besondere Vorsicht angesagt, da mittels pipe-Zeichen etc. harmlos aussehende Befehle zu völlig anderen umgemünzt werden können.
      Also aus allen Variablen, die in Systemkommandos eingehen, Zeichen wie < > usw. entfernen, oder besser noch eine Liste mit zulässigen Zeichen festlegen und alles andere herauslöschen.

    Ich hoffe, das hilft Dir für den Anfang erstmal weiter...

    Viele Grüße

    Andreas

  2. Tach!

    tststs..du wirst meinen Forum untreu :)

    als Anfänger in puncto cgi-Programmierung (perl) habe ich nun eine Frage an das Forum. Leider habe ich im Archiv noch nicht so das passende für mich gefunden.

    Nachdem ich mittlerweile ein paar cgi-Programme geschrieben habe (Formularmailer, counter, Suchmaschine), sollten diese nun bevor sie ins WEB gestellt werden auf ihre Sicherheit überprüft werden. Gibt es da irgendwelche Tipps + Tricks?

    In meinen Tutor findest du auf der vorletzten Seite etwas drueber.
    Ansonsten: Alle Benutzereingabe sind zu behandeln wie rohe Eier!
    Erst recht, wenn du diese nutzen willst, um damit Dateien anzusprechen, Mails
    zusenden oder allgemein Systemaufrufe ausfuehren willst.

    Wenn du mein web-Modul hast, schau dir mal die Routine Check_Name an.
    Dort sind die Empfehlungen des CERTs eingearbeitet, was man erlauben sollte bei Sonderzeichen..

    Der Antwort von Andreas Bierhals stimme ich ansonsten fast ueberall zu.
    Nur bei einem waere ich sehr vorsicht: Wenn du dir CGI-Skripts aus Archiven holst, dann musst du es dir vorher anschqauen.
    Insbesonders, und gerade auch das Standardarchiv cgi-resources.com enthaelt einige Skripts die unsicher sind. So z.B. das bekannte survey.cgi von BigNoseBird, welches dort ueber 1,5 Jahre war, von ueber 750 Leuten als eines der besten Skripten seiner Kategorie galt, aber trotzdem ein Sicherheitsloch hatte - was bis Anfang dieses Monats keiner der 750 fuer das Ding stimmten, bemerkt hatten...

    Ein Standard-Weg um Unsicherheiten festzustellen gibt es nicht, wohl aber Hinweise.

    ich fang meistens so an zu testen:
    1. grep "open" (cgi-skript)
    2. grep auf alle Variablen innerhalb der opens
    3. grep auf die Herkunft der Variablen
    4. Anschauen, wie das Parsing der Netzdaten gemacht wird.
    ...
    dito fuer system, touch, usw...

    Warauf man ueberhaupt nicht achten sollte ist:

    • Authorinfo; Wer das Skript geschrieben hat. Nur weil es von Matt Wright oder Lincoln Stein  ist, muss es nicht sicher sein. (Gerade bei erstem nicht). Jeder hat mal angefangen und  niemand weiss, welche Archive noch uralt-Versionen haben.
    • Urlange Kommentare...Um so mehr Erklaerungsbedarf um so argwoenischer werd ich.
      Jemand der taeglich Perl codet, macht Kommentare eigentlich nur fuer seine Kunden - fuer ihn/sie selbst ist perl und Kommentar daselbe :)
      Gemaessigte Kommentare sind ja gut...aber wenn jemand auf 80 Zeilen mehr als 60 Zeilen Kommentare hat....

    Ansonsten gibt es noch viel zu sagen. Aber eigentlich laeuft es auf eines heraus: Du kriegst frueher oder spaeter ein Gefuehl dafuer, was gut ist und was nicht...

    Ciao,
    Wolfgang

    1. Hi nochmal,

      einen Link hab ich vergessen. Schaut mal hier:

      http://www.xwolf.com/security/

      Ciao,
      Wolfgang