Ada sebuah banyak dari berbicara tentang masalah keamanan relatif terhadap cgi.fix_pathinfo
pilihan PHP digunakan dengan Nginx (biasanya PHP-FPM, CGI cepat).
Akibatnya, file konfigurasi nginx default yang digunakan untuk mengatakan:
# NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
Namun, sekarang, wiki Nginx "resmi" menyatakan bahwa PATH_INFO dapat ditangani dengan benar tanpa menonaktifkan opsi PHP di atas. Terus?
Pertanyaan
- Bisakah Anda jelaskan apa fungsinya
cgi.fix_pathinfo
? ( dokumen resmi hanya mengatakan : "Untuk informasi lebih lanjut tentang PATH_INFO, lihat spesifikasi CGI") - Apa yang sebenarnya akan dilakukan PHP dengan variabel
PATH_INFO
-SCRIPT_FILENAME
variabel ini dan ? - Mengapa dan bagaimana bisa berbahaya dengan Nginx? ( contoh terperinci )
- Apakah masalah masih ada dalam versi terbaru dari program ini?
- Apakah Apache rentan?
Saya mencoba memahami masalah di setiap langkah. Sebagai contoh, saya tidak mengerti mengapa menggunakan soket Unix php-fpm dapat menghindari masalah ini.
Jawaban:
TL; DR - perbaikannya (yang bahkan mungkin tidak Anda perlukan) SANGAT SEDERHANA dan di akhir jawaban ini.
Saya akan mencoba menjawab pertanyaan spesifik Anda, tetapi kesalahpahaman Anda tentang apa PATH_INFO itu membuat pertanyaan itu sendiri sedikit salah.
Pertanyaan pertama harus "Apa bisnis info jalur ini?"
Info jalur adalah hal setelah skrip dalam URI (harus dimulai dengan garis miring, tetapi berakhir sebelum argumen kueri, yang dimulai dengan a
?
). Paragraf terakhir di bagian ikhtisar artikel Wikipedia tentang CGI merangkumnya dengan baik. Di bawahPATH_INFO
ini adalah "/ INI / ADALAH / PATH / INFO":http://example.com/path/to/script.php/THIS/IS/PATH/INFO?query_args=foo
Pertanyaan Anda berikutnya seharusnya: "Bagaimana PHP menentukan apa
PATH_INFO
dan apaSCRIPT_FILENAME
?"PATH_INFO
, jadi apa yang seharusnya menjadiPATH_INFO
mungedSCRIPT_FILENAME
yang, ya, rusak dalam banyak kasus. Saya tidak memiliki versi PHP yang cukup lama untuk diuji, tetapi saya percaya PHP dilihatSCRIPT_FILENAME
sebagai keseluruhan shebang: "/path/to/script.php/THIS/IS/PATH/INFO" dalam contoh di atas (diawali dengan dokumen seperti biasa).PATH_INFO
danSCRIPT_FILENAME
mendapatkan hanya bagian yang menunjuk ke skrip yang diminta (diawali dengan dokumen tentu saja).PATH_INFO
, mereka harus menambahkan pengaturan konfigurasi untuk fitur baru sehingga orang yang menjalankan skrip yang bergantung pada perilaku lama dapat menjalankan versi PHP baru. Itu sebabnya bahkan ada saklar konfigurasi untuk itu. Seharusnya sudah built-in (dengan perilaku "berbahaya") dari awal.Tetapi bagaimana PHP tahu bagian mana dari skrip dan apa itu info jalur? Bagaimana jika URI itu seperti:
http://example.com/path/to/script.php/THIS/IS/PATH/INFO.php?q=foo
SCRIPT_FILENAME
telah ditentukan danPATH_INFO
mendapat sisanya.SCRIPT_FILENAME
dapatkan" /foo.jpg " (lagi, diawali dengan docroot) danPATH_INFO
mendapat "/nonexistent.php".Mengapa dan bagaimana itu bisa berbahaya sekarang harus jelas:
Nginx dan Apache dapat dibangun atau dikonfigurasikan untuk mencegah permintaan menggunakan tipuan ini, dan ada banyak contoh cara melakukannya, termasuk dalam jawaban user2372674 . Artikel blog ini menjelaskan masalahnya dengan baik, tetapi tidak ada solusi yang tepat.
Namun, solusi terbaik adalah memastikan PHP-FPM dikonfigurasi dengan benar sehingga tidak akan pernah mengeksekusi file kecuali diakhiri dengan ".php". Perlu dicatat bahwa versi terbaru PHP-FPM (~ 5.3.9 +?) Memiliki ini sebagai default, jadi bahaya ini tidak begitu banyak masalah lagi.
Solusinya
Jika Anda memiliki versi terbaru PHP-FPM (~ 5.3.9 +?), Maka Anda tidak perlu melakukan apa-apa, karena perilaku aman di bawah ini sudah merupakan default.
Kalau tidak, cari
www.conf
file php-fpm (mungkin/etc/php-fpm.d/www.conf
, tergantung sistem Anda). Pastikan Anda memilikinya:Sekali lagi, itu standar di banyak tempat hari ini.
Perhatikan bahwa ini tidak mencegah penyerang mengunggah file ".php" ke folder unggahan WordPress dan mengeksekusi yang menggunakan teknik yang sama. Anda masih harus memiliki keamanan yang baik untuk aplikasi Anda.
sumber
SCRIPT_FILENAME
, mengapa adafastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
baris dinginx
conf saya ? Apakah ini mengesampingkan upaya PHP untuk menemukan nilaiSCRIPT_FILENAME
dengan sendirinya?security.limit_extensions
? Saya mencobaphpinfo()
,,ini_get(security.limit_extensions)
danini_get_all()
tanpa hasil.Intinya tanpa ini, Anda dapat mengunggah file dengan kode php bernama seperti 'foo.jpg' ke server web; kemudian memintanya seperti http: //domain.tld/foo.jpg/nonexistent.php dan tumpukan server web akan keliru mengatakan oh; ini adalah PHP; Saya perlu memproses ini, ia akan gagal menemukan foo.jpg / nonexistent.php sehingga akan kembali ke foo.jpg dan memproses foo.jpg sebagai kode php. Itu berbahaya karena membuka sistem untuk intrusi yang sangat mudah; aplikasi web apa pun yang memungkinkan pengunggahan gambar misalnya menjadi alat untuk mengunggah backdoor.
Mengenai menggunakan php-fpm dengan soket unix untuk menghindarinya; IMO itu tidak akan menyelesaikan masalah.
sumber
cgi.fix_pathinfo
adalah tidak berbahaya, karena conf defaultphp-fpm
aman (hanya akan mengeksekusi file dengan.php
ekstensi).Di wiki Nginx sebagai langkah pengamanan
termasuk dalam blok lokasi. Dalam tutorial lainnya
digunakan, yang seharusnya melakukan hal yang sama, tetapi dapat memberikan masalah menurut wiki Nginx. Dengan opsi-opsi ini,
cgi.fix_pathinfo=1
seharusnya tidak menjadi masalah lagi. Informasi lebih lanjut dapat ditemukan di sini .sumber