Network tabanlı güvenlik açıklarına göre artık daha önemli hale gelen web uygulamalarındaki güvenlik açıkları (Cross-Site Scripting, SQL injection vs), saldırganların web uygulamaları üzerinden ağa atlayabilecekleri ya da etkili zarar verebilecekleri bir saldırı yüzeyidir. Bu yazı dizimizde ise bir açık kaynak web uygulama güvenlik duvarı olan ModSecurity ile karmaşık web güvenlik açıklarının nasıl engellenbileceğini paylaşacağız.
Web uygulamalarındaki güvenlik açıklarını gidermenin etkili iki yolu vardır. Bunlardan ilki uygulama kodlarında yapılacak düzeltmeler, diğeri de bu açıkları koda dokunmadan sanal olarak yamama şeklindeki web uygulama güvenlik duvarı yani WAF (web application firewall) olarak bilinen sistemlerdir.
ModSecurity Nedir?
ModSecurity, en bilinen bir açık kaynak WAF olarak Apache HTTP Server, IIS ve NGINX üzerinde çalışabilen bir gerçek-zamanlı web uygulama izleme, loglama ve erişim kontrolü için bir araç kitidir. ModSecurity web uygulamasının sorunlu/hatalı kodlarına dokunmadan sadece üst katmanda bir koruma sağlar. ModSecurity ile yapılabilecekleri görmek için bu bağlantıya gidebilirsiniz.
ModSecurity ile web güvenlik açıklarını engelleme hakkındaki yazı dizimizde bahsedilecek yöntemler kesin bir yama/düzeltme anlamına gelmemektedir. ModSecurity kendi üretim ortamınıza uygulamadan önce dikkatlice test etmeniz gerekir. Çünkü ModSecurity, oldukça güçlü ve esnek olmasının yanında false-positive’lere de çok açık bir araçtır. Web uygulamalarınızda yazı dizisinde bahsedilenleri uygulamaya geçmeden önce iyice test etmeli ve sonuçlarını etraflıca incelemelisiniz. Bu yazı dizisinde OWASP ModSecurity CRS kural setleri ile High-Tech Bridge (ağırlıklı olarak) ve ModSecurity resmi kanalı referans olarak alınmıştır. Ayrıca Türkçe ModSecurity için Webguvenligi.org‘un detaylı rehberinden yararlanabilirsiniz.
— BÖLÜM 1: ModSecurity ile Cross-Site Scripting (XSS) Açığını Engelleme —
Günümüzde web uygulamalarını en çok etkileyen zafiyetlerin başında gelen Cross-Site Scripting (XSS), orta seviye bir güvenlik açığı olarak kabul edilmesinin yanında kurbanla/hedefle belirli bir düzeyde etkileşimi gerektirmekte ve saldırganlar tarafından çok aktif bir biçimde kullanılmaktadır. Bu yazıda sadece ModSecurity kurallarından bahsedeceğimiz için XSS ile ilgili detaylı teknik bilgilere alttaki bağlantılardan ulaşabilirsiniz:
- http://www.eyupcelik.com.tr/guvenlik/403-derinlemesine-xss-dom-stored-reflected-saldirisi/
- http://blog.btrisk.com/2015/04/XSS-Cross-Site-Scripting-Acikliklari.html
- http://www.bga.com.tr/calismalar/websec/
- https://www.mertsarica.com/xss-ve-beef/
ModSecurity CRS, “modsecurity_crs_41_xss_attacks.conf” saldırı setindeki hazır kurallarla XSS için olabilecek saldırıların büyük bir kısmını kapsayarak engelleyebiliyor. Bununla birlikte DOM-tabanlı XSS’ler ile JavaScript kodu içindeki cross-site scripting (XSS) türleri bu hazır kural setini baypas edebiliyor. Ama bunula birlikte neredeyse tüm cross-site scripting (XSS) zafiyetleri spesifik olarak yazılmış kurallarla engellenebilir. Bu bağlamda alttaki zafiyetli PHP kodunu incelediğimizde:
xss.php <script> param=<?=$_GET['param']?> </script>
Bunu istismar etmek için de alttaki payload’u kullanılabiliriz:
http://host/xss.php?param=confirm(/Zafiyet/)
Üstteki payload’un çalıştırılması sonucu “Zafiyet” string’i içeren bir JavaScript popup ile istismar sağlanır. Halbuki unsigned interger’a script’ten verilen bütün HTML parametrelerini sınırlayan alttaki özelleştirilmiş ModSecurity kuralı ile bu ve benzeri zafiyetlerin önüne geçilebilir:
mod_security_custom_rules.conf SecRule REQUEST_FILENAME "/xss.php" "phase:2, t:none, t:normalisePath, t:lowercase, t:urlDecodeUni, chain, deny, log, id:1001" SecRule ARGS_GET:param "!^[0-9]+$" "t:none"
Tabii bu kural zafiyetli parametrenin hangi değerleri kabul edeceğine bağlı olarak ancak etkili bir şekilde çalışabilir ki, bu değerlerin de ne olduğunu ancak uygulama sahibi bilebilir. Bunun yanında bu kısma özel olarak yazılmış bir kuralın bütün bir web uygulaması içinde başka yerleri de etkileyip etkilemeyeceğinin tahlilinin de uygulamanın sahipleri tarafından yapılmasında yarar vardır.
Nihai olarak, ModSecurity ve web uygulama güvenlik duvarlarının DOM-tabanlı Cross-Site Scripting (XSS)‘in bazı türlerini dizayn gereği olarak asla engellemeyeceğini akılda tutmak gerekir. Çünkü bu tip cross-site scripting’lerde kötücül payload web sunucuya ulaşmıyor ve bu yüzden WAF’lar tarafından araya girilip engellenemiyor.
Yazı dizimizin bir sonraki bölümünde görüşmek üzere…