2012-11-07 16 views
7

Uzantısı .php olmasa bile, PHP üzerinden bir dosya çalıştırmanın mümkün olduğunu fark ettim, örneğin test.xyz.php.whatever.zyx dosyası, uzantı .php olmasa bile PHP ile çalışabilir! Dosya adında sadece .php. olması ve Apache'nin PHP betiğini çalıştırması yeterli oluyor. (Birisi önerdiği gibi) Yüklenen dosyanın herhangi bir sunucuda PHP ile çalıştırılmasını nasıl güvenli bir şekilde engellersiniz?

Ben bu klasörde bir .htaccess dosyada bu koymak için çalıştı:

php_flag engine off 

Ama benim makinede işe yaramadı. Ben biliyorum

sadece çözümler şimdi şunlardır:

  • isim ver .txt olarak, PHP ile böyle çalışmaz dosya uzantısı, bilinen.
  • Dosya ismindeki tüm noktaları kaldırın, böylece uzantılarını serbest bırakın.

Ancak bu çözümlerin diğer sunucularda Windows sunucumdan (Apache ile) nasıl çalışacağından hala emin değilim.

Herhangi bir şekilde yeniden adlandırılacak dosya adlarına ihtiyaç duymayan başka çözümler var mı?

+0

güvenlik açısından önerilir. Ayrıca, http://stackoverflow.com/questions/3499173/my-php-site-was-hacked-by-codes-uploaded-as-image adresini de kontrol edin. Neden php.ini dosyanıza belirli komutları da eklemelisiniz? – SeanC

+0

@ SeanCheshire, bahşiş için teşekkürler. şimdi anlattığım bulgularla birleştirirsem, bahse girerim çok daha fazla site bununla hacklenebilir olur. (kendimi de test etmek için çok tembel, aynı zamanda, yasadışı;). – Rookie

+0

her zaman yasalara aykırı değil: http://www.hackthissite.org/ – SeanC

cevap

1

php_flag engine off yerine, tek bir dizin için bir .htaccess dosyası kullanarak PHP dosyalarının işleyicisini kaldırabilirsiniz. İçinde PHP devre dışı bırakıyorsunuz dizinde

, .htaccess içermelidir: Büyük olasılıkla varsayılan Apache yapılandırmasında yapılandırılmış hangi AddHandler türleri bağlı olarak aşağıda ancak kurtulabiliriz

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

, pencerelerde, Ayrıcakaplıdır, .htaccess dosyasını içeren dizin olduğunu, ana apache yapılandırma dosyasında sağlamak gerekecektir C:\Program Files\Apache<version>\conf\httpd.conf

RemoveHandler .php 
RemoveType .php 

olmalıdır ki, AllowOverride FileInfo setine sahipbildirimi. .htaccess dosyalarını başka amaçlarla kullanacaksanız AllowOverride All'u düşünmek isteyebilirsiniz - farklılıkların bir açıklaması için bkz. the Apache documentation for AllowOverride.

+0

Bu, kaldırılacak türlerin büyük bir listesi, orada hangi türleri listelemeliyim? 'AllowOverride FileInfo' aslında ne yapar? ve hangisi daha iyi "Hepsi" mi, "FileInfo" mu? – Rookie

+0

İlk sorunuzla ilgili olarak - PHP betiği için işleyici olarak kayıtlı olan tüm türleri listelemelisiniz. Bu, kurulumunuza bağlı olarak değişecektir. Mevcut 'AddHandler' satırları için ana HTTPd (Apache) yapılandırmasını inceleyerek kontrol edebilirsiniz. Standart konuma yüklediğinizi varsayarsak, Windows için Apache bunu 'C: \ Program Files \ Apache2.2 \ conf \ httpd.conf' içine yerleştirir. –

+0

İkinci sorunuzla ilgili olarak - AllowOverride, belirli bir dizin için bir .htaccess dosyası kullanarak geçersiz kılabileceğiniz Apache yapılandırma yönergeleri türlerini denetler. Güvenlik amacıyla, bunu üretim ortamında olabildiğince kısıtlanmış olarak tutmalısınız. Yanıtları farklılıkları referans alarak güncelledim. –

0

bu gerçekten iyi bir cevap değil ama bazı özel durumlarda yararlı umut ...

böyle .htaccess dosyada algılaması sağlanabilir:

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

ve index.php dosya içindeki:

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

Bu yanıtı güvenlik nedenleriyle görmeyi unutmayın. StackOverFlow

ve test.xyz.php.whatever.zyx dosyasında:

istemci /test.xyz.php.whatever istekleri şimdi ise
<?php echo 'hello'; 

.zyx dosyası, koymak dışarı (doğrudan adresleme) Sana Sadece Sen Erişim klasörünü yüklemek için var bu durumda kök yoluna üzerindeki bir katmanda klasör yükleme öneririz kullanıcılar tarafından yükleme için

+0

Yani bu sadece dosya ismi 'xyz.php.whatever.zyz' veya önceden tanımlanmış başka bir dosya isminde çalışıyor mu? (. +)^Xyz.php.whatever.zyx $ ve bunun gibi diğer tip olarak değiştirebilirsiniz: – Rookie

+0

her şey bu hat ile maç olabilir.^Txt $ –

5

'merhaba' olmalıdır ve bir saldırganın zararlı dosyayı çalıştırmak için Böylece bir saldırganın eylemini devre dışı bu klasöre herhangi dosyalara erişim değil

burada ne olacağını anlamak için gereken tüm arasında
3

İlk:

test.xyz.php.whatever.zyx 

Böyle bir dosya bir web sunucusu üzerinde kendi başına hiçbir şey yapmazdı. Sadece eklenmiş yapılandırma Apache'ye PHP'yi bu dosya üzerinde çalıştırmasını söyler. Bir yığılmış dosya uzantısı en sonuna ya kısmında olsun - Bunu ekledi yapılandırmayı kaldırırsanız

Dolayısıyla Apache orada .php bulmak için umursamayacak.

Sunucu yapılandırmanızda php için hangi tanıtıcıyı ayarladığınızı kontrol edin. Yükleme dizini için kaldırın. Bu daha sonra yüklenen dosyalarda sahip olabileceğiniz diğer yapılandırma sorunlarını çözmeyecektir, ancak PHP dosyaları artık PHP tarafından gerçekleştirilmeyecek - doğru olanı anladım.

Bunun ne hakkında olduğunu öğrenmek için bir sorunla karşılaşırsanız, PHP yapılandırmanızı sisteminiz için httpd.conf dosyanıza ve ilişkili Apache HTTPD yapılandırma dosyalarına göndermeniz gerekir.

direktif birileri .htaccess için söyledim: Bir apache SAPI modülü olarak derler çalıştırıyorsanız

php_flag engine off 

sadece çalışır.

+0

şey şimdi aklıma geldi (+).. : Bunun işe yaramasının sebebinin, "funny.php.lib" nin de yürütülmesi için bu tür dosyalara izin vermek olduğunu düşünüyorum. – Rookie

+1

Hayır, nedeni bu değil. Ayrıca PHP dosyalarını bu şekilde adlandırmak korkunç ve kötü bir uygulamadır. Bu gibi dosya adlarının sabitlenmesi gerekir. Apache'nin bunu yapmasının sebebi daha çok [* İçerik Müzakere *] 'dir (http://httpd.apache.org/docs/2.2/content-negotiation.html). Bu temelde tüm sunucu yapılandırmasıdır, bu yüzden Apache web sunucunuzu bu şekilde yapılandırın, böylece istediğiniz şeyi yapın. – hakre

0

Basit regex bizim sunucuda oldukça kolay sorunu yeniden herhangi bir sunucuya

+0

şu anda sadece str_replace (".", "-", $ basename) 'yi yapıyorum, tüm olası uzantıları düşünmeye gerek yok. – Rookie

0

üzerine işi

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

Bu iyi çalışır yapardı. Bunu düzeltmek için bir yol yoktur, sen hatları

#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 

Bu satırlar adına php ile bir şey işlenecek neden /etc/mime.types düzenlemek ve dışarı yorum yapmak gerekir. Eğer mime.types dosyasına içinde ilişkin satırları kez , /etc/apache2/mods-enabled/php5.conf içinde mod_php yapılandırma doğru sadece dosyaları nedir .php

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

ile SONLANDIRMA işleyen bu girişi vardır REALLY SCARY bu varsayılan bir yapılandırma (bizim durumumuzda Ubuntu 10.04) 'dir.


DÜZENLEME

Windows'ta mime.types dosyasına dosya apache_home/conf/mim olmalıdır.tipleri

5

tamamen güvenli olması için, bir kaç şey yapmak gerekir:

bir tarayıcıdan o ulaşılmaz hale senin "kamu" klasörüne yukarıdaki yükleme dizinini ayarla

. Bu ayar php.ini dosyasında (php config dosyası). Etkili olması için Apache'yi yeniden başlatmanız gerekecek.

upload_tmp_dir = "/var/tmp/" 

YA, WAMP yüklemek benim yerel Windows 7, bu ayarlandığında: En Redhat/Fedora/CentOS web sunucuları, bu olabilir çalışmasını

upload_tmp_dir = "c:/wamp/tmp" 

devre dışı bırak komut dizin (c:/wamp/tmp), .htaccess:

PHP komut dosyasında
RemoveHandler .php .phtml .php3 
RemoveType .php .phtml .php3 
php_flag engine off 

, hayır (yüklenen dosyayı almak mime dayanarak filtrelemek t filetype uzantısı), dosya adını değiştirin ve güvenli bir şekilde erişilebilen bir klasöre koyun. Daha ayrıntılı olarak:

Tercihen bu tür dosya tipi süzme içeren Zend Framework gibi bir MVC çerçeve kullanır.

Bunların hepsini yaparsanız, güvende olmalısınız. Açıkçası, kesinlikle eski sistemler üzerinde PHP, MySQL, komut satırı, vb, hedefleyen sayısız belirsiz yararlar vardır, çünkü% 100 güvenli asla olmayacak. Daha büyük şirket web sunucularında (üzerinde çalıştığım şey), her şeyi devre dışı bırakır ve seçici olarak yalnızca proje için gerekenleri etkinleştirir. WAMP gibi bir sistemle, yerel gelişmeyi kolaylaştırmak için herşeyi sağlarlar.

Profesyonel bir proje üzerinde çalışmak için iyi bir uygulama, Rackspace veya Amazon ile bir bulut sunucu hesabı almak ve php.ini ve httpd.conf ayarlarının yanı sıra PHP güvenlik en iyi uygulamalarının nasıl yapılandırılacağını öğrenmektir. Genel olarak, kullanıcıların girdisine güvenmeyin, bozuk/kötü niyetli/kötü biçimlendirilmiş olmasını bekleyin ve sonunda güvende olacaksınız.

0

aşağıdaki .htaccess -Kod çalışmak ve "php" içeren dosyalara erişim inkar edemezdi:

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

Şahsen bu artık hiçbir koşulda web sunucusuna dosya yüklemek ana nedenidir. Bunun yerine, S3/Amazon SDK'yı kullanarak yüklenen geçici dosyayı S3'teki Özel izinler ile bir kovaya doğrudan aktarıyorum (S3 kullanıyorum, diğer CDN'ler de işe yarayacak). Dosyanın bir web istemcisi tarafından görüntülenmesi veya görüntülenmesi gerekiyorsa, dosyayı almak ve görüntülemek için SDK ile bütünleşen bir "getter" işlevi kullanıyorum.

bir web sunucusuna dosya yükleme her türlü izin verdiği sürece devreye girer sadece çok kontrol edilemeyen değişken vardır, izinleri, filtreleme ve hatta sadece alanını yönetmek zor olabilir. S3 (veya başka bir CDN) ile, yönetmesi çok kolaydır ve tüm dosyalar varsayılan olarak sunucudan etkin bir şekilde karantinaya alınır.

1

Apache sitesinde güvenilmeyen dosyaları içeren dizin için tüm dinamik işleyicileri devre dışı olabilir. Dosyaları yeniden adlandırma

SetHandler default-handler 
+0

Buranın galibi olduğuna inanıyorum ya da bu konuda hiç hoş olmayan bir şey olabilir mi? –

+1

@Kilian Bu ... Bazı komut dosyası motoruna bir işleyici aracılığıyla erişilemiyorsa (örneğin [ProxyPass] üzerinden PHP-FPM (http://httpd.apache.org/docs/current/mod/mod_proxy.html#proxypass)), yardımcı olmaz. Güvenli tarafta olmak için, [belge kökünün üstünde özel bir klasör] (http://stackoverflow.com/a/14171951/2032498) veya dosya uzantılarını bir beyaz liste kullanarak yeniden adlandırmanızı öneririz. uzatma yönetimi] (http://httpd.apache.org/docs/current/mod/mod_mime.html#multipleext)). – Kontrollfreak

+0

Cevabınız için kontrolfreak ^^ teşekkürler, +1 –

İlgili konular