Açılımı Hypertext Transfer Protocol olan HTTP, web tarayıcıdan veya istemciden gelen istekler ile sunucu arasındaki yolu sağlayan yapıdır. HTML belgeleri, resimler, videolar vb. veriler, TCP kullanılarak HTTP tarafından iletilir. Varsayılan olarak kullanılan port TCP 80’dir. HTTP web tarayıcıları ile sunucuların ortak bir dilde iletişim sağlamasına yarayan bir protokoldür. İstekler belli kurallara göre iletilir.
HTTP isteği 4 öğeden oluşur:
İstek URI'ı, istek satırındaki yöntemi takip eder. URI'ın amacı, isteğin hedefi olan kaynağı tanımlamaktır. Daha sonra ise HTTP versiyonu belirlenir. Örneğin,
Bir istek örneği,
GET /hello.htm HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.image4.io
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
HTTP Request Smuggling (HTTP İstek Kaçakçılığı), bir web sitesine gelen isteklerin işlem sırasını değiştirme yoluyla ortaya çıkan bir web zafiyeti türüdür. İstek kaçakçılığı zafiyetleri genellikle kritik bir zafiyet türüdür.
Günümüzde özellikle bug bount sektöründe sık karşılaşılan bir zafiyettir. Saldırganın güvenlik denetimlerini atlamasına (WAF Bypass), hassas verilere yetkisiz erişim sağlamasına ve diğer uygulama kullanıcılarını doğrudan tehlikeye atmasına yol açabilir.
Kullanıcılar hedef siteye gönderecekleri istekleri ilk önce front-end server’a gönderir ve bu sunucu istekleri ardı ardına sıraya koyarak TCP/TLC bağlantısı üzerinden back-end server kısmına iletir. Gönderilen POST isteği içerisinde ikinci bir HTTP isteği vardır. Bu ikinci istek POST isteği içerisinde olduğu için WAF veya benzeri güvenlik ürünleri tarafından algılanmaz. Back-end server kısmına giden post isteği server tarafından iki ayrı istekmiş gibi ayrıştırılıp işlenir.
Burada saldırı gerçekleştirilebilmesi için işin içine Content-Lenght ve Transfer-Encoding header’ları girer. Content Lenght header’ı POST isteğinin boyutunu bayt cinsinden belirtir. Transfer-Encoding header’ı ise isteğin tür olarak chunked(parçalı) olduğunu belirtir.
Şekil 1’deki istekte ilk 5 satır ana POST isteğidir. Kalan kısım ise POST isteğine enjekte edilmiş ikinci bir GET isteğidir. İstekteki 0 ilk isteğin sonlandığını gösterir.
Şekil 2’deki istek ise Şekil 1’de gönderilen isteğin back-end server’da ayrılmış halidir.Back-end server tek parça halinde gönderilmiş olan POST isteğini ayrıştırıp iki farklı istekmiş gibi işler. Sonuç olarak back-end server admin klasörünü yanıt olarak gönderir.
Bu saldırı türünde, öncelikle Transfer-Encoding (TE) başlığı kullanılarak kullanılarak oluşturulan isteğin tamamı web uygulama sunucusuna gönderilir. Ardından web uygulamasının Content-Lenght (CL) e bakarak isteği ikiye ayırması ve işlemesi beklenir.
Bu saldırı türünde, ön uç sunucu isteği okuyarak alır, Content-Lenght da bunun tam bir istek olduğunu belirler ve daha sonra bunu arka uç sunucuya iletir. Arka uç sunucusu isteği aldıktan sonra, Content-Lenght işlemediği için iki istek aldığını düşünür.
Bu saldırı türünde front-end sunucu, content-length başlığına bakar. Bu başlıkta belirtilen boyut kadar datayı, güvenlik denetleyicilerine takılmadan back-end sunucuya gönderir. Back-end sunucu gelen istekleri ayırır ve transfer-encoding başlığına bakarak bu istekleri çalıştırır.
Burp Suite ile giden istek tutulur.
Sağ tıklanıp Extensions->HTTP Request Smuggler->Smuggle probe seçilir. Eğer HTTP Request Smuggler eklentisi yüklü değilse, eklenti extender kısmından yüklenebilir.
Sonra açılan Attack Config kısmında gerekli ayarlar yapılıp onaylanır.
Extender kısmından HTTP Request Smuggler seçilip output kısmından eklentinin test sonucu öğrenilir.
Target sekmesinde Şekil 9’da görüldüğü gibi Possible HTTP Request Smuggling bulunduğu görülür. Eklentinin ilk gönderdiği request yani Request 1 tıklanarak Extensions->HTTP Request Smuggler->Smuggle attack (CL.TE) seçilir. Bu kısımda issues (bulgular) adlı başlıktan da görüldüğü gibi olası HTTP Request Smuggling zafiyetinin olduğu belirtilmektedir. Bu sonuca ulaşılmasındaki ana etken Delayed Response’dur.
Lab açıklamasında bize verilen bilgiye göre server GPOST yöntemine karşı zafiyetli olduğu için Turbo Intruder’ın kullandığı kodda prefix değişkenine ‘G’ değeri verilir. Bu G değeri gönderilen gerçek GET isteğine eklenecek olan POST isteğinin önüne eklenecek olan değişkeni temsil etmektedir. Attack butonuna basıldığında saldırı başlar.
Gönderilen isteklerden 403 hata kodlu isteğin response’unda da görüldüğü gibi GPOST isteği gönderilmiştir. Ve başarıyla HTTP Request Smuggling zafiyeti bulunmuştur.
Bu zafiyetin HTTP 2.0 protokolünün kullanılarak önlenebileceği belirtilmiştir. Ön ve arkada bulunan servis mekanizmaları için aynı servisler kullanılabilir. Böylelikle istekler arasındaki sınırları mekanizmalar fark edebilir.