2012-11-07 7 views
7

Zauważyłem, że możliwe jest uruchamianie pliku przez PHP, nawet jeśli jego rozszerzenie nie było .php, na przykład plik test.xyz.php.whatever.zyx może być nadal uruchomiony z PHP, nawet jeśli rozszerzenie nie jest .php! Tak się składa, że ​​w nazwie pliku jest .php. i to wystarczy, aby mój Apache mógł uruchomić skrypt PHP.Jak bezpiecznie uniemożliwić uruchomienie przesłanego pliku za pośrednictwem PHP na dowolnym serwerze?

próbowałem (jak ktoś zasugerował), aby umieścić to w pliku .htaccess tego folderu:

php_flag engine off 

Ale to nie działa na moim komputerze.

Jedyne rozwiązania wiem na teraz to:

  • Zmień nazwę, aby znane rozszerzenia pliku, który nie jest prowadzony za pośrednictwem PHP, takich jak .txt.
  • Usuń wszystkie kropki z nazwy pliku, dzięki czemu nie ma żadnych rozszerzeń.

Ale nadal nie jestem pewien, w jaki sposób te rozwiązania będą działać na innych serwerach niż mój serwer Windows (z Apache).

Czy istnieją inne rozwiązania, które nie wymagają nazwy pliku w żaden sposób zmieniany?

+0

Zmiana nazwy plików jest zalecana z punktu widzenia bezpieczeństwa. również, sprawdź http://stackoverflow.com/questions/3499173/my-php-site-was-hacked-by-codes-uploaded-as-image, dlaczego powinieneś także dodać pewne polecenia do pliku php.ini – SeanC

+0

@ SeanCheshire, dzięki za cynk. teraz, jeśli połączę to z odkryciami, o których powiedziałem, założę się, że wiele innych stron będzie można z nim hakować. (zbyt leniwy, aby sprawdzić się również, jego nielegalne;). – Rookie

+0

nie zawsze nielegalne: http://www.hackthissite.org/ – SeanC

Odpowiedz

1

Zamiast php_flag engine off można usunąć program obsługi plików PHP przy użyciu pliku .htaccess dla pojedynczego katalogu.

W katalogu są wyłączenie w PHP, Twój .htaccess powinien zawierać:

RemoveHandler .php .phtml .php3 .php4 .php5 
RemoveType .php .phtml .php3 .php4 .php5 

można prawdopodobnie uciec z niżej jednak, w zależności od AddHandler rodzaje skonfigurowaniu w domyślnej konfiguracji serwera Apache, który, na oknach, powinny być w C:\Program Files\Apache<version>\conf\httpd.conf

RemoveHandler .php 
RemoveType .php 

Potrzebny będzie również do zapewnienia, że ​​w głównym pliku konfiguracyjnym Apache, że katalog zawierający plik .htaccess jest, jest objęty Directory oświadczenie, które ma zestaw AllowOverride FileInfo. Możesz rozważyć użycie AllowOverride All, jeśli będziesz używał plików .htaccess do innych celów - patrz the Apache documentation for AllowOverride, aby uzyskać wyjaśnienie różnic.

+0

To jest duża lista typów do usunięcia, skąd mam wiedzieć, które typy powinienem tam umieścić? Do czego służy funkcja "AllowOverride FileInfo"? i który z nich byłby lepszy 'All' lub' FileInfo'? – Rookie

+0

Odnośnie pierwszego pytania - powinieneś wymienić wszystkie typy, które są zarejestrowane jako programy obsługi skryptów PHP. To będzie się różnić w zależności od konfiguracji. Możesz to sprawdzić, analizując główną konfigurację HTTPd (Apache) dla istniejących linii 'AddHandler'. Zakładając, że zainstalowałeś się w standardowej lokalizacji, Apache dla Windows umieszcza to w 'C: \ Program Files \ Apache2.2 \ conf \ httpd.conf'. –

+0

Odnośnie drugiego pytania - AllowOverride kontroluje typy dyrektyw konfiguracyjnych Apache, które można przesłonić za pomocą pliku .htaccess dla danego katalogu. Ze względów bezpieczeństwa należy ograniczyć to do minimum w środowisku produkcyjnym. Zaktualizowałem swoją odpowiedź w odniesieniu do różnic. –

0

nie jest to dobra odpowiedź, ale mam nadzieję przydatna w niektórych szczególnych przypadkach ...

można użyć mod_rewrite w pliku .htaccess jak ten:

RewriteRule ^(.+).xyz.php.whatever.zyx$ index.php?openfile=$1 [NC,L] 

i wewnątrz pliku index.php:

$file = secure_this_string($_GET['openfile']); 
include($file.'.xyz.php.whatever.zyx'); # or some other files 

pamiętaj, aby zobaczyć tę odpowiedź ze względów bezpieczeństwa StackOverFlow

aw test.xyz.php.whatever.zyx pliku:

<?php echo 'hello'; 

teraz jeśli klient żąda /test.xyz.php.whatever.Plik ZYX, obecnie wprowadzone powinny być „hello”

+0

, więc działa to tylko wtedy, gdy nazwa pliku to 'xyz.php.whatever.zyz' lub inna predefiniowana nazwa pliku? – Rookie

+0

wszystko może pasować do tego wiersza:^(. +). Xyz.php.whatever.zyx $ i możesz go zmienić na inny typ:^(. +). Txt $ –

5

do przesyłania przez użytkowników Sugeruję przesłać folder w warstwie powyżej ścieżki korzenia w tym przypadku tylko masz dostęp do przesyłania folderu (w bezpośrednim adresowania) i atakujący nie mają dostępu do wszystkich plików w tym folderze zatem wyłączyć działanie atakującemu uruchomienie szkodliwego pliku

3

Przede wszystkim trzeba zrozumieć, co się dzieje tutaj:

test.xyz.php.whatever.zyx 

taki plik na serwerze internetowym na swój własny nie zrobiłby nic. Dodana tylko konfiguracja mówi Apache'owi, aby wykonywał PHP na tym pliku.

Więc jeśli usunąć ten dodatek konfiguracji Apache nie obchodzi znaleźć .php tam - czy to na samym końcu lub części ułożone file-extension.

Sprawdź, który handler ustawiony dla php w konfiguracji serwera. Usuń go z katalogu przesyłania. To nie rozwiąże żadnych problemów konfiguracyjnych, które możesz mieć z przesłanymi plikami, jednak pliki PHP nie są wykonywane przez PHP dłużej - to jest to, co chcesz, jeśli dobrze cię zrozumiałem.

Jeśli masz problem, aby dowiedzieć się, o co w tym chodzi, musisz opublikować swoją konfigurację PHP w pliku httpd.conf i powiązanych plikach konfiguracyjnych Apache HTTPD dla swojego systemu.

Dyrektywa ktoś powiedział ci o .htaccess:

php_flag engine off 

działa tylko jeśli PHP działa jako moduł Apache SAPI.

+0

Coś przyszło mi teraz do głowy : myślę, że powodem, dla którego to działa, jest zezwolenie na wykonywanie takich plików, jak 'funny.php.lib'? – Rookie

+1

Nie, to nie jest powód. Również nazywanie plików PHP w taki sposób jest okropną i złą praktyką. Takie nazwy plików wymagają naprawy. Powodem, dla którego Apache to robi, jest więcej z powodu [* Negocjacji treści *] (http://httpd.apache.org/docs/2.2/content-negotiation.html). Jest to w zasadzie cała konfiguracja serwera, więc skonfiguruj serwer WWW Apache w ten sposób, aby działał zgodnie z oczekiwaniami. – hakre

0

Proste regex by wykonać zadanie

<?php 
$a = strtolower($_FILES["file"]["name"]); 
$replace = array(".php", ".phtml", ".php3", ".php4", ".php5"); 
$_FILES["file"]["name"] = str_replace($replace, "", $a); 
?> 

Działa to dobrze na dowolnym serwerze

+0

obecnie właśnie robię 'str_replace (". "," - ", $ basename)', nie trzeba myśleć o wszystkich możliwych rozszerzeniach. – Rookie

0

mogę odtworzyć problem dość łatwo na naszym serwerze. Jest sposób, aby to naprawić, trzeba edytować /etc/mime.types i wykomentuj linie

#application/x-httpd-php        phtml pht php 
#application/x-httpd-php-source     phps 
#application/x-httpd-php3      php3 
#application/x-httpd-php3-preprocessed   php3p 
#application/x-httpd-php4      php4 
#application/x-httpd-php5      php5 

linie te powodują coś z .php w nazwie mają być przetwarzane. Po wykomentuj wpisy w mime.types, mod_php config w /etc/apache2/mods-enabled/php5.conf ma to wejście, które poprawnie tylko przetwarza pliki ZAKOŃCZENIE z .php

<FilesMatch "\.ph(p3?|tml)$"> 
    SetHandler application/x-httpd-php 
</FilesMatch> 

Co jest NAPRAWDĘ STRASZNE jest to domyślna konfiguracja (w naszym przypadku Ubuntu 10.04).


EDIT

W systemie Windows plik mime.types powinny być w apache_home/conf/MIME.Typy

5

Aby być całkowicie bezpieczne, trzeba zrobić kilka rzeczy:

Ustaw katalog przesyłania powyżej folderze „publiczny”, co niedostępne z poziomu przeglądarki. To ustawienie znajduje się w pliku php.ini (plik konfiguracyjny PHP). Aby to zrobić, musisz ponownie uruchomić Apache. Na większości serwerów internetowych RedHat/Fedora/CentOS, to może być:

upload_tmp_dir = "/var/tmp/" 

OR, na moim lokalnym Windows 7 WAMP zainstalować, jest ustawiony na:

upload_tmp_dir = "c:/wamp/tmp" 

Wyłącz skrypty z jazdy na tym katalogu (C:/wamp/tmp), w .htaccess:

RemoveHandler .php .phtml .php3 
RemoveType .php .phtml .php3 
php_flag engine off 

w skrypcie PHP, uzyskać przesłanego pliku filtrować je na podstawie typu MIME (brak t rozszerzenie typu pliku), zmień nazwę pliku i umieść go w bezpiecznym publicznie dostępnym folderze. Bardziej szczegółowo:

Zaleca się stosowanie ramy MVC, takich jak Zend ramowe, które obejmuje filtrowanie typu pliku.

Jeśli to wszystko zrobisz, powinieneś być bezpieczny. Oczywiście nigdy nie będziesz w 100% bezpieczny, ponieważ istnieją niezliczone, niejasne exploity atakujące PHP, MySQL, linię poleceń itp., Szczególnie na starszych systemach. Na większych serwerach firmowych (nad którymi pracuję), wyłączają wszystko i selektywnie włączają tylko to, co jest wymagane dla projektu. Dzięki systemowi, na przykład WAMP, umożliwiają wszystko, aby ułatwić rozwój lokalny.

Dobrą praktyką w pracy nad profesjonalnym projektem jest zdobycie konta serwera w chmurze za pomocą Rackspace lub Amazon i nauczenie się, jak skonfigurować ustawienia php.ini i httpd.conf, a także najlepsze praktyki dotyczące bezpieczeństwa PHP. Ogólnie nie ufaj wprowadzanym przez użytkowników informacjom, spodziewaj się, że są one uszkodzone/złośliwe/zniekształcone, a na koniec będziesz bezpieczny.

0

Poniższy .htaccess -code może działać i odmówić dostępu do plików zawierających „php”:

<FilesMatch "php"> 
    Deny from all 
</FilesMatch> 
0

Osobiście, to jest główny powód, dla którego nie jest już przesyłać pliki do serwera WWW w żadnych okolicznościach. Zamiast tego używam S3/Amazon SDK, aby przenieść przesłany plik tymczasowy bezpośrednio do zasobnika na S3 z uprawnieniami prywatnymi (ja używam S3, jakakolwiek inna CDN będzie działać tak dobrze). Jeśli plik musi być przeglądany lub przeglądany przez klienta WWW, używam funkcji sortowania "getter", która integruje się z SDK, aby pobrać plik i wyświetlić go.

Jest tylko tyle niekontrolowanych zmiennych, które wchodzą w grę za każdym razem, gdy zezwalasz na przesyłanie dowolnego pliku na serwer WWW, zarządzanie prawami, filtrowaniem, a nawet spacją może być trudne. Z S3 (lub jakimkolwiek innym CDN), wszystko to jest bardzo łatwe do zarządzania, a wszystkie pliki są domyślnie poddane kwarantannie z serwera.

1

W Apache można wyłączyć wszystkie procedury obsługi dynamicznej dla katalogu zawierającego niezaufane pliki.

SetHandler default-handler 
+0

Wierzę, że to zwycięzca .. czy może w tym jest coś nie tak dobrego? –

+1

@Kilian To zależy ... Jeśli jakiś aparat skryptowy nie jest dostępny przez program obsługi (np. PHP-FPM przez [ProxyPass] (http://httpd.apache.org/docs/current/mod/mod_proxy.html#proxypass)), to nie pomoże. Aby być po bezpiecznej stronie, polecam używanie [prywatnego folderu nad katalogiem głównym] (http://stackoverflow.com/a/14171951/2032498) lub zmienianie nazw rozszerzeń plików za pomocą białej listy (uwaga na [wiele Apache'a obsługa rozszerzeń] (http://httpd.apache.org/docs/current/mod/mod_mime.html#multipleext)). – Kontrollfreak

+0

Dziękuję kontrolfreak ^^ za odpowiedź, +1 –

Powiązane problemy