Bir saldırgan uygulamanızı suistimal etmeden önce onu inceler. Burada ne arandığı ve bu bilgilerin bulunmasını nasıl engelleyebileceğiniz anlatılmaktadır.
Bu makale, PHP ve Laravel uygulama güvenliği üzerine bir dizi çalışmanın altıncı bölümüdür.
Şu ana kadar şunları ele aldık:
- PHP günlüklerinde SQL enjeksiyon girişimlerini tespit etme
- URL kodlamanın çoğu PHP güvenlik kontrolüne neden kör olduğu
- Sınırsız URL kodlaması ile ilgili çözüm bombası problemi
- Parametreli sorguların SQL enjeksiyonu için tek gerçek çözüm olduğunu neden
- Laravel’de XSS önleme ve neden
{!! !!}güvenli ile hacklenmiş arasında bir çizgi
Bu dizideki her makale aynı ilkeye dayanıyor: saldırıyı anlamadan onu durdurmayı denemeyin.
Keşif (Reconnaissance) aşaması farklı değildir. Ve çoğu geliştirici bu aşamayı düşünmez.
Keşif (Reconnaissance) Nedir?
Bir saldırgan, Laravel uygulamanızı suistimal etmeden önce onu inceler.
Rastgele tahmin yürütmezler. Çerçeveniz ve sürümünüz, mevcut rotalar, uygulamanızın ürettiği hatalar, kamuya açık dosyalar ve yöneticiler için panelin konumu gibi bilgileri sistematik bir şekilde toplarlar.
Bu aşama keşif olarak adlandırılır. Ve çoğu Laravel uygulaması bunu utanç verici bir şekilde kolaylaştırır.
Bir saldırganın bu aşamada bir zafiyet bulmasına gerek yoktur. Tek gereken, uygulamanızın yanıt vermemesi gereken sorulara yanıt vermesidir.
Saldırganların Aradığı Şeyler
1. Üretim Ortamında Hata Ayıklama Modunun Açık Olması
Bu, Laravel’deki en tehlikeli bilgi sızdırma hatasını oluşturur.
Üretim ortamında APP_DEBUG=true olduğunda, Laravel her hatada tam bir yığın izini gösterir. Bu yığın izi, dosya sistem yollarınızı, ortam değişkenlerinizi, veritabanı bağlantı detaylarınızı, uygulama kodunuzu ve hata anında her kapsamda bulunan değişkeni içerir.
Uygulamanızda herhangi bir hataya, 404, doğrulama hatası veya eksik parametre tetikleyen bir saldırgan, sunucunuzun tam bir haritasını alır.
Production .env dosyanızı hemen kontrol edin:
APP_DEBUG=false
APP_ENV=production
Bu iki satır opsiyonel değildir. Gerçek kullanıcı verisi işleyen herhangi bir Laravel uygulaması için minimum bir temel oluşturmaktadır.
2. Açık .env Dosyaları
.env dosyanız veritabanı kimlik bilgilerinizi, API anahtarlarınızı, mail sunucusu parolalarınızı, ödeme ağ geçidi gizli bilgilerinizi ve uygulama şifreleme anahtarınızı içerir. Projelerinizin kök dizininde yer alır.
Web sunucunuz yanlış yapılandırılmışsa, bu dosya kamuya açık hale gelebilir:
https://yoursite.com/.env
Bir saldırgan .env dosyanızı okursa, veritabanı kimlik bilgilerine, API anahtarlarına, uygulama gizli bilgilerine ve buraya depolanan diğer hassas ayarlara erişim kazanabilir.
Bu kurgu değil. Otomatik tarayıcılar, sitenin yayına girmesinden birkaç dakika sonra her Laravel sitesini açık .env dosyalarını denetlemek için taramaktadır. Bu, otomatik olarak gerçekleştirdikleri ilk kontrol noktalarındandır.
3. Açık .git Dizini
Eğer bir git deposunu klonlayarak dağıttıysanız ve .git dizinini web kökünden kaldırmadıysanız:
https://yoursite.com/.git/config
Bir saldırgan, açık Git nesnelerinden kaynak kodunuzu yeniden oluşturabilir. Tüm uygulama mantığınız, tüm commit geçmişiniz, yanlışlıkla eklenmiş her kimlik bilgisi.
GitDumper gibi araçlar bu yeniden yapıyı tamamen otomatikleştirmektedir. Bir geliştiricinin aylarca oluşturduğu şey, birkaç dakikada indirilebilir.
4. Çerçeve ve Versiyon Fingerprinting
Varsayılan Laravel hata sayfaları ve yanıtlar, özelleştirilmediklerinde çerçeve hakkında bilgi sızdırabilir. HTTP yanıt başlıkları bazen çerçeve ve PHP versiyonu bilgilerini içerir. Oturum çerezlerinin yapısı, rota kalıpları ve form token adları bunların hepsi özellikle Laravel’e işaret eder.
Varsayılan sunucu yanıtları sıklıkla:
X-Powered-By: PHP/8.1.0
Server: Apache/2.4.41
Bir saldırgan çerçevenizin ve versiyonunuzun ne olduğunu bildiğinde, kontrol edilecek bilinen zafiyetler, en yaygın varsayılan yanlış yapılandırmalar ve en olası saldırı kalıplarını bilir.
Bu başlıkları kaldırın. Bunlar gözetleyen herkes için ücretsiz keşif bilgileridir.
5. Laravel Paketleri ve Geliştirici Araç Yolları
Laravel paketleri ve geliştirici araçları, uygulama iç yapısını sızdıran yolları açığa çıkarabilir:
/telescope — Laravel Telescope ayıklayıcı
/horizon — Laravel Horizon kuyruk panosu
/_debugbar — Laravel Debugbar
Bu yolların üretimde kimlik doğrulama olmadan erişilebilir olması durumunda, bir saldırganın kuyruk görevlerinize, veritabanı sorgularınıza, cache işlemlerinize, mail loglarınıza ve istisna detaylarınıza erişme olanağı vardır.
Bu araçlar geliştirme için son derece değerlidir. Ancak üretimde koruma altına alınmadıklarında ciddi zafiyetlerdir.
6. Ayrıntılı Hata Mesajları
Hata ayıklama modu devre dışı olmasına rağmen, dikkatsiz hata yönetimi hala çok fazla bilgi sızdırır:
// Bu bir saldırgana tablo adının var olduğunu söyler
// ve şemanız hakkında bilgi verir
catch (Exception $e) {
echo "Kullanıcılar tablosunu sorgularken hata: " . $e->getMessage();
}
Veritabanı tablo adları, sütun adları veya dosya yollarını hata mesajlarında açığa çıkaran bir geliştirici, saldırgana keşif olanağı tanımaktadır.
Doğru yaklaşım:
catch (Exception $e) {
// Her şeyi dahili olarak kaydet
Log::error('Veritabanı hatası: ' . $e->getMessage(), [
'dosya' => $e->getFile(),
'satır' => $e->getLine()
]);
// Dışarıya hiçbir faydalı bilgi göstermeyin
return response( 500);
}
Tüm hatayı dahili olarak kaydedin. Dışarıda hiçbir şey göstermeyin. Kullanıcının teknik olarak neyin yanlış gittiğini bilmesine gerek yok. Saldırganın kesinlikle bilmemesi gerekir.
7. Tahmin Edilebilir Yönetici Yolları
Otomatik tarayıcılar her bulduğu sitede yaygın yönetici paneli konumlarını denemektedir:
/admin
/admin/login
/dashboard
/administrator
/panel
/backend
/manage
/cp
Eğer yönetici paneliniz bu konumlardan birindeyse ve hiçbir oran sınırlaması, IP sınırlaması veya ek kimlik doğrulama katmanı yoksa, sürekli olarak taranıyordur.
8. Dizin Listeleme
Eğer web sunucunuzda dizin listeleme etkinleştirilmişse, bir saldırgan dosya yapınızı bir dosya yöneticisi gibi tarayabilir:
https://yoursite.com/storage/
https://yoursite.com/public/uploads/
Her yüklediğiniz dosyayı, her log dosyasını, her geçici dosyayı, uygulamanızın ürettiği her yedek dosyayı görebilirler.
9. Kamu Dizininde Kalan Yedek Dosyalar
Geliştiriciler bazen açıkça erişilebilir durumda kalabilen yedek dosyaları oluştururlar:
https://yoursite.com/index.php.bak
https://yoursite.com/config.php.old
https://yoursite.com/database.sql
https://yoursite.com/backup.zip
Otomatik tarayıcılar her taradıkları sitede yüzlerce bu biçimi kontrol eder. Kamu dizininde kalan bir veritabanı yedek dosyası, keşfedilmeyi bekleyen bir veri sızıntısıdır.
Saldırganların Bunu Otomatikleştirmesi
Keşif, bir kişinin klavye başında oturarak yapıldığı bir işlem değildir.
Otomatik araçlar milyonlarca siteyi sürekli olarak taramaktadır:
- Nikto bilinen binlerce güvenlik açığı ve yanlış yapılandırmaları tarar
- Gobuster binlerce yaygın yol için dizin ve dosya adlarını brute force yöntemiyle denemektedir
- WhatWeb yanıt başlıkları ve sayfa içeriğinden web teknolojilerini parmak izi olarak alır
- GitDumper açık Git nesnelerinden kaynak kodunu otomatik olarak yeniden inşa eder
Bu araçlar buldukları her IP adresine karşı çalışır. Siteniz, ister bilin ister bilmeyin sürekli olarak taranmaktadır. Soru, keşfin olup olmadığı değil, uygulamanızın tarayıcıya yararlı yanıtlar verip vermediğidir.
Saklanması Gerekenler – Tam Kontrol Listesi
Laravel yapılandırması:
# .env — üretim ayarları
APP_ENV=production
APP_DEBUG=false
// config/app.php
'debug' => (bool) env(, false),
Geliştirici araç erişimini kısıtlayın:
Telescope yetkilendirmesini yapılandırın ve panelin güvenilir kullanıcılar veya IP adresleriyle kısıtlı olduğundan emin olun:
// app/Providers/TelescopeServiceProvider.php
Gate::define(, function ($user) {
return in_array(request()->ip(), [
,
// güvenilir IP adreslerinizi buraya ekleyin
]);
});
Horizon ve Debugbar için de aynı ilkeleri uygulayın – her ikisi de herhangi bir üretim dağıtımı öncesinde kimlik doğrulama veya IP kısıtlaması gerektirmelidir.
Web sunucusu seviyesinde hassas dosyaları engelleyin:
Nginx için:
location ~ /\.(env|git|htaccess) {
deny all;
return 404;
}
location ~ \.(bak|old|sql|zip|tar|gz)$ {
deny all;
return 404;
}
Apache için:
FilesMatch "\.(env|git|bak|old|sql|zip)$">
Order allow,deny
Deny from all
FilesMatch>
Teknoloji başlıklarını kaldırın:
php.ini için:
expose_php = Off
Nginx için:
server_tokens off;
Apache için:
ServerTokens Prod
ServerSignature Off
Dizin listelemeyi devre dışı bırakın:
Nginx için:
autoindex off;
Apache için:
Options -Indexes
Hiçbir şey sızdırmayan özel hata sayfaları:
// app/Exceptions/Handler.php
public function render($request, Throwable $exception)
{
if (app()->environment()) {
if ($this->isHttpException($exception)) {
return response()->view(
. $exception->getStatusCode(),
[],
$exception->getStatusCode()
);
}
return response()->view(, [], 500);
}
return parent::render($request, $exception);
}
Duyarlı yolları oran sınırlamanız gerekmektedir:
// routes/web.php
Route::middleware([])->group(function () {
Route::post(, [AuthController::class, ]);
Route::post(, [AdminController::class, ]);
});
Her dakika 5 deneme. Bundan sonra Laravel oran sınırlaması uygular ve limit penceresi sıfırlanana kadar 429 yanıtı döner.
Dağıtım Kontrol Listesi
Her dağıtımdan sonra bunları kontrol edin:
APP_DEBUG=falseüretimde onaylandıAPP_ENV=productiononaylandı- .
envdosyası tarayıcıdan erişilebilir değil - .git dizini web kökünde yok veya sunucu seviyesinde engellendi
- Telescope, Horizon, Debugbar kimlik doğrulama veya IP kısıtlaması altında
- Dizin listeleme devre dışı bırakıldı
- Teknoloji başlıkları kaldırıldı
- Kamu dizinlerinde yedek veya geçici dosyalar yok
- Yönetici yolları oran sınırına tabi
- Özel hata sayfaları genel mesajlar döner
Kriosa Projesine Nasıl Uygun Olur
Güvenlik yapılandırması, saldırı yüzeyinizi azaltır, ancak saldırganların denemelerini durdurmaz. Her kamuya açık uygulama bir kez değil, birkaç kez otomatik tarama işlemine maruz kalır.
Keşif, normal kullanıcı davranışlarından farklı trafik desenleri oluşturur.
Aşırı ardışık istekler, var olmayan yollar için istekler, .env, .git/config gibi bilinen hassas dosya konumlarına istekler, tarayıcı kullanıcı agent dizgileri ile istekler ve yönetici yol konumlarına karşı sıradışı tarama kalıpları.
Bu kalıplar, tam olarak Kriosa’nın ML motorunun tespit ettiği keşif etkinlikleridir ve bu, saldırının istismar haline dönüşmeden önce XAI panelinizde işaretlenir.
Bir saldırganın uygulamanızı gözlemlemesi ve yanıtlar vermesi engellenemez. Ancak uygulamanızın yararlı yanıtlar vermesini engelleyebilirsiniz. Ve gözlemleme başladığında bunu bilebilirsiniz.
Yapılandırma, bilgi boşluklarını kapatır. Kriosa, gözlemleme davranışlarını izler.
Her iki katman birlikte çalışmalıdır.
Ücretsiz deneyin: kriosa.com
Kurulum yapın: composer require kriosa-ai/kriosa-php . Kriosa dokümantasyonu
Geliştirici tarafından, güvenliğini anlamak isteyen geliştiriciler için inşa edilmiştir.
Şu Ana Kadar Olan Dizi
- Makale 1: SQL enjeksiyonu saldırısında PHP günlüklerinizin nasıl göründüğüne dair
- Makale 2: URL kodlaması neden PHP güvenlik kontrollerini kırabilir
- Makale 3: Çözüm bombası sorunu — neden sınırsız URL kodlaması kendi zafiyeti olabilir
- Makale 4: Parametreli sorgular — SQL enjeksiyonuna tek gerçek çözüm
- Makale 5: Laravel’de XSS önleme ve neden
{!! !!}güvenli ile hacklenmiş arasında bir çizgi - Makale 6: Bu makale — saldırganların Laravel uygulamanızı nasıl sıraladığı ve neyi gizleyeceğiniz.
Kaynak: Orijinal Makale


