Merhaba sevgili TurkHackTeam ahalisi, ben Eratronos. Bu gün sizlerle,
Web Application Firewall (WAF) - Python ile Basit Şekilde Nasıl Yazılır?
konusu işleyeceğim.
Gün içerisinde yeni yayımlanan açıklar vasıtasıyla, yüzlerle Web Uygulamarı saldırılara maruz kalıyor. Günümüzde kullanılan en popüler saldırılarına SQL Injection, XSS ve Brute-force türlerini örnek göstere biliriz. Kullandığınız yazılım dili, kod satırlarında bırakmış olduğunuz açıklar, gözden kaçan detaylar yüzünden bu tür açıklar meydana çıkıyor. Bazense sorun sizden kaynaklanmıyor, bu yüzden her zaman kullandığınız yazılım dillerini güncellemeli ve yeni çıkan açıkları kontrol ederek Web Uygulamanızın güvenlik riskini minimuma indirmemiz mümkündür. Bu problemi basitçe anlamak için başlangıç seviyende Python yazılım dilini kullanarak WAF kodlayarak örnekleyeceğim.
Konuya geçmeden önce önemli bir uyarı geçmem gerekiyor. Burada yazılmış WAF örneği eğitim amaçlıdır, hazır bir proje değildir. Kendi projelerinizde bu sisteme güvenmemeniz gerekiyor.
(Görsel yapay zeka ile oluşturulmuştur)
Kısa Olarak WAF Nedir ? Nasıl Çalışır?Sitenize her istek gönderildiğinde bu istek direk olarak sitenize gitmez. Örnek olarak kullanıcı arama kutusunu kullanarak sitenizden bir ürün aratmaya çalışıyor bu direk sistemde sorgulanmak yerine ilk olarak WAF'dan geçer, burada da gelen isteğin içeriği kontrol edilir ve eğer herhangi bir sorun bulunmazsa sitede gerekli aramayı yapıyor. Eğer WAF'a yakalanırsa da istek bloklanır ve isteğinize uygun kullanıcıya özel mesaj gönderile bilir. Şimdiyse bu sistemi basit bir kod yapısıyla daha net bir şekilde anlatmaya çalışalım.
Python ile Flask kütüphanesini kullanacağız bu yüzden ilk olarak, kütüphanelerimizi dosyaya ekliyoruz.
Python:
from flask import Flask, request, abort
app = Flask(__name__)
Şimdiyse genelde yapılan saldırı için kullanılan kelimelerinden bazılarını bir List içerisinde toplayacağız. Burada konuyu uzatmamak için kısa olarak giriyorum bunu isterseniz, kendi isteğinize göre uzatabilirsiniz.
Python:
SALDIRI_KELIMELERI = [
"SELECT",
"UNION",
"DROP",
"<script>",
"' OR '1'='1"
]
Bu kısımları bitirdikten sonra kodumuzun esas fonksiyonlarının olduğu kısma geçiş yapıyoruz ve burada gelen istekleri ilk olarak tarayarak analiz edilecek ve sonrasında alınan sonuca göre yapılacak işlem belirleyeceğiz.
Python:
def is_malicious(data):
data = data.upper()
for pattern in SALDIRI_KELIMELERI:
if pattern in data:
return True
return False
@app.before_request
def waf():
data = str(request.url) + str(request.data)
if is_malicious(data):
print("[!] Saldırı tespit edildi:", data)
abort(403)
@app.route("/")
def home():
return "[+] İstek zamanı bir sorun bulunamadı!"
app.run(debug=True)
Burada ki, kritik noktamız
before_request kısmıdır. Gelen istekleri direk olarak siteye gitmemesi için isteği önceden kontrol ede ve işlem yapmamızı sağlıyor, bu sayede de gelen istekleri kontrol ede ve sorun bulursak bundan faydalanmamalarını sağlaya biliyoruz. Kodda da gördüğünüz gibi, eğer sorun bulunursa Log'a bir mesaj yazıyor, ardından da 403 hata kodunu aldırıyoruz ki, saldır yapan kişi bu zafiyetten yararlanamasın.
Gelelim neticesine kodları çalıştırarak örnek bir istek gönderelim ve sonuç alıp almayacağımızı kontrol edelim, bunun için Python dosyamızı çalıştırıyoruz ve arama motoruna
http://localhost:5000/?q=SELECT+*+FROM+users girerek isteğimizi gönderiyoruz.Sonuç olarak gördüğünüz gibi 403 Forbidden alıyoruz ve saldırımızı engellemiş oluyoruz.
Konunun üst kısmında da belirtiğim gibi, bu bir eğitim amaçlı yazılmış bir konudur. Burada size bir WAF nasıl çalışır hangi mantıkla işler bunu anlatmaya çalıştım, eğer bu sistemin daha da geliştirmek için yapmanız gereken şeyler Regex sistemine geçiş yapmanız, Rate Limiting koyarak, aynı IP'den gelen istekleri bloklaya ve tekrarlanmaması için BlackList sistemi kura ve bir saldırı olup olmadığını anlamak içinse Log sistemi kullanarak gelen istekleri örnek bir log.txt de tutmak ve sonradan bunları analiz edebilirsiniz. Şuan kullanılan gelişmiş WAF sistemlerinde ise günümüzde Yapay Zekanın gelişmesi ile artık WAF'lar da Machine Learning kullanılıyor ki buda sistemin her seferinde öğrenmesine gelişmesi sonucuna getiriyor ki, bu da artık bu tarz Web Uygulamalarına yapılan saldırıların daha da zorlaşması demek oluyor.
Elbet ki, hiç bir sistem %100 güvenli değildir, her sistemin bu gün yoksa da yarın bir açığı bulunuyor. Bu yüzdende güncel haberleri takip etmeli ve saldırıların etkilerini minimuma indirmek için sisteminizi hep güncel tutmalısınız.



