Hoşgeldin Misafir

HTTP Response Splitting Nedir?

xS0N3R

23 Ağu 2020
5,424 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
Herkese merhaba,

Uzun bir araştırma ve doküman toplama sürecinden sonra, web güvenliğinde çok bilinmeyen ama etkili bir saldırı türü olan "HTTP RESPONSE SPLİTTİNG" nedir, detaylı ve örnekler üzerinden sizlere aktarmaya çalışacağım. Keyifli okumalar dilerim

HTTP Response Splitting Nedir?: HTTP Response Splitting, bir web uygulamasının HTTP yanıt başlıklarını kullanıcı girdisine göre oluştururken güvenli olmayan şekilde işleme yapması sonucunda oluşan bir güvenlik açığıdır.

Bu saldırıda, kötü niyetli biri özel karakterler kullanarak (\r\n – yani satır sonu ve yeni satır) HTTP yanıtını ikiye bölebilir ve kendi sahte yanıtını enjekte edebilir.

Yani kısaca, Web uygulaması kullanıcıdan gelen veriyi doğrudan HTTP başlığına koyarsa...

Saldırgan \r\n karakterleriyle HTTP yanıtını bölebilir...

Sonuç? Tarayıcı, yanıltılmış bir cevap alır ve zararlı içerik çalıştırılabilir.

Bu Saldırı Nasıl Çalışır?: Kullanıcı bir web site URL sine parametre gönderir.

(Örneğin ?name=Mehmet)

Uygulama da bu veriyi HTTP Response başlığına koyar.

(Location: /hello?name=Mehmet)

Ama saldırgan şöyle bir parametre gönderirse;

(?name=Mehmet%0d%0aSet-Cookie:%20admin=true)

0d%0a = \r\n demektir = yani yeni satır. Sunucu da şu yanıtı döndürür;

Kod:
HTTP/1.1 302 Found
Location: /hello?name=Mehmet
Set-Cookie: admin=true

Tarayıcı bunu yedi ve çakma bir Set-Cookie aldı. Yani saldırgan sitede kendini admin yaptı

Şimdi gelin bunu basit bir gerçek hayat örneği ile detaylı ele alalım;

Düşünün ki, Mehmet'in hamburgerci sitesine bir yönlendirme yapılıyor;

Kod:
https://hamburgerci.com/go?next=/siparis

Site, gelen next parametresine göre kullanıcıyı başka sayfaya yönlendiriyor;

Kod:
HTTP/1.1 302 Found
Location: /siparis

Ama hacker arkadaşımız gelip de şunu yaparsa;

Kod:
https://hamburgerci.com/go?next=/siparis%0d%0aSet-Cookie:%20admin=true

Sunucu kafayı yer ve şu yanıtı döndürür;

Kod:
HTTP/1.1 302 Found
Location: /siparis
Set-Cookie: admin=true

Tarayıcı da "Ben bu admin=true çerezini bir kaydedeyim" der ve hayırlı olsun. Hacker sitede admin yetkisi kazandı

Tabikide bunlar böyle hemen olacak şeyler değil. Sitede gerçekten HTTP Response açığı varsa bu işlemler olur. Her zamanki gibi bunun içinde uzun bir uğraş ve emek gerekiyor.

HTTP Response Splitting Saldırıları Nerelerde Kullanılır?: Bu saldırılar HTTP başlıklarında (Location, Set-Cookie, Content-Disposition), Log sistemlerinde, Mail headerlarında (eğer STMP kullanılıyorsa), Web cache'ler (CDN' ler bile kandırılıyor bu saldırı yönetimde) ve hedef phishing sayfalarına yönlendirmelerinde kullanılır.

Yani sizin bir phishing sayfanız var. Hedef sitede HTTP Response açığı varsa bu yönlendirme ile kullanıcı hedef sayfada bir yere gitmek istediğinde sizin phishing sayfanıza yönlendirir. Düşününce çok etkili bir saldırı yöntemi değil mi? Düşünsenize bir E ticaret sitesinin HTTP Response açığının olduğunu. Bir kullanıcı satın alma sayfasına gittiğinde sizin phishing sayfanıza gidiyor aslında. Ne kadar etkili umarım anlatabilmişimdir

HTTP Response Splitting Saldırılarından Nasıl Korunulur?: Bu konu için kendi hazırladığım bir Python kodu üzerinden anlatayım;

Python:
from flask import Flask, request, Response

app = Flask(__name__)

@app.route('/go')
def go():
    target = request.args.get('next')
    return Response(f'Location: {target}', status=302)

Şimdi bu kodda bir kullanıcı URL ye next=birşey ekliyor. Bu değer de direkt olarak yönlendirme başlığına yani Location yazılıyor. Eğer kullanıcı zararlı karakterler (\r \n) eklerse bu yanıt bölünür ve tarayıcı ikinci yanıtı \n gerçek zanneder. Saldırgan buraya neler ekler orasını siz düşünün

Fark ettiyseniz hiçbir önlem, kontrol yok. Direkt Location a istek iletiliyor. Bu da çok tehlikeli bir kullanım.

Şimdi diğer koda geçelim;

Python:
from flask import Flask, request, redirect
import urllib.parse

app = Flask(__name__)

@app.route('/go')
def go():
    target = request.args.get('next', '/')
    safe_target = urllib.parse.quote(target, safe="/")
    return redirect(safe_target)

Burada da aynı şekilde kullanıcıdan next değeri alınır. Alınıyor ama fark ettiyseniz bu sefer quote() ile zararlı karakterler temizleniyor istekten önce. Sonra redirect() de güvenli şekilde temizlenmiş isteği yönlendiriyor. Artık \r \n saldırıları etkisini kaybetti.

Fark ettiyseniz quote() ile zararlı içerikleri temizledik, sonra redirect() e güvenli şekilde yönlendirme yaparak tarayıcıya istek attık.

Yani bu iki örnekte ne demek istedik;

1. Kullanıcı girdiklerini direkt olarak HTTP başlıklarında kullanmamayı,

2. Header değerlerini encode etmeyi (temizlemeyi)

3. Content Security Policy gibi ek koruma yapmamız gerektiğini anlattık.

BONUS: HTTP Response Saldırılarında Kullanılan En Temel Kodlar:

Kod:
0d%0a → \r\n

Location: hedefsite

Set-Cookie: admin=true

Content-Type: text/html

Bunlar da bu saldırıda en çok kullanılan kodlar. Gerisi sizde, ben müsilet kabul etmiyorum

Evet bir konumuzun daha sonuna geldik. Mümkün olduğunda sıkılmayacağınız okurken keyif alacağınız şekilde hazırlamaya çalıştım. Konu hakkında eksik bilgileri de yorumlarda belirtebilirsiniz.

Bir sonraki konularda görüşmek üzere. Kendinize iyi bakın