Patrick Andrieu: Tainted Love again, .pl vs .cgi - Lese-Wink an Alexander(HH)

Beitrag lesen

Hallo Alexander!

Ich antworte hier in einem einzigen Beitrag auf Deine Postings, vielen Dank für Deine Mühe an dieser Stelle!

Was sagt Dir der Begriff KK-Antrag?

Ist mir bekannt! Nur, ich bin erst seit März 2007 bei 1&1 mit einem zweijährigen Vertrag... ich habe also etwas Zeit, mich umzusehen ;)

Ich weiß aus eigener Erfahrung mit 1&1, dass dort *S*E*H*R* merkwürdige Dinge mit Perl-Scripten passieren. Man setzt offensichtlich eine Kombination aus mod_rewrite, Server Side Includes und mod_perl/Apache::Registry ein. Die HTTP-Header im Environment passen jedenfalls so überhaupt nicht zu dem, was man normalerweise im CGI-Kontext für Perl-Scripte erwartet.

Ist mir aufgefallen. Abgesehen davon, dass es den Status-Code 500 kaum gibt (wird irgendwie redirected, denn in der access.log taucht er nie auf, sondern nur 200 - ich habe schon mehrmals berichtet), ist es mit den Umgebungsvariablen auch so eine Sache:

Umgebungsvariablen bei der Script-Einbindung mittels SSI

Beispiel gesuchter Ausgabe: /wae/wae_0.shtml = Pfad von aufrufender .shtml-Datei vom Document Root ausgehend...

lokal (Xitami auf Windows) = SCRIPT_NAME

lokal (Apache auf Windows) = DOCUMENT_URI bei <!--#exec cgi="/cgi-bin/script.pl"--> und <!--#include virtual="/cgi-bin/script.pl"-->, SCRIPT_URL in beiden Fällen undef

communitech (Apache auf UNIX) = DOCUMENT_URI bei <!--#exec cgi="/cgi-bin/script.pl"--> und <!--#include virtual="/cgi-bin/script.pl"-->, SCRIPT_URL nicht getestet

1&1 (Apache auf Linux) = SCRIPT_URL bei <!--#exec cgi="/cgi-bin/script.pl"--> und <!--#include virtual="/cgi-bin/script.pl"-->, DOCUMENT_URI ist bei <!--#include virtual="/cgi-bin/script.pl"--> undef

Weitere Seltsamkeiten, der Hashbang betreffend (nicht ausgeführt -> 500er):

1&1 (Apache auf Debian-Linux):
.pl wird ausgeführt auch mit #!perl oder #!perlhuhn
.cgi wird ausgeführt NUR mit #!/usr/bin/perl

Apache lokal:
.pl wird ausgeführt auch mit #!perl oder #!perlhuhn
.cgi wird ausgeführt NUR mit #!perl oder #!C:\perl\bin\perl.exe, NICHT ABER mit #!/usr/bin/perl (ScriptInterpreterSource registry)

Xitami lokal (*):
.pl wird ausgeführt auch mit #!perl aber nicht mit #!perlhuhn
.cgi wird ausgeführtauch mit #!perl aber nicht mit #!perlhuhn

(*) Allerdings ist der Xitami nicht relevant, gerade was SSI angeht. Bei der Shebang wird laut der eigenen Dokumentation lediglich nach »perl« gesucht, um die bei Windows damit verknüpfte Anwendung zu starten. Wahrscheinlich sogar mit Wortgrenzen, weswegen vermutlich »perlhuhn« nicht durchgeht (naja, sollte eigentlich auch nicht, oder *g*)... Ich nehme ihn aber gerne in der Tests mit ;)

Hast Du mod_perl aktiviert, dass auf .pl via Apache::Registry reagiert und zudem OHNE Taint-Mode läuft? Letzteres wäre ohnehin nicht sehr clever.
Nein. Weder lokal noch bei 1&1 ist mod_perl aktiv.
Letzteres glaube ich nicht so ganz.

Zumindest ist die Ausgabe von $ENV{'MOD_PERL'} leer (undef?), Du hattest mir den Tipp im letzten »Tainted Love«-Thread gegeben. Lokal bringt diese Umgebungsvariable auch keine Ausgabe, genauso wie $ENV{'MOD_PERL_API_VERSION'}.

print "MOD_PERL: $ENV{'MOD_PERL'}\n";
print "MOD_PERL_2: $ENV{'MOD_PERL_API_VERSION'}\n";

Das verstehe ich überhaupt nicht, sorry, ich habe von ZÄH keine Ahnung - von UNIX-Befehlen auch nicht, übrigens ;)
Ändere das.

Kommt Zeit, kommt (Er-)Kenntnis ;)

Was Du bei 1&1 beobachtest, ist, dass *.cgi anders behandelt wird als *.pl. *.cgi wird tatsächlich als stinknormales CGI ausgeführt, für *.pl läßt 1&1 irgendwelche "schwarze Magie" laufen, um trotz persistent laufendem Interpreter eine CGI-Schnittstelle zu simulieren -- leider nicht sonderlich gut.

Dazu kommen wir gleich mit den Ausgaben aus Deinem Skriptbeispiel.

Vermutlich. Sicher gehen kannst Du, indem Du ${^TAINT} auswertest: 0=aus, 1=richtig an, -1=halb an (Warnung statt Fehler).

Bei 1&1 vermutlich nur zu 1/4tel, sehen wir gleich...

Du lädst manuell hoch? Warum das? Schreibe ein Script, dass den Upload automatisiert, damit vermeidest Du jede Menge Fehler. Und ganz nebenbei kannst Du die Shebang-Zeile anpassen.

Ja, das ist eine Idee, danke - da war doch gerade dieses FTP-Modul...

Auf die Konfiguration beim Webhoster habe ich eh keinen Einfluß.
KK-Antrag

Jaja, ich weiß schon... ;)

perldoc perlsec
in ca. drei Wochen habe ich das vielleicht verstanden ;)
Nimm Dir zwei Stunden Zeit, mehr brauchst Du nicht.

Naja, drei Wochen war vielleicht übertrieben, aber mit »zwei Stunden« überschätzt Du meinen Englisch. Ich kann mich zwar gut unterhalten, Small Talk mäßig, aber Lesen und Schreiben, dazu noch Technisches, bereitet mir schon Schwierigkeiten.

Der Taint-Mode gibt nur jeder Variablen von "außen" ein weiteres internes Flag mit, dass bei allen Operationen an andere Variablen weitergegeben wird (logisches ODER), außer beim Extrahieren von Teilstrings per Pattern Matching (Eingabevalidierung). Einige wenige Routinen (open, system, exec) verweigern die Arbeit mit expliziten oder impliziten ($ENV{'PATH'}, ...) Parametern, die dieses Flag gesetzt haben. Einige wenige Libraries (mir fällt spontan nur DBI mit den Attributen TaintIn, TaintOut und Taint ein) *können* sich ebenso verhalten.

Danke für die Erläuterungen! Das mit »open« hatte ich irgendwo gelesen, aber noch kein Praxisbeispiel gesehen. Und nun zu Deinem Beispiel:

  1. /cgi-bin/nottaint.pl => ausgeführt, ${^TAINT} ist erwartungsgemäß 0.
  2. /cgi-bin/tainted.pl => 500 Internal Server Error
  3. /cgi-bin/tainted.cgi => als Quelltext ausgeliefert! - Trotz mode 0755 und CGI-Verzeichnis

Na, Strato und 1&1 reichen sich ja die Hand (mittlerweile lese ich, während ich diese Antwort zum zweiten Mal verfasse [**], weil mir der Browser vorhin abgeg... ist, dass sich Struppi zu Wort gemeldet hat, und ordentliche Ausgaben erzeugt), was?

Ausgabe bei mir:
1&1:
tainted.pl: Klick!
tainted.cgi: Klick!
nottaint.pl: Klick!

Und was sehen wir da? ${^TAINT} ist undef!!!

Ausgabe auf dem lokalen Apache:
tainted.pl: Internal Server Error [1]
tainted_ap.cgi [2]:
   Tainted Love
   Taint ist: 1
   INC ist: C:/Perl/lib, C:/Perl/site/lib
nottaint.pl:
   Tainted Love
   Taint ist: 0
   INC ist: C:/Perl/lib, C:/Perl/site/lib, .

Ausgabe auf dem lokalen Xitami:
tainted.pl:
   Tainted Love
   Taint ist: 1
   INC ist: C:/Perl/lib, C:/Perl/site/lib
tainted.cgi
   Tainted Love
   Taint ist: 1
   INC ist: C:/Perl/lib, C:/Perl/site/lib
nottaint.pl
   Tainted Love
   Taint ist: 0
   INC ist: C:/Perl/lib, C:/Perl/site/lib, .

[1] OK. Hier hat das also mit ScriptInterpreterSource zu tun, wie Du schon mal sagtest... Was aber ist bei 1&1 los? @INC wird erwartungsgemäß »geschrumpft«, ${^TAINT} ist aber leer?

[2] Ich musste die Shebang in #!perl -T -w ändern

[**] Daran merkt man, dass mich das Thema interessiert. Bei ca. einer halben Stunden Testerei und Tipperei hätte ich bei jedem anderen Themal aufgegeben ;)

Viele Grüße aus Frankfurt/Main,
Patrick

--

_ - jenseits vom delirium - _
[link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
Nichts ist unmöglich? Doch!
Heute schon gegökt?