HTTP Request Smuggling (HTTP İstek Kaçakçılığı)
Web Güvenliği

HTTP Request Smuggling (HTTP İstek Kaçakçılığı)

HTTP Nedir?

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 Ögeleri

HTTP isteği 4 öğeden oluşur:

  • İstek satırı (GET /admin)
  • Başlık (Accept-Language)
  • Boş bir satır
  • İsteğe bağlı bir ileti gövdesi

HTTP Metodları

  • GET Metodu: Belirtilen kaynaktan veri almak için kullanılır.
  • POST Metodu: Resim dosyaları, kullanıcı bilgileri gibi verileri gönderirken kullanılır.
  • PUT Metodu: Dosyayı belirtilen kaynaktan güncellemek için kullanılır.
  • HEAD Metodu: GET metodu gibi kaynaktan veri almak için kullanılır fakat yanıt gövdesini aktarmaz.
  • DELETE Metodu: Belirtilen kaynağı silmek için kullanılır.
  • PATCH Metodu: Belirtilen kaynağın belli kısımlarını değiştirmek için kullanılır.
  • OPTIONS Metodu: Belirtilen kaynak için iletim seçeneklerini tanımlamak için kullanılır.

İ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,

  • GET /test.html HTTP/1.1
  • POST /index.html HTTP/1.1

HTTP Başlıkları

  • Accept-Charset
  • Accept-Encoding
  • Accept-Language
  • Authorization
  • Expect
  • From
  • Host
  • Content-Length
  • Transfer-Encoding

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 Nedir?

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.

Nasıl Çalışır?

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.

Saldırı Türleri

  • TE-CL

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.

  • CL! = 0

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.

  • CL-TE

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.

 

Örnek Saldı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.