Unexpected Redirect Response Body (Too Large)

Emre Iyidogan - 27 Ocak 2017 -

Netsparker, bir tarama esnasında veya sonrasında Information olarak geçen bazı uyarılar verebilir. Bu uyarıları hafife almak bazen kötü sonuçlar doğurabilmektedir. Bunlardan biri olan ve authentication bypass ya da çeşitli script hataları gibi olumsuzluklara neden olabilen Unexpected Redirect Response Body (Too Large) uyarısı hakkında bilgi edinmek için yazımızı okuyabilirsiniz.

Unexpected Redirect Response Body (Too Large)

Unexpected Redirect Response Body (Too Large)

Netsparker web uygulaması güvenlik tarayıcısı, kontrol ettiği güvenlik açıkları bakımından gelişmiş bir zafiyet listesine sahiptir. Critical (Tehlikeli), Important (Önemli), Medium (Orta), Low (Düşük) ve Information (Bilgi) kategorilerinden oluşan bu liste pek çok zafiyet türünü barındırır. Konuyla alakalı olarak kullanıcılar tarafından yapılabilen yanlışlardan biri, Critical ve Important zafiyetlere yoğunlaşırken diğer olası güvenlik açıkları veya uyarılarının göz ardı edilmesidir. Kale alınmayan Information seviyesindeki bir zafiyet istenmeyen sonuçlar doğurabilir. Söz konusu uyarılardan biri de Information kategorisinde yer alan Unexpected Redirect Response Body (Too Large) adlı uyarıdır. Bu uyarıyla alakalı ayrıntıları yazının devamında bulabilirsiniz.

Unexpected Redirect Response Body (Too Large) Nedir?

Netsparker’ın raporladığı problemlerden biri olan “Unexpected Redirect Response Body (Too Large)” adlı sorun, yönlendirmeden sonra sayfanın beklenen yanıtı döndürmemesinden kaynaklanır. Diğer bir deyişle istek yapılan sayfadan dönen HTTP yanıtında Location header’ı ile bir yönlendirme yapıldığı gözleniyor olsun. Olması gereken, istek yapılan sayfadaki verilerin HTTP 302 Found ya da HTTP 302 Moved Temporarily durum kodunun bulunduğu yanıt gövdesinde yer almamasıdır. Aksi takdirde çeşitli programlama hataları ekrana yansıyabilir ya da kimlik doğrulama istenen sayfalarda bu mekanizmanın bypass edilmesi mümkün hale gelebilir.

Aşağıda, Netsparker’ın tespit ettiği Unexpected Redirect Response Body (Too Large) probleminin ekran görüntüsünü görebilirsiniz:

Unexpected Redirect Response Body (Too Large) Problemine Dair Netsparker Ekran Görüntüsü

Örnek vermek gerekirse; dizine erişim sağlandığında Location header'ı vasıtasıyla login.php'ye yönlenen bir giriş panelini düşünelim. Gerekli kullanıcı bilgileri girildiği takdirde dizindeki index.php dosyasına erişim sağlanıyor:

<?php
if(!isAdmin()) {
	header("Location: login.php");
}
?>
You are logged in.<br>
Your IP: <?php echo $_SERVER['REMOTE_ADDR'];?><br>
<a href = "logout.php">Sign Out</a>

Kullanıcı bilgileri girilmeksizin web tarayıcısı ile index.php'ye erişmeyi deneyelim. Örnek senaryoda tarayıcı bizi login.php'ye yönlendirirken bir proxy yazılımı ile izlediğimizde yapılan isteğin şu şekilde olduğunu görürüz:

GET http://localhost/user/index.php HTTP/1.1
Host: localhost
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: PHPSESSID=7t7h4oqvo1rlneebrjnofhi714

Dönen yanıt ise şu şekilde olur:

HTTP/1.1 302 Found
Date: Thu, 19 Jan 2017 00:29:47 GMT
Server: Apache/2.4.23 (Win64) PHP/5.6.25
X-Powered-By: PHP/5.6.25
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Location: login.php
Content-Length: 1025
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

You are logged in.<br>
Your IP: 192.168.56.1<br>
<a href = "logout.php">Sign Out</a>

Görüldüğü üzere bir yönlendirme header’ı bulunmasına ve giriş yapmamamıza rağmen yanıt gövdesinde “Giriş Yapıldı” uyarısını, IP adresimizi ve “Çıkış” linkini görmekteyiz. Bu işlemle, araya girip kimlik doğrulamayı aşmış ve index.php'ye erişim sağlamış olduk. Ek olarak, kullandığımız proxy yazılımından bir yardım daha alıp browser üzerinden de index.php'ye erişebilmemiz mümkündür. Fiddler gibi proxy yazılımlarının yanı sıra http://web-sniffer.net gibi uygulamanızın HTTP trafiğini kontrol edebileceğiniz web tabanlı uygulamalar da bu tür işlemlerde kolaylık sağlamaktadır.

Alınması Gereken Önlemler

  • PHP uygulamalarında yönlendirmeyi yapan kod parçacığından hemen sonra exit() fonksiyonunu kullanın. Böylelikle, gerekli kullanıcı bilgileri sağlanmadığı takdirde kod sonlanır ve ardından gelen kodlar yürütülmez.
  • ASP.NET uygulamalarında yönlendirmeyi Response.Redirect("redirected-page.aspx", false) şeklinde değil Response.Redirect("redirected-page.aspx", true) şeklinde kullanın.
  • Kullanıcının yönlendirildiği noktadan itibaren script çalışmasını durdurmak için HTTP yanıtını bitirin.