» Forum Kuralları «
1-)
Büyük Harfle Yazı Yazmak Bağırmak Anlamına Gelmektedir..Bu Nedenle Sadece Cümle Baslarında KuLLanıLaBiLir..!
2-) Küfürler,Ahlaksız Sözler Kesinlile Yasaktır..! [Aksi Takdirde Banlanacaksınız..!
3-) Üyeleri Assalııcak Sözler Yasaktır...
4-) Yapılan Emek Kötü Dahi Olsa Önce Saygı Önce Teşekkür Sonra Eleştiri Lütfen Sağduyulu Olun..
2-) Küfürler,Ahlaksız Sözler Kesinlile Yasaktır..! [Aksi Takdirde Banlanacaksınız..!
3-) Üyeleri Assalııcak Sözler Yasaktır...
4-) Yapılan Emek Kötü Dahi Olsa Önce Saygı Önce Teşekkür Sonra Eleştiri Lütfen Sağduyulu Olun..
| Yazar | Mesaj #836 2008-10-27 01:13 GMT | ||||||||||||||||
|
![]() Öncelikle GET ve POST metodlarını görelim Bu metodlar web uygulamalarında sayfalar arası iletişim sağlamakta kullanılan metodlardır. HTML aracılığıyla formlar veya Querystringler ile başka sayfalara veri aktarırız. Bu verileri aktarım için iki seçeneğimiz mevcut. Bunlardan ilki GET metodu. Get metodunda veri ziyaretçiler tarafından görülebilir, basitçe müdahale edilebilir ve güvensizdir. Sayfa.asp?id=1 şeklindeki tanımlar GET metodunu simgeler. Iki şekilde farklı sayfalara GET ile veri gönderebiliriz. Bunlardan ilki linkler aracılığıyla yapılan iletişimlerdir. Örnek gerekirse; Bir forum düşünün. Forumun üye profili sayfası kendine GET metodu ile gelen id değişkenindeki sayıyı baz alarak, ilgili id numarasına sahip profili göstersin. O zaman bu sistemi kullanmak için gerekli link: profil.asp?id=5 şeklinde olacaktır. Bu linkte 5 id numaralı üyenin profil bilgileri listelenecektir Diğer bir yöntem ise formlar ile veri transferidir. Iki sayfamız olsun elimizde. Biri gonder.asp digeri ise al.asp Bu sayfalar arasında basit olarak GET ile veri transferi yapalım: Gonder.asp kodlarımız <html> <bOdy> <form name=&testForm& method=&get& action=&al.asp&> & Burada görüyorsunuzki get yöntemiyle al.asp dosyası hedef gösteriliyor <input type=&text& name=&isim&> & isim ismine sahip veri get ile gönderiliyor <input type=&submit& value=&Gonder&> </form> </bOdy> </html> Al.asp kodlarımız: <% Dim isim isim = Request.QueryString(&isim&) & Sayfamıza Get yöntemiyle isim isminde bir veri gelecegini tanımlıyoruz If isim <> && Then & Isim boş degilse yazdırıyoruz Response.Write(isim) End If %> Yukarıda gonder.asp yi çalıştırıp veri girip gönderdiğimizde girdiğimiz veri al.asp içersinde gösterilecektir. Adres satırında URL ise al.asp?isim=teststring Şeklinde olacaktır Burada SQL Injection olarak düşünürsek bu degişkene müdahale ederek işlem yapabiliriz. Burada basit bir ekrana yazdırma değilde veritabanı islemi yaptığımızı düşünelim. Degişkenimiz id olsun ve herhangi bir sayı degeri olsun. Al.asp bu sayıyı alarak SQL sorgusunda kullanacak ve işlem yapacaktır. Eğer kodlayan kişi bu gelen verinin elenmesi kontrolünü yapmadıysa GET metodunda adres satırına müdahale ederek SQL sorgusuna istediğimiz veriyi girebiliriz. Buna örnek vermiyorum. Piyasada zaten bilinen tüm SQL Injection yöntemleri GET ile yapılanlardır Post Metoduna geçersek: Bu metodda veri gizli olarak sayfalar arasında gönderilir. Yani gönderilen veri adres satırında görünmez ve mantığı bilmeyen birisi veriye müdahale edemez. Şimdi post metodu ile veri gönderim örneğini kodlayalım: Gonder.asp kodları <html> <head> <meta http-equiv=&Content-Type& content=&text/html; charset=iso-8859-9&> </head> <bOdy> <form name=&testForm& method=&post& action=&al.asp&> & Dikkat edin burada method=post kullanıldı <input type=&text& name=&isim&> <input type=&submit& value=&Gonder&> </form> </bOdy> </html> Al.asp kodları: <% Dim isim isim = Request.Form(&isim&) & Burada Request.Form kullandık. Yani veri post metodu dışında gelirse hiçbir şekilde işlem yapılmayacak If isim <> && Then Response.Write(isim) End If %> Burada gonder.asp çalıştırıp veri girerek gönderelim. Yine aynı şekilde al.asp içersinde gösterilecektir. Fakat bu sefer adres satırı /al.asp şeklinde olacaktır. Yani veriye dışarıdan müdahale edebileceğimiz herhangi bir alan yok. Peki şimdi dışarıdan GET yöntemiyle veri girmeye çalışalım bakalım sayfa veriyi yazdıracakmı. Adres satırına al.asp?isim=deneme yazalım. Burada isim al.asp sayfasındaki değişkendir. Bunu yazıp uyguladığınızda sonuç boş sayfa olacaktır. Yani sayfa Request.Form ile veriyi aldığı için ve veri GET metoduyla geldiği için işe yaramayacaktır. Peki bu sayfada SQL Injection uygulamamızın bir yolu yokmudur? Sorunun cevabı eğer programcı gerekli önlemi almadıysa evet vardır. Gerekli önlemden kastım ise: Request.ServerVariables(&HTTP_REFERER&) deyimidir. Bu deyim geçerli sayfaya hangi sayfadan gelindiğini döndürür. Eğer programcı bu deyimi al.asp sayfasında kullanarak yalnızca kendi hostundan veri geliyorsa işlem yapmayı seçtiyse buna dışarıdan SQL Injection uygulama ihtimalimiz yoktur. Ama durum böyle değil ise gonder.asp deki formun aynısını kendimiz tasarlayarak hedef sistemdeki al.asp ye istediğimiz veriyi yollayabiliriz. Bunun örneğini Bug Contest II deki örnekle yapalım Yarışmada dildegistir.asp sayfasına bir form veri gönderiyordu. Bu form 1 ve 2 değerlerini içeriyordu. Türkçe ve için 1 ingilizce için 2 değeri dildegistir.asp dosyasına gönderiliyor ve işlem yapılıyordu. Peki bu sayfada nasıl SQL Injection uygulanır? Hemen dildegistir.asp ye gönderilen dil değiştirme formunun kaynak kodunu inceleyelim sayfasında dil değiştirme formu mevcut. Formun kodları: <form action=&dildegistir.asp& method=&post&> <select name=&dil&> <option value=&2&>English</option> <option value=&1&>Türkçe</option></select> </select> </form> Kodu inceleyelim: <form action=&dildegistir.asp& method=&post&> Dildegistir.asp dosyasına POST metodu ile veri gönderiliyor. Yani GET ile bu veriyi yollayarak işlem yapmamız olanaksız <select name=&dil&> Giden verinin ismi dil <option value=&1&>Türkçe</option></select> <option value=&2&>English</option> Sayfaya giden dil verisinin değerleri 1 veya 2 olarak seçilebiliyor Bu bilgilerle sayfaya nasıl bir işlem uygulayabiliriz? Buradaki formun benzerini yani değerleriyle oynanmış halini kendimiz tasarlayarak dildegistir.asp dosyasına 1 ve 2 harici değer gönderebiliriz. Kendi tasarlayacağımız form şöyle olacaktır: <form action=&http://www.cwequ.com/yarismaxxx2/dildegistir.asp& method=&post&> & Burada deminki dildegistir.asp dosyasını hedef gösterdik <input name=&dil& type=&textarea& size=&125&> & Textboxa gireceğimiz değerin dildegistir.asp dosyasına dil isminde gitmesini söyledik <input type=&submit&> </form> Şimdi bu formu oluşturup textboxa girdiğimiz veri dildegistir.asp ye yollanacak ve normalde dildegistir.asp de kullanılması gereken 1 ve 2 verileri yerine kullanılacak. Yani SQL sorgusuna eklenen 1 ve 2 değerinin yerine kendi değerimizi SQL sorgusuna dahil ettireceğiz. Şimdi birde dildegistir.asp sayfasının kodlarını inceleyelim: <!&#include file=&baglanti.asp&&> <% id = Request.Form(&dil&) & Gördüğünüz gibi dil isimli verinin POST ile formdan geleceği tanımlanmış set rs = Server.CreateObject(&ADODB.Recordset&) rs.open &SELECT * FROM menuicerik WHERE DilID = &&id&&&,baglanti & Burada ise gelen veri DilID= kısmında SQL sorgusuna ekleniyor ve herhangi bir kontrolden geçmiyor. Bu demektirki sisteme SQL Injection uygulamamız için gerekli ikinci şart olan kontrolün olmamasıda tamamdır if not rs.eof then %> <td width=&426& rowspan=&4&><%=rs(&icerik&)%></td> </tr> <% else Response.Write &id yok& end if %> Equilibrium: <% if id = &1& then session(&giris&)=&turkce& Response.Redirect &giris.asp& end if if id = &2& then session(&giris&)=&ingilizce& Response.Redirect &giris.asp& end if %> Şimdi bunun denemesini yapalım: <form action=&http://www.cwequ.com/yarismaxxx2/dildegistir.asp& method=&post&> <input name=&dil& type=&textarea& size=&125&> <input type=&submit&> </form> Bu kodları .html uzantılı kaydedelim ve textboxa 1 union select 0 from tablo değerini girelim. Bu değerde yaptığımız: 1 harfinin koymamızın sebebi sistemde normalde tanımlı olan SELECT * FROM menuicerik WHERE DilID = sorgusunu tamamlamamız gerektiğidir. 1 değeri girince sorgumuz SELECT * FROM menuicerik WHERE DilID = 1 şeklinde tamamlanmış oluyor. union eklememizin sebebi ise tamamlanmış olan SQL sorgusuna kendi ekleyeceğimiz sorguyu birleştirmek istememizdir. union ifadesi iki SQL sorgusunu birleştirmek için kullanılır. select 0 from tablo sorgusu ile yapmak istediğimiz doğru tablo ismini tahmin etmektir. Eğer dbde tablo isminde bir tablo var ise bize Two columns& şeklinde bir hata verecek bu hatadan sonra sütun sayısını deneyerek bulmak kalacak. Şu anda göndermemiz gereken SQL sorgusu: 1 union select 0 from tablo Sistemin mantık olarak işleyişi böyledir. Bundan sonra devam etmiyorum. Zaten Bug Contest II sonuçlarında gerekli tüm kodlar duyuruldu. Bu dökümanda mantık olarak GET POST nedir? SQL Injection nasıl uygulanır sorusu üzerinde durduk Kodların bozulma ihtimaline karşı txt upload: Yazan : n0th!nq alıntıdır
__________________
|
||||||||||||||||
| Yazar | Mesaj #848 2008-10-27 02:23 GMT | ||||||||||||||||
|
eline sağlık kardeş
__________________
|
||||||||||||||||
| Yazar | Mesaj #858 2008-10-27 06:18 GMT | ||||||||||||||||
|
Saol
__________________
Prepare To Be yasak ed By The Long Dick Of The Law |
||||||||||||||||















