14 Mart 2011 Pazartesi

Unfiltered Header Injection Vulnerability

Forging HTTP Request Headers With Flash
http://www.securityfocus.com/archive/1/441014/30/0/threaded paper'ı (Amit Klein, Temmuz 2006) üzerine inşa edilmiştir. Acunetix tarafından raporlanan "Unfiltered Header Injection in Apache" zafiyetinin nasıl exploit edilebileceği ve neden bir zafiyet olarak kabul edilmesi gerektiği anlatılmaktadır.

Ön Bilgi -Flash:
Flash filmleri SWF (ShockWave File) dosyaları olarak yayımlanır. Adobe, Flash'a scripting kabiliyeti eklemek amacıyla Javascript benzeri bir zengin dil geliştirdi: ActionScript. ActionScript'in ilginç özelliklerinden biri de 3üncü pati sitelere, onları çağıran browser üzerinden HTTP talep (request) gönderebilmesidir. Bu nokta, Flash'ın güvenlik açısından ilginçleştiği noktadır. Flash ile 3üncü parti sitelere gönderilmek üzere, "standart" Javascript yolu ile oluşturulup gönderilmesi mümkün olmayan talepler bina etmek mümkün. Bu konuda özellikle ilgilendiğimiz yönü de giden talep ile birlikte rasgele / keyfi HTTP talep başlıkları (header) gönderebilme yeteneği.

Flash ile Keyfi HTTP Talep Başlıkları Gönderme:
Aşağıdaki kodlar, keyfi bir başlıkla birlikte bir GET talebi göndermek için ActionScript 2.0 kodu sözdizimidir (syntax).

Bu örnekte:
Talebin gönderileceği site: http://www.vuln.site/some/page.cgi?p1=v1&p2=v2
Gönderilecek keyfi başlık: Foo:Bar
Kodun çalışabileceği Flash versiyonları: Flash 7 ve Flash 8
var req:LoadVars=new LoadVars();
req.addRequestHeader("Foo","Bar");
req.send("http://www.vuln.site/some/page.cgi?p1=v1&p2=v2",
"_blank","GET");

Benzer bir kod da POST talebi gönderir (Yukarıdaki bilgilere ilaveten gövde olarak da a=b ve c=d gönderiliyor):
var req:LoadVars=new LoadVars();
req.addRequestHeader("Foo","Bar");
req.decode("a=b&c=d");
req.send("http://www.vuln.site/some/page.cgi?p1=v1&p2=v2",
"_blank","POST");

Flash nesnesinin çağırılması ile talep 3üncü parti siteye gönderilir. Browser'ın normalde gönderdiği cookie'ler, bu durumlarda da gönderilecektir. Neredeyse tüm browser'ların standart gönderdiği başlık olan User_Agent başlığı gönderilir. HTTP linkleri desteklenmektedir.

Bu örnek, Microsoft IE 6.0, Microsoft IE 6.0 SP 2, Firefox 1.5.0.4 ile, Flash v8.0.22.0 ve Flash v7.0.19.0 çalıştırılarak başarıyla gerçekleştirilmiştir.

IE içinde, basitçe addRequestHeader fonksiyonunu çağırarak var olan "normal" başlıkları yeniden yazmak da mümkün. Bu durum hem Referer, hem de User-Agent başlıkları için mümkün. Firefox içinde aynı yöntem uygulandığında başlıklar talebe append olur / talebe eklenir.
// One UA in IE 6.0 SP2, two UAs in FF 1.5.0.4
req.addRequestHeader("User-Agent","Hacker/1.0");

// One Referer in IE 6.0 SP2, two Referers in FF 1.5.0.4
req.addRequestHeader("Referer","http://somewhere/");

Ayrıca, IE içinde, başlık adına kolon ekleyerek bazı hassas başlıkları (Host ve Content-Length gibi) da yeniden yazmak mümkün. Bu teknik Firefox'ta uygulanamıyor.
req.addRequestHeader("Host:","foobar.site");

Not: Hedef URL, Flash filmi ile aynı domain'de durumda, LoadVars, HTTP yanıtlarını okumak için de kullanılabilir; bu da LoadVars'ı Flash tabanlı AJAX benzeri framework'ler için temel haline getirmekte.

Güvenlik Açısı:
Bir saldırganın, kurbanın web browser'ını kandi keyfi talep başlıklarını enjekte ettiği talepleri 3üncü parti sitelere göndermeye zorlama kabiliyeti, güvenlik açısından değerlendirmeye tabi tutulacak durumdur.

Burada açıklanan saldırıların, tek başlarına XSS saldırıdı olmadığını anlamak önemli; domainler arası (cross-domain) güven ilişkisini ya da Flash nesne ile gömüldüğü HTTP sayfa arasındaki güven ilişkisini kıran bir yapı söz konusu değil. Buradaki saldırılar sadece bir Flash nesnesinden bir URL'e içinde saldırganın işine yarayacak başlıkları barındıran HTTP talebi gönderebilmenin mümkün olduğu gerçeğinden faydalanmaktadır. Bu mümkünat, saldırgana kurbanın browser'ında açılacak bir Flash uygulamayı (Flash nesnenin gömülü olduğu bir HTTP sayfası ya da doğrudan uygulama) barındıran bir link göndermesiyle ortaya çıkan, kendi başına bir sorun. Bu Flash nesnesi, saldırganın ihtiyaç duyduğu başlıkları barındıran HTTP taleplerini hedef web sitesine gönderir ve bu durum kurbanın browser'ının güvenlik teamüllerinin kırılmasına sebep olur.

Diğer bir deyişle, yaygın olan HTTP başlıkları, keyfi değerler taşımaya zorlanamaz kanısı yerle bir...

Örnek: Expect Başlığı:
http://www.securityfocus.com/archive/1/433280 adresinde Apache 1.3.34/2.0.57/2.2.1 versiyonlarında var olan bir enjeksiyon problemi anlatılıyor: Bu versiyonlar, Expect başlığı yolu ile Javascript de dahil HTML verisi enjekte edilebilmesine olanak veriyor. Bir Flash nesnesi ile bu açıklığı exploit etmek oldukça basit. Kurbanın aşağıdaki linki tıkladığını düşünelim:
http://www.evil.site/attack.swf

Adres, aşağıdaki ActionScript kodunu taşıyan bir Flash nesnesini işaret ediyor:
var req:LoadVars=new LoadVars();
req.addRequestHeader("Expect","<script>alert('gotcha!')</script>");
req.send("http://www.target.site/","_blank","GET");

ActionScript, kurbanın browser'ından hedef URL'e Expect başlığı içinde kötücül HTML (Javascript) cümleleri barındıran bir request gönderir. Eğer hedef uygulama, zafiyeti barındıran bir Apache versiyonu üzerinde çalıştırılıyorsa, saldırı XSS ile sonuçlanır.

Flash 9:
Haziran 2006'da Flash 9 anons edildi (günümüzde 10 da mevcut). Flash 9'da yukarıda sözü edilen teknikler (LoadVars), ne herhangi browser-provided başlık için (Host, User-Agent ya da Referer gibi), ne de Content-Length gibi çoğu "korunan" başlıklar için işe yarıyor. Ancak yine de Expected gibi başlıklar gönderilerek bu açıklık exploit edilebilmekte.

Saldırı Tekniğinin Kısıtları:

  • URL ve talebin gövde kısmı her zaman URL-encoded olmak zorunda. Bu yüzden SP, HT, CR ve LF (ve daha bir sürü) karakteri kaba halinde zorlamak mümkün değil.
  • Sadece GET ve POST talepleri gönderilebilir.
  • IE'de her başlığın sadece 1 olgusu gönderilebilir.

Hiç yorum yok:

Yorum Gönder

Web Uygulama Sızma Testleri İçin Kontrol Listeleri - V

Checklist for Web App Pentesting - V 6. Veri Denetimi (Data Validation) Testleri 6.1 Girdi Denetimi Bütün girdiler denetlenmelidir....