Mailinglisten-Archive |
Andreas Otto wrote: > > Wie ist in diesem Paket "--enable-force-cgi-redirect" gesetzt? Damit haben > > eine ganze Menge PHPLIB-Anwender Probleme und man hat wohl auch ein > > Sicherheitsloch, wenn es nicht gesetzt ist. > > hier der ausschnitt aus meiner config.w32.h > > #define FORCE_CGI_REDIRECT 1 Was macht FORCE_CGI_REDIRECT? ============================= kk_(at)_wwwx ~/Source/php3 $ find . -name \*.c -print0 | > xargs -0 grep -l FORCE_CGI_REDIRECT ./main.c Das Symbol tritt nur in main.c auf. Dort heißt es: kk_(at)_wwwx ~/Source/php3 $ less -N main.c 1454 /* Build the special-case PHP_SELF variable for the CGI 1454 version */ 1455 char *pi; 1456 #if FORCE_CGI_REDIRECT 1457 pi = GLOBAL(request_info).path_info; 1458 tmp.value.str.val = emalloc(((pi)?strlen(pi):0) + 1); 1459 tmp.value.str.len = _php3_sprintf(tmp.value.str.val, "%s 1459 ", (pi ? pi : "")); /* SAFE */ 1460 tmp.type = IS_STRING; 1461 #else 1462 int l = 0; 1463 char *sn; 1464 sn = GLOBAL(request_info).script_name; 1465 pi = GLOBAL(request_info).path_info; 1466 if (sn) 1467 l += strlen(sn); 1468 if (pi) 1469 l += strlen(pi); 1470 if (pi && sn && !strcmp(pi, sn)) { 1471 l -= strlen(pi); 1472 pi = NULL; 1473 } 1474 tmp.value.str.val = emalloc(l + 1); 1475 tmp.value.str.len = _php3_sprintf(tmp.value.str.val, "%s 1475 %s", (sn ? sn : ""), (pi ? pi : "")); /* SAFE */ 1476 tmp.type = IS_STRING; 1477 #endif 1478 _php3_hash_update(&GLOBAL(symbol_table), "PHP_SELF", siz 1478 eof("PHP_SELF"), (void *) & tmp, sizeof(pval), NULL); In Deutsch: Wenn wir ein CGI PHP bauen und FCR gesetzt ist, wird PHP_SELF als Kopie von PATH_INFO definiert. Wenn wir ein CGI PHP bauen und FCR nicht gesetzt ist, wird PHP_SELF als Catenation von SCRIPT_NAME und PATH_INFO gebaut. Das ist bei CGI PHP "falsch", weil dann der Interpretername mit im Pfad bei PHP_SELF erscheint (Der "/php/php.exe/test.php3"-Effekt). PHPLIB funktioniert so nicht, es sei denn, man tauscht alle Vorkommen von PHP_SELF durch PATH_INFO aus. Das ist nicht empfohlen, wegen des Sicherheitsproblems weiter unten. Außerdem entsteht folgendes Sicherheitsloch: 1679 #if FORCE_CGI_REDIRECT 1680 if (!getenv("REDIRECT_STATUS")) { 1681 if (php3_header()) 1682 PUTS("<b>Security Alert!</b> PHP CGI ca 1682 nnot be accessed directly.\n\ 1683 \n\ [ ... ] 1697 /* remove that detailed explanation some time */ 1698 1699 return FAILURE; 1700 } 1701 #endif /* FORCE_CGI_RED 1701 IRECT */ 1702 } Das bedeutet, ohne FORCE_CGI_REDIRECT sollte man problemlos auch von außen /php/php.exe/../../../../../../../etc/passwd aufrufen können, für die passende Anzahl von /../ und für die gewünschte Datei an Stelle von /etc/passwd. Ich weiß nicht, mit welchen Rechten PHP auf einer Windows- Kiste als CGI gestartet wird, aber unter Windows95/98 ist es natürlich root. Dies sind die beiden einzigen Stellen in PHP3, an denen das Symbol FORCE_CGI_REDIRECT in *.c-Dateien vorkommt. Man kann also zusammenfassend sagen, daß ein CGI PHP ohne FORCE_CGI_REDIRECT ein Dosenöffner ist und zwar sowohl auf Unix als auch unter Windows. Das entsprechende Binary sollte entfernt werden. Der Test besteht darin, für eine existierende Datei außerhalb der DocRoot /php/php.exe/../../ und so weiter aufzurufen und zu sehen, ob man den o.a. "Security Alert" bekommt. Wenn nicht -> PHP Interpreter austauschen. Ein PHP mit FCR ist auf Webservern nicht einsetzbar, die - CGI nicht endungsbasiert starten können (etwa: Netscape Server ohne Kwazy Redirect-Module). - die bei internen Redirects keine Variable REDIRECT_STATUS erzeugen (der Inhalt der Variablen ist egal). Dort muß man ein PHP ohne FCR einsetzen, mit den oben erwähnten Sicherheits- und Anpassungsproblemen. Es ist günstiger, in solchen Fällen nicht nur das PHP, sondern auch den Webserver auszutauschen, weil man sonst in Nullkommanix seine Kiste los ist ("You are owned!"). Kristian -- Kristian Köhntopp, NetUSE Kommunikationstechnologie GmbH Siemenswall, D-24107 Kiel, Germany, +49 431 386 436 00 Using PHP3? See our web development library at http://phplib.netuse.de/ (We have moved! Update your bookmarks!)
php::bar PHP Wiki - Listenarchive