PHP Internals'daki bazı haber grubu gönderilerini araştırıyorum ve konuyla ilgili ilginç bir tartışma buldum. İlk iplik başka bir şey oldu, ama Stefan Esser, bir (değilse bir açıklama PHP dünyada) güvenlik uzmanı birkaç mesaj için $ _REQUEST kullanarak güvenlik yan etkileri doğru tartışmayı çevirdi.
PHP Internals'da Stefan Esser'den alıntı
$ _REQUEST, PHP'deki en büyük tasarım zayıflıklarından biridir. $ _REQUEST kullanan her uygulama, Büyük olasılıkla Gecikmeli Siteler Arası İstek Sahteciliği sorunlarına karşı savunmasızdır. (Bu, temel olarak, örneğin (yaş) adlı bir çerez varsa, her zaman GET / POST içeriğinin üzerine yazacağı ve bu nedenle istenmeyen istekler gerçekleştirileceği anlamına gelir)
ve aynı ileti dizisine daha sonraki bir yanıtta
Bu, birinin GET, POST'u taklit edebilmesi ile ilgili değildir; COOKIE değişkenleri. Bu, COOKIE'lerin REQUEST'teki GET ve POST verilerinin üzerine yazacağı gerçeğiyle ilgilidir.
Bu nedenle tarayıcınıza örn. Action = logout yazan bir çerez bulaştırabilirim ve o günden itibaren uygulamayı artık kullanamazsınız çünkü REQUEST [action] oturumunu sonsuza kadar kapatacaktır (çerezi manuel olarak silene kadar).
Ve size bir COOKIE bulaştırmak çok basit ...
a) Bir alt alandaki herhangi bir uygulamada bir XSS vuln kullanabilirim
b) Sahip olduğunuzda * .co.uk veya * .co.kr için bir çerez ayarlamayı denediniz. tek alan var mı?
c) Diğer alanlar arası yollar ne olursa olsun ...
Ve bunun bir sorun olmadığına inanıyorsanız, size birkaç PHP sürümünün yalnızca beyaz sayfalar döndürmesiyle sonuçlanan fe a * .co.kr tanımlama bilgisini ayarlamanın basit bir olasılığı olduğunu söyleyebilirim. Düşünün: * .co.kr'deki tüm PHP sayfalarını öldürmek için yalnızca tek bir çerez
Ve * .co.kr için geçerli olan bir çerezde, + PHPSESSID = illegal olarak adlandırılan bir değişkende geçersiz bir oturum kimliği ayarlayarak, PHP oturumlarını kullanarak Kore'deki her PHP uygulamasında hala DOS yapabilirsiniz ...
Birkaç gönderi için tartışma devam ediyor ve okumak ilginç.
Gördüğünüz gibi, $ _REQUEST ile ilgili temel sorun, $ _GET ve $ _POST'tan verilere sahip olması değil, aynı zamanda $ _COOKIE'den gelen verilere sahip olmasıdır. Listedeki diğer bazı kişiler, $ _REQUEST'in doldurulduğu sıranın değiştirilmesini önerdiler, örneğin önce $ _COOKIE ile doldurmak gibi, ancak bu, örneğin Oturum yönetimi gibi birçok başka olası soruna yol açabilir .
$ _REQUEST globalden $ _COOKIES öğesini tamamen atlayabilirsiniz, böylece diğer diziler tarafından üzerine yazılmaz (aslında, değişken_order ini ayarındaki PHP kılavuzu gibi, standart içeriğinin herhangi bir kombinasyonuyla sınırlayabilirsiniz. bize söyler:
değişken_sırası EGPCS (Ortam, Get, Post, Çerez ve Sunucu) değişken ayrıştırma sırasını belirler. Örneğin, değişkenler_sırası "SP" olarak ayarlanmışsa, PHP, $ _SERVER ve $ _POST süper küresellerini oluşturacak, ancak $ _ENV, $ _GET ve $ _COOKIE oluşturmayacaktır. "" Olarak ayarlamak, süper küresellerin ayarlanmayacağı anlamına gelir.
Ancak yine de, $ _REQUEST'i tamamen kullanmamayı düşünebilirsiniz, çünkü PHP'de kendi globallerinde Environment, Get, Post, Cookie ve Server'a erişebilir ve bir saldırı vektörüne daha az sahip olabilirsiniz. Yine de bu verileri sterilize etmeniz gerekiyor, ancak endişelenmeniz gereken bir şey yok.
Şimdi, $ _REQUEST'in neden var olduğunu ve neden kaldırılmadığını merak edebilirsiniz. Bu, PHP Internals'da da soruldu. Rasmus Lerdorf'tan $ _REQUEST neden var? PHP Internals'da
Buna benzer şeyleri ne kadar çok kaldırırsak, insanların PHP'nin daha yeni, daha hızlı ve daha güvenli sürümlerine hızla geçmesi o kadar zorlaşır. Bu, herkes için birkaç "çirkin" eski özellikten çok daha fazla hayal kırıklığına neden olur. İyi bir teknik neden, performans veya güvenlik varsa, o zaman buna iyice bakmamız gerekir. Bu durumda, bakmamız gereken şey $ _REQUEST'i kaldırmamız gerekip gerekmediği değil, çerez verilerini ondan kaldırmamız gerekip gerekmediğidir. Benimkiler de dahil olmak üzere birçok yapılandırma bunu zaten yapıyor ve $ _REQUEST'e çerezleri dahil etmemek için güçlü bir geçerli güvenlik nedeni var. Çoğu kişi $ _REQUEST'i GET veya POST'u ifade etmek için kullanır, bunun çerezleri de içerebileceğinin farkında olmadan ve bu tür kötü adamlar potansiyel olarak bazı çerez yerleştirme hileleri yapabilir ve saf uygulamaları bozabilir.
Neyse, umarım bu biraz ışık tutar.