Uygulamanız oturum açma, kayıt, parola sıfırlama/kurtarma, onay bağlantılarını yeniden gönderme ve sunucu istekleri gerektiren diğer belirli işlevler gibi temel özellikleri içeriyorsa, kaba kuvvet saldırılarına ve hizmetiniz üzerinde önemli bir yük oluşmasına karşı mekanizmaların uygulanması çok önemlidir. Bu tür mekanizmalar olmadan uygulamanız, kullanıcılara aşırı sayıda e-posta/OTP gönderilmesi de dahil olmak üzere çeşitli tehditlere karşı savunmasız kalabilir ve bu durum potansiyel olarak mali ve itibar açısından zarara yol açabilir.
Çoğu web uygulaması , bir ödeme modeline dayalı olarak istek sayısını kısıtlamak gibi yalnızca iş mantıklarının dayattığı sınırlamalara dayanan, yeterli hız sınırlayıcı önlemlerden yoksundur. Ancak bazı uygulamalar, özellikle oturum açma denemeleri, kayıt ve diğer kritik işlevler gibi işlemler için hız sınırları içerir. Bu uygulamalar genellikle IP adresi takibi için X-Forwarded-For başlığına bağlıdır.
Basit bir örneği açıklamak için Flask'ta bu kod pasajını buldum
from flask import Flask, request, jsonify from flask_limiter import Limiter from flask_limiter.util import get_remote_address app = Flask(__name__) limiter = Limiter( app, key_func=get_remote_address, storage_uri="memory://",) def get_ipaddr(): # Retrieve the client's IP address from the request # X-Forwarded-For header is used to handle requests behind a proxy ip_address = request.headers.get('X-Forwarded-For', request.remote_addr) return ip_address # Rate limit to 5 requests per minute per IP @limiter.limit("5 per minute") @app.route('/') def index(): ip_address = get_ipaddr() return ip_address
Aşağıdaki bölümlerde, uygulamanızda hız limitlerini test etmeye ve aşmaya yönelik çeşitli yaklaşımları açıklayacağım.
Uygulamanızı bu tür güvenlik açıklarına karşı verimli bir şekilde test etmek için otomasyon güçlü bir araçtır. Bunu, Python'dakiler gibi komut dosyaları kullanarak (benim sıklıkla yaptığım gibi) veya Burp Suite gibi araçları (bu arada test uzmanları ve siber güvenlik uzmanları için harika bir araç) kullanarak başarabilirsiniz. Ayrıca, çekleri nispeten kolay bir şekilde otomatikleştirmek için Postman gibi araçlar kullanılabilir.
X-Originating-IP: 127.0.0.1
Gönderdiğiniz her istekte farklı IP değerleri kullanın.
Çift X-Forwared-For başlığını kullanın.
X-Forwarded-For: X-Forwarded-For: 127.0.0.1
Aynısını farklı başlıklarla deneyin.
X-Originating-IP: 127.0.0.1 X-Remote-IP: 127.0.0.1 X-Remote-Addr: 127.0.0.1 X-Client-IP: 127.0.0.1 X-Host: 127.0.0.1 X-Forwared-Host: 127.0.0.1
Kullanıcı aracısını, içerik türünü, kabul edilen dili vb. veya çerezleri, kullanıcı tanımlayıcı olarak kullanılabilecek herhangi bir şeyi değiştirmeyi deneyin.
IP başına 3 denemelik bir hız sınırı varsa, her üç denemede, başlığın (veya isteklerinizdeki diğer başlıkların veya parametrelerin) IP değerini değiştirin.
Gönderdiğiniz parametrelere eklemeyi deneyin
%00, %0d%0a, %0d, %0a, %09, %0C, %20
Örneğin
param1=value1%%0d%0a param2=value2%00
Örneğin, e-posta doğrulaması için OTP talep ediyorsanız ve yalnızca 3 deneme hakkınız varsa, bu 3 denemeyi kullanın.
[email protected] [email protected]%00 [email protected]%0d%0a And so on
Örneğin,/API/v1/signup uç noktasını test ediyorsanız, /Signup, /SignUp ve /signup'a kaba kuvvet uygulamayı deneyin. Orijinal uç noktalara boş karakterler (yukarıdakilerden) eklemeyi deneyin.
Sınır, /api/v1/resetpassword uç noktasının istekleri üzerindeyse, bazı sorgu parametreleri ekleyerek kaba zorlamayı deneyin - hız sınırına ulaşıldığında, örneğin /api/v1/resetpassword?param1=value1'i deneyin.
Bir uygulamanın hatalı bir mantığı olabilir - her denemeden/deneme serisinden önce hesabınıza giriş yaparsanız, IP'niz için hız sınırı sıfırlanır ve şifre kaba kuvvet saldırınıza devam edebilirsiniz. Eğer bir giriş özelliğini test ediyorsanız, her deneme/deneme serisi için bunu Burp Suit'te ayarlarda Pitchfork saldırısı ile yapabilirsiniz (veya bunun için kendi komut dosyanızı yazabilirsiniz).
İşte sadece bir POW almak için X-Forwarded-For başlığına yönelik basit bir kontrolü nasıl otomatikleştirdiğime dair örneğim:
from random import randint import requests import json url = "https://yourapp.net/api/v1/regconfirm-resend" data = { "email": "[email protected]" } N = 100 def generate_random_ip(): return '.'.join( str(randint(0, 255)) for _ in range(4) ) for _ in range(N): headers = { "Host": "yourapp.net", "Content-Type": "application/json", "X-Forwarded-For": generate_random_ip() } response = requests.post(url, headers=headers, data=json.dumps(data)) print(headers) print(f"Status Code: {response.status_code}, Response: {response.text}")
Olası bir çözüm Cloudflare ve mekanizmalarının kullanılması olabilir. Burada ayrıntılı bir açıklamayı restoreing-original-visitor-ips bulabilirsiniz. Savunma mekanizmalarına sadece kısa bir genel bakış sunacağım.
Orijinal ziyaretçinin gelen IP adresine bağlı uygulamalar kullanıyorsanız varsayılan olarak bir Cloudflare IP adresi günlüğe kaydedilir. Orijinal ziyaretçi IP adresi, CF-Connecting-IP adı verilen, eklenen bir HTTP başlığında görünür. Web sunucusu talimatlarımızı takip ederek orijinal ziyaretçi IP adresini kaynak sunucunuza kaydedebilirsiniz. İstekler kaynak sunucunuza ulaştığında bu HTTP üstbilgisi kullanılamıyorsa Dönüşüm Kurallarınızı ve Yönetilen Dönüşümler yapılandırmanızı kontrol edin.
Pseudo IPv4, Başlıkların Üzerine Yaz olarak ayarlandıysa - Cloudflare, CF-Connecting-IPv6 başlığındaki gerçek IPv6 adresini korurken, sahte IPv4 adresiyle mevcut Cf-Connecting-IP ve X-Forwarded-For başlıklarının üzerine yazar.
NOT: Böyle bir savunma mekanizmasını uygularken kapsamlı testler yapmayı unutmayın. Bu yaklaşım daha sonra kümenin tamamına uygulanabilir ve gereksiz olduğu durumlarda belirli işlevleri ve mikro hizmetleri olumsuz yönde etkileyebilir. Özetle, bir güvenlik ihlalini düzeltirken dikkatli olun çünkü bu durum tüm uygulamayı etkileyebilir. Sisteminizin hangi bölümünün olumsuz etkilenebileceğini analiz edin ve değişiklikleri ürün ortamına göndermeden önce her şeyi test edin.
Burada da yayınlandı.