HTTP Request Smuggling
Last updated
Last updated
Bir uygulama sunucusundaki bir kaynağa ulaşmak için bir HTTP isteği gönderilir. HTTP isteği bir url kullanılarak yapılır. Bir HTTP isteğinde aşağıdaki bilgileri içerir.
Request Line: HTTP istek yöntemini ve sürüm numarası hakkında bilgiler içerir. Bu istek, sunucuya kaynak üzerinden gelen istek hakkında bilgi vermek için kullanılır. POST, GET vb. çeşitli istek yöntemleri vardır. Belirtilen kaynak için back-end kısmına yönlendirme yapar. HTTP sürümü yanıtı geri iletirken sürümü belirtir.
HTTP Request Header: HTTP başlığı, alıcıya istek hakkında bilgilendirme yapar. Yaygın olarak kullanılan bazı request headerlar şu şekildedir -> “Accept, Authorization, Content- Type...”
İleti Kısmı: İsteğin içeriğini içerir ve kullanılan HTTP yöntemine göre değişir.
HTTP Request Smuggling, bir web sitesinin kullanıcıdan alınan HTTP isteklerini işlemine müdahale etme tekniği olarak adlandırılır. Bu zafiyet güvenlik açıkları gibi kritik bilgiler ve saldırganın güvenlik denetimlerini bypass etmesine, hassas verilere yetkisiz erişim elde etmesine ve diğer kullanıcılarını doğrudan tehlikeye atmasına olanak tanır.
HTTP Smuggling, HTTP protokolü kullanarak bir isteğin sınırını belirtmek amacıyla iki çeşit yöntem vardır:
Content-Length (CL): HTTP isteğinin mesaj gövdesinin bayt değerini gösterir.
Transfer-Encoding (TE): İleti gövdesini kullanıcıya güvenli bir şekilde aktarmak için kullanılan kodlama biçimini belirtir. İleti gövdesinin birden fazla veri parçası içerdiği anlamına gelir. Her yığın bayt cinsinden (onaltılık olarak ifade edilir) ardından bir yeni satırdan ve yığın içeriğinden oluşur. İleti, sıfır boyutunda bir yığınla(chunk) sonlandırılır.
CL.TE Zafiyeti: Front-End kısmı -> Content-Length başlığını ve Back-Endà Transfer-Encoding başlığını kullanır. Basit bir HTTP smuggling saldırısı yapılabilir:
Front-End kısmı istekte bulunan Content-Length başlığını işleme alır ve istek gövdesinde bulunan SMUGGLED kısmının sonuna kadar 13 bayt uzunluğunda olduğunu belirler ve ardından bu istek Back-End sunucusuna iletilir.
Back-End sunucusu, Transfer-Encoding başlığını işleme alır. Bu nedenle ileti gövdesine chunked kodlama kullanıyormuş gibi davranır. Sıfır uzunlukta olduğu belirtilen ilk chunki işler ve bu nedenle isteği sonlandırıyor gibi kabul eder. Aşağıdaki baytlar -> SMUGGLED işlenmeden işleme alınmaz ve Back-End sunucusu bunu sıradaki bir sonraki gelen isteğin başlangıcı olarak değerlendirir.
TE.CL Zafiyeti: Front-End, Transfer-Encoding başlığını işleme alırken Back-End kısmı -> Content-Length başlığını işleme alır. Aşağıdaki isteğe benzer bir Smuggling saldırısı yapılabilir:
Front-End sunucusu, mesaj gövdesinde bulunan chunked kodlamayı kullanıyormuş gibi davranır. SUGGLED CODE kısmından sonraki satıra kadar kısmın boyutunu 6 bayt uzunluğunda işler. Back-End sunucusu daha sonra isteği işleme alır ve 6 byte sonrasındaki satırın başına kadar 4 bayt uzunluğunda olarak yorumlar.
TE.TE Zafiyeti: Front-End ve Back-End sunucularının her ikisi de Transfer-Encoding başlığını destekler ancak sunuculardan biri, başlığı bir yol kullanıp gizleyerek onu işlememeye yönlendirebilir. Transfer-Encoding başlığını şaşırtmanın potansiyel olarak sonsuz yolları vardır.
Saldırgan, Back-End veya Front-End sunucusunun bunu yorumlamamasına neden olacak şekilde gizlenmiş bir aktarım kodlama başlığı ile belirtir. Bunu kullandıktan sonra saldırganlar CL.TE ve TE.CL güvenlik açıklarında olduğu gibi açıklananlara benzer saldırılar ile devam eder.