0x02 – “Gizli” guvenlik hatalari

Bazi programlama hatalari vardir ki, defalarca yazilmasina, dergilerde kitaplarda bloglarda uyarilmasina ragmen, hala ve hala yapanlar cikar. SQL Injection, Cross-Site Scripting (XSS) en bilinen aciklardan ikisi, ve hala (ufak olsun buyuk olsun) bircok web sitesinde rastlamak mumkun. Google Translate’te, Gmail’de bile bunlara rastlandigi gorulmustur. Neyse SQL Injection’i ve XSS’i bir kenara birakiyorum, bir baska basit programlama hatasi var ki, hala yapilmasi bence kanunen yasaklanmali, ya da Diyanet tarafindan gunah ilan edilmeli.

Bu “gunah”, aslinda bir “input validation” eksikligi ornegi. Uygulama icin kritik bilgilerin sayfalar arasinda gizli form ogesi (hidden form value) olarak gecirilmesinden bahsediyorum. Bu hataya asikar olmayanlar icin bir ornek vereyim. Diyelim uzun ugraslar sonucunda buyuk bir online alisveris sitesi kurdunuz. Kullanicilar (musteriler) sitede dolasip urunleri sepete atiyor, sonra da kasaya gidip odemeyi gerceklestiriyorlar. Simdi bu urunlerin fiyatlarinin bir veritabaninda tutulmasi, ve kullanici urun sayfasina geldiginde ya da kasaya vardiginda, fiyatlarin bu veritabanindan cekilmesi ve gosterilmesi mantikli, degil mi? Ya da en en kotu, fiyat bilgisi sunucu tarafinda kodun icinde yazili olur (hardcoded). Kesinlikle yapilmamasi gereken sey ise, fiyat bilgisini kullanici tarafindan (client-side) almaktir. Bu ‘client-side’ nasil olur? Urunun sepete eklendigi sayfada, ya da son satin alma (checkout) sayfasinda bulunan formda soyle bir input olur:

<input type=”hidden” name=”fiyat” value=”100″ />

Simdi bu input “hidden” yani gizli oldugu icin, kullanici sayfada “fiyat” diye bir kutucuk gormez, dolayisiyla da fiyatla oynamak aklina gelmez. Ama cin bir arkadasimiz cikar da sayfanin HTML koduna bakarsa o “gizli” input da arkadasimiza davetkar davetkar goz kirpar. Cin arkadas formu sunucuya yollamadan once o 100 degerini 1 diye degistirirse ne olur? 100 liraya satmaya calistigimiz urunun fiyati da 1 liraya duser. Tabii o  input degeri sunucu tarafindan ignore ediliyor olabilir, ama o zaman orada durmasinin bir anlami yok zaten…

Peki bu degeri nasil degistirebilir kullanici? O da gercekten cok basit, bircok yontemi var. Ornegin WebScarab gibi bir proxy kullanilip request’ler intercept edilebilir, ya da Tamper Data gibi bir Firefox eklentisiyle ayni islem yapilabilir.

Bu kadar basit bir hataya gunumuzde hala rastlamak mumkun mu? Cevabini daha Temmuz ayinda tesadufen yakaladigim bir siteyi ornek gostererek paylasmak istiyorum. Ama baslamadan once, acigi buldugumda ne yaptigimi ve acigin su anki durumunu soylemem lazim. Zaman cizelgesinde soyle anlatabiliriz:

  • 2009/07/21 – Guvenlik zaafini tespit ettim. Site sahibine mail attim.
  • 2009/07/27 – Site sahibinden cevap gelmeyince sitenin genel iletisim adresine mail attim.
  • 2009/07/29 – Site sahibinden, acik hakkinda detay isteyen bir mail geldi
  • 2009/08/13 (tatil donusu:)) – Acik hakkinda detayli bilgi site sahibine verildi
  • 2009/09/07 – Acigin hala var oldugunu gorunce kontrol amacli bir mail daha attim. Son uyari olarak gordugum bu maile cevap gelmedigi ve acik kapatilmadigi taktirde bir sure sonra baskalariyla paylasmayi dusunuyordum.
  • 2009/09/18 – Site sahibinden, acigin kapatildigina dair bilgi ve tesekkur maili geldi.

Sonucta herkes mutlu oldu, ben kendimi kahraman gibi hissettim 5 dakikaligina, adamcagiz da sitesinden para kazanmaya devam etti.

Simdi acik hakkinda biraz detaya inelim. Dedigim gibi acik artik kapatildi, dolayisiyla siteyi bulmaya calismayin.

Sitemiz Isvecli bir acik arttirma ile alisveris sitesi. Urunler acik arttirmaya sunuluyor, acik arttirma basladiginda X saniye geri sayim basliyor, bu surede bir uye teklif vererek (“bid” ederek) fiyati bir unite (1 kron, 5 kron, vs. acik arttirmaya gore) yukseltiyor. Her bir teklif sonrasinda sure (X saniye) yeniden basliyor. X saniye sonunda kimse arttirmazsa son teklif veren muzayedeyi kazaniyor. Sitenin ticaret sistemi ise bu “teklif”ler uzerine kurulu, yani muzayedede teklif verebilmek icin “teklif kredisi” (bids) satin almak gerekiyor. Ornegin 20 kredi 100 kron, 100 kredi 250 kron, 200 kredi 500 kron gibi.

Teklif satin almak icin ise her alisveris sitesinde oldugu gibi bir satin alma sayfasi hazirlanmis. Iste bu sayfaya goz attigimizda yukarida tarif ettigim guvenlik acigi goze carpiyor. Hatta birazdan goreceginiz gibi, siteyi hazirlayanlar gozumuze carpsin diye ugrasmislar adeta :) Satin alma sayfasindan bir parca kodu aynen kopyaliyorum:

<!-- Here you add the price, the format is 2.00, the divider must be a dot (.) -->
<input type="hidden" name="freeform_price_1" value="4.50" />
<!-- Here you add the VAT, it must be in percentage ie. 25.00 for 25% VAT -->
<input type="hidden" name="freeform_vat_1" value="25.00" />

Gordugunuz gibi burada “freeform_price_1″ ve “freeform_vat_1″ hidden fields’leri ile sirasiyla unite fiyati ve kdv yuzde degerleri gonderiliyor. Yani tekrar etmek gerekirse, urunun satis fiyatini belirleyen degerler kullanici tarafindan yollaniyor sunucuya. Bu durumda kullanici olarak o formda bulunan degerleri yani 4.50 ve 25.00’i 0.1 ve 1 yaparsak, urunu cok daha ucuza alabiliriz. Ayrica farkettiyseniz programcilar boyle bir hata yapmakla kalmamis, ayrica 2 adet yorum yazarak “su sekilde oynayarak fiyati degistirebilirsiniz” diye bize yardimci olmaya calismislar.

Acigin kullanilabilir durumda oldugunu gostermek amaciyla site sahibine 4 tane resim gondermistim. Ilk ikisinde normal satin alma sayfalari gozukuyor. Sonrakindekilerde ise benim oynadigim degerler ile nasil daha ucuza satin alabilecegim gozukuyor. Buyrun:

Normal - 100 tanesi 460 kron

Normal - 100 tanesi 460 kron


Normal - Odeme sayfasi

Normal - Odeme sayfasi

Hack - 1000 tanesi 10 kron

Hack - 1000 tanesi 10 kron

Hack - Odeme sayfasi

Hack - Odeme sayfasi

Onlem

Yazilim guvenliginin ana kurallarinda biri, kullanicidan gelen girdiye (input) hicbir zaman guvenmemektir. Kullanicidan gelen input program icerisinde isleme sokulmadan once mutlaka kontrol edilmelidir (input validation). Yukarida orneklenen, formlardan yani kullanici tarafindan gelen input’lar da, “gizli” olsalar bile, kontrol edilmelidir.

Ancak yukaridaki ornek hakkinda biraz dusunursek su sonuca variriz: fiyat, kdv ve bunun gibi uygulama sahibi tarafindan belirlenen degerlerin kullanici (client) tarafindan sunucuya (server) gonderilmesi gereksiz ve son derece tehlikelidir. Bu gibi degerler sunucu tarafinda, ornegin bir veritabanindan, saklanmali, kullaniciya bu kaynaktan sunulmalidir.

  1. hakikaten süper
    ellerinize sağlık mükemmel bir yaklaşım olmuş
    tebrik ederim

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>