Bilgisayar Güvenliği Bilgi Merkezi

bilgisayar,mail,web,site,şifre,network,güvenlik,hack,security,ddökümanları


Bağlı değilsiniz. Bağlanın ya da kayıt olun

HTML Injection Saldırı Güvenlik Önlemleri

Önceki başlık Sonraki başlık Aşağa gitmek  Mesaj [1 sayfadaki 1 sayfası]

1Güvenlik HTML Injection Saldırı Güvenlik Önlemleri Bir Cuma Ara. 11, 2009 5:16 pm

Admin

avatar
Admin
Bu yazımızda HTML Injection (HTML Enjeksiyonu) olarak adlandırılan saldırı tekniğini, tehlikenin nasıl oluştuğunu ve ne gibi önlemler alınabileceğini işleyeceğiz.
HTML Injection

HTML Injection tehlikesiyle, sıklıkla, uygulamanın kullanıcıdan aldığı verileri kaydedip daha sonra işlediği durumlarda karşılaşmaktayız. Örnekleyecek olursak; bir ziyaretçi defteri uygulamasında, yetersiz güvenlik farkındalığına sahip geliştiricinin kullanıcıdan aldığı verileri herhangi bir işleme tabi tutmadan saklayıp, ekrana çıktı olarak vermesi potansiyel olarak bu saldırıya kapı aralamaktadır.
HTML, tam olarak bir programlama dili olarak ifade edilemeyeceğinden ve HTML kodlarıyla yapabilecekleriniz bir web uygulamasının genellikle görsellik kısmıyla ilgili olduğundan ve saldırının ana teması HTML kodlarının enjekte edilmesi olduğundan dolayı en basit düzeyde ve zararı en az olan saldırı olarak değerlendirilebilir [1]
HTML Injection tekniğini, en çok rastlanılan iki şekliyle inceleyeceğiz. Bunlar; ’sayfa düzenini bozmaya yönelik’ ve ’sayfayı yönlendirmeye yönelik’ saldırılardır.
Örnek Uygulama

Örnek ziyaretçi defteri uygulamamız kullanıcılardan aldığı mesajları kaydederek herhangi bir onay işlemine tabi tutmadan sayfada göstermektedir. İlgili insert işlemine ait kodlar ve tablo tasarımına ait ekran görüntüsü aşağıdaki gibidir;


Kod:
    //Function of New Message Insert to Guestbook – STARTprivate void NewMessageInsert() { string strConnStr = WebConfigurationManager.ConnectionStrings["guestbookcs"].ToString();SqlConnection conn = new SqlConnection(strConnStr); //Database Processing try{ SqlCommand cmdInsert = new SqlCommand(”INSERT INTO tblMessages (msgComposer, msgContent, msgStatus) VALUES (@vComposer, @vContent, @vStatus)”, conn);cmdInsert.Parameters.AddWithValue(”@vComposer”, txtComp.Text.ToString()); cmdInsert.Parameters.AddWithValue(”@vContent”, txtCont.Text.ToString());cmdInsert.Parameters.AddWithValue(”@vStatus”, true); conn.Open();cmdInsert.ExecuteNonQuery(); lblStatus.Text = “Message inserted”;} catch (Exception exError){ lblStatus.Text = “Error: ” + exError.Message.ToString();} finally{ conn.Close();conn.Dispose(); txtComp.Text = string.Empty;txtCont.Text = string.Empty; }}

    //Function of New Message Insert to Guestbook – END

 
Hemen insert işlemini gerçekleştirip, bıraktığımız mesajı okuyacağımız sayfanın kodlarını inceleyelim.
Kod:
    <ItemTemplate>  msgId: <asp:Label ID=”msgIdLabel” runat=”server” Text=’<%# Eval(”msgId”) %>’ />  <br />msgComposer: <asp:Label ID=”msgComposerLabel” runat=”server”Text=’<%# Eval(”msgComposer”) %>’ />  <br />msgContent: <asp:Label ID=”msgContentLabel” runat=”server”Text=’<%# Eval(”msgContent”) %>’ />  <br />msgStatus: <asp:Label ID=”msgStatusLabel” runat=”server” Text=’<%# Eval(”msgStatus”) %>’ /><br />  <br />

</ItemTemplate>
HTML çıktısına bakarsak;
Kod:
    <tr>  <td>  msgId: <span id=”dlMsg_ctl00_msgIdLabel”>15</span>  <br />  msgComposer: <span id=”dlMsg_ctl00_msgComposerLabel”> Onur  </span>  <br />  msgContent: <span id=”dlMsg_ctl00_msgContentLabel”> Mesaj</span>  <br />  msgStatus: <span id=”dlMsg_ctl00_msgStatusLabel”>True</span>  <br />  <br />  </td>  </tr>

 
şekildeki gibi olduğunu görürüz.
Şimdi yaptığımız analizler sonucu edindiğimiz bilgileri hatırlayacak olursak; uygulamamız insert işlemi esnasında verileri herhangi bir kontrolden geçirmeyerek veritabanına kaydediyor ve eş zamanlı olarak bu mesajı diğer bir sayfadan okuyabiliyoruz. Mesajı okuduğumuz sayfanın kodlarında da görüldüğü üzere, mesaj direk olarak veritabanından Eval metodu ile bağlanmış olarak ekrana basılmaktadır.
Sistem işleyişi ile alakalı tüm bu edindiğimiz bilgilerin özeti kısaca şudur: “Biz ne yazarsak yazalım, browser aynen bunu yorumlayacaktır”. İşte burada sistemin zayıf noktası açığa çıkmaktadır. Şimdi bu zayıflığı sömürmeye başlayalım.
Saldırı Başlıyor

Hareket noktamız; ‘Biz ne yazarsak yazalım hiçbir değişikliğe uğramadan yorumlanacak ve çalışacaktır’. Demek ki biz mesaj kısmına ya da mesajı yazan kişinin belirtildiği alana HTML kodları yazarsak sistem bunu kaydedecek ve çalıştıracaktır. Hemen deneyelim ve ekran görüntüsü ile kaynak kodlara bakalım;
Kod:
    <tr>  <td style=”background-color:#CCCCCC;”>  msgId: <span id=”dlMsg_ctl01_msgIdLabel”>16</span>  <br />  msgComposer: <span id=”dlMsg_ctl01_msgComposerLabel”><h1>OWASP</h1></span>  <br />  msgContent: <span id=”dlMsg_ctl01_msgContentLabel”><img src=”http://hedefsite.com/ali.gif” />  </span>  <br />  msgStatus: <span id=”dlMsg_ctl01_msgStatusLabel”>True</span>  <br />  <br />  </td>

    </tr>

 
Composer alanına ‘<h1>OWASP</h1>‘, content alanına ‘<img src=”http://hedefsite.com/ali.gif” />‘ yazıp insert işlemini gerçekleştirdikten sonra görüldüğü gibi yazdığımız HTML etiketlerinin yorumlandığını ve sayfanın browser tarafından ona göre render edildiğini görüyoruz. Kısacası sisteme HTML kodlarını enjekte ettik ve çalıştırdık Peki sorun nereden kaynaklanıyor ?
Hatalı Kodlama

Uygulamanın böyle bir saldırıya karşı zayıf olmasının nedenleri olarak;

* Kullanıcıdan alınan verilerin kontrol edilmemesi [2,3],
* İçeriklerin onay işlemine girmeden doğrudan yayınlanması,
* Veritabanından çağrılıp sayfaya bastırılan verilen kontrol edilmemesi olarak gösterilebilir.

Çözümler

* Kullanıcıdan alınan verileri kontrol etmek için düzenli ifadeler, if-else yapıları veya ASP.NET teknolojisinin sunduğu ‘ValidateRequest’ metodu kullanılabilir. ValidateRequest, varsayılan olarak ‘true’ durumda gelmektedir
Kod:
<%@ Page Language=”C#” AutoEventWireup=”true” CodeFile=”Guestbook-Write-Secure.aspx.cs” Inherits=”Guestbook_Write_Secure” ValidateRequest=”true” %>
* Eklenen içeriklerin onay işleminden sonra yayınlanması, tehlikeyi büyük ölçüde engellemeye yardımcı olacaktır.
* Veritabanından getirilen verilerin encoding işlemine tabi tutularak kod olarak değil de metin olarak yorumlanmasını sağlarak, enjeksiyon işlemi gerçekleşse bile enjekte edilen kodların çalışmasını engelleyebilirsiniz [5]. AntiXSS kütüphanesi Microsoft tarafından bu gibi encoding (kodlama) işlemleri için güvenlikle kullanılabilir [13].

Hatalı Kod: Text=’<%# Eval(”msgContent”) %>’
Güvenli Kod: Text=’<%# Server.HtmlEncode(Eval(”msgContent”).ToString()) %>’
Sonuç

HTML Injection tekniğini, ASP.NET teknolojisi ile geliştirdiğimiz basit bir ziyaretçi defteri uygulaması üzerinden inceledik. Yapacağınız çözümler ASP.NET için yeterli olmakla beraber; proje dosyasına [12] ve diğer dil / platformlar için konuyla ilgili makalelere referanslar bölümünden ulaşabilirsiniz . Bir sonraki yazımız JavaScript Injection üzerine olacaktır.


Teknik Destek : cixturk@amasyateknoloji.tk
[Resimleri görebilmek için üye olun veya giriş yapın.]
[Resimleri görebilmek için üye olun veya giriş yapın.]
[Resimleri görebilmek için üye olun veya giriş yapın.]
Kullanıcı profilini gör http://www.hacktebugun.com

Önceki başlık Sonraki başlık Sayfa başına dön  Mesaj [1 sayfadaki 1 sayfası]

Bu forumun müsaadesi var:
Bu forumdaki mesajlara cevap veremezsiniz