Hallo, On Tue, 09 Apr 2002 at 23:38 (+0200), Ratti wrote:
Bernd Obermayr:
Also nicht script.cgi verarbeitet input, sondern script.cgi ruft ein weiteres script mit dem Parameter blablabla;rm -rf / auf.
Dieses zweite script sieht aber nur blablabla Das rm -rf / wird direkt von der Shell ausgefeuhrt
Es ist mir nicht gelungen, irgendwas anzurichten.
Verstehe ich was falsch, oder geht das doch gar nicht so?
Folgendes "sollte" funktionieren: =============== test_sec.cgi ================================================= #!/usr/bin/perl -wT use strict; use CGI; use CGI::Carp qw(fatalsToBrowser); use locale; # damit Umlaute als Wortzeichen erkannt werden my $q = CGI->new(); my $wort; $ENV{PATH} = ""; print $q->header("text/html"); print $q->start_html("Testseite für figlet"); $wort = $q->param("word"); ($wort) = $wort =~ /(.*)/; # Tainting "bescheissen" # sinnvoll wäre: ($wort) = $wort =~ /^([\w\d!?,]*)$/; unless ($wort) { print $q->h1("Fehler"), $q->p("Es wurde kein Parameter angegeben oder ungültige" . " Zeichen wurden verwendet!"); exit(1); } my $ausgabe = qx(/usr/bin/figlet $wort); print $q->h1("Ihre Ausgabe"), $q->pre($ausgabe), $q->p("Folgender Befehl wurde ausgeführt: " , $q->b("/usr/bin/figlet $wort"), " !"); print $q->end_html; ============================================================================== Folgender Aufruf zeigt die Sicherheitslücke klar: http://localhost/cgi-berwal/test_sec.cgi?word=Bernhard+%3B+%2Fbin%2Fls+%2F Statt GET POST zu verwenden, ist reiner Unsinn. Erstens verwendet man GET und POST nicht einfach wahlweise, sondern GET, wenn keine Daten auf dem Server verändert werden und POST, wenn das der Fall ist. Der Grund liegt im unterschiedlichen Browserverhalten z. B. bei Reloads. Zweitens lassen sich natürlich auch POST-Requests fälschen. Wer Sicherheitslücken ausnutzen will, weiß bestimmt, wie man das macht. Sicherheit bringt nur, _jede_ Eingabe genauestens zu prüfen. Das obige Beispiel bringt bei mir übrigens folgende Ausgabe (mit w3m): ============================================================================== Ihre Ausgabe ____ _ _ | __ ) ___ _ __ _ __ | |__ __ _ _ __ __| | | _ \ / _ \ '__| '_ \| '_ \ / _` | '__/ _` | | |_) | __/ | | | | | | | | (_| | | | (_| | |____/ \___|_| |_| |_|_| |_|\__,_|_| \__,_| MakeQPWords.pm adressbuch.cgi aktuelle_zeit.cgi alkoholrechner.cgi bild.cgi bottom.cgi bundeswehr.cgi [...] Folgender Befehl wurde ausgeführt: /usr/bin/figlet Bernhard ; /bin/ls ! ============================================================================== Anm.: Wenn ich die $PATH-Variable nicht verändert hätte, hätte übrigens ein einfaches ls gereicht. So muss man /bin/ls verwenden. Da dies auf ziemlich allen Unix-Systemen/Linux-Systemen gleich sein dürfte, stellt dies aber kein wirkliches Hindernis dar. Ach ja: Ich weiß, dass man im Grund wesentlich mehr Zeichen zulassen hätte können, dass my $ausgabe = qx(/usr/bin/figlet '$wort'); (man beachte die Anführungszeichen) schonmal nicht schlecht ist etc. Sollte ja nur eine Demonstration sein. Gruß, Bernhard -- "Der Mensch erfand die Atombombe, doch keine Maus der Welt würde eine Mausefalle konstruieren." -- Albert Einstein