Web Uygulama Güvenliği: Blind SQL Injection - mysql_real_escape_string

Selamlar Bu yazımızda temel SQL injection serimizi sonlandırıyoruz. Çünkü SQL injection saldırılarında SELECT deyimi kullanılan yerlerden MySQL veritabanı varsa nasıl istismar...

Selamlar

Bu yazımızda temel SQL injection serimizi sonlandırıyoruz.
Çünkü SQL injection saldırılarında SELECT deyimi kullanılan yerlerden MySQL veritabanı varsa nasıl istismar edeceğimizi öğrendik.

Ve bu sefer gerçek hayata daha yakın olacak. Çünkü kaynak kod analizi yapmadan tahmin ederek işlemler gerçekleştireceğiz.
Real-life SQL injection saldırılarında zaten elimizde statik kodlar olmayacağından bu örnekler daha anlamlı olacaktır.

Başlayalım.

Önce basitçe SQL sorguları ile sistemi istismar etmeyi deneyelim.

1.png1.png

Tek tırnak attık hata vermedi ama veri de gelmedi yani sayfanın statik kodlarında buluna SQL sorgusunda SQL yapısını bozmuş olabiliriz.

Basit birkaç SQL sorguları ile SQL injection saldırısını gerçekleştirelim.

2.png2.png

1' and 1=1# ----> Burada veri gelmedi demekki yapı hala bozuk. Ama and 1=1 her zaman true döndürür. ve ilk yapı yani 1' yapısı SQL sorgusunu hala bozuyor tırnağı kaldıralım belki girdiğimiz veri integer olarak sorguda kullanılıyordur.
1 and 1=1# ----> Veri geldi yani attığımız tek tırnak yapıyı bozuyormuş. Veri direkt olarak sorguya alınıyor. 2 Tek tırnak arasında değil yani.
1 and 1=2# -----> 1 sayısı 2 sayısına eşit olmadığından false döner ve and false olduğundan 2 taraftan 2'si de true olamayacağından veri dönmez.

İpucu: Neden "1' or 1=1#" yapısıyla başlamadık.
Veri ilk seferde gösteriliyorsa yani dönen veri ya da veri grubunun ilk değeri alınıyorsa or 1=1 true dönse bile önceki yapı true olup olmayacağını bilmediğimizden or yapısındaki true bizim için bir şey ifade etmeyecektir.
Kısaca MySQL içerisindeki or deyimi 2 tarafın birini karşıladığında veri döndürdüğü için sol taraftaki yapıyı anlamayız. Çünkü sağ taraftaki yapı true olacağından sol taraftaki yapının önemi kalmayacaktır.
Ama biz sol taraftaki yapıyı anlamaya çalışıyoruz çünkü ilerleyen aşamalar ona göre gerçekleşecek.
Eğer or yapsaydık ve gelen bütün veriler gösterilseydi or yapısıyla da SQL injection gerçekleştirebilirdik.
Ancak arkadaki kodları bilemeyeceğimizden tahmin yürütüyoruz.
Genellikle arkada gelen veri grubunun ilk değerini al gibisinden bir kod olacağından and denemek daha faydalıdır.

İpucu 2: Sonuna neden yorum işareti anlamına gelen hashtag işaretini koyduk.
Verdiğimiz veriden sonra başka SQL sorgu deyimleri varsa aynı SQL sorgusunda onlar bizim saldırımızı engelleyecek ya da zorlaştıracaktır.
Ama yorum satırına alarak VARSA BİLE görmezden gel manasına getiriyoruz sorgumuzu. Bu sayede SQL injection saldırımızdaki SQL sorgularını daha rahat kullanabiliriz.

Peki neden başka yorum satırı kullanmadık direkt olarak # işaretini kullandık.
Aslında bunu arkadaki MySQL sürümüne göre bilmeliyiz, hangi yorum işaretini kullanacağımıza.
Deneme yanılma yapmalıyız burada çünkü zaten 2 yorum işareti var biri hashtag diğeri 2 tire yanyana ve bir boşluktan oluşuyor.
"#" --> 1. Yorum karakteri
"-- " --> 2. Yorum karakteri

Belki içinde bulunduğumuz sorguda girdiğimiz veriden sonra başka bir SQL deyimi olmayabilir bu durumda hiç yorum kullanmazsakta SQL sorgu istismarını gerçekleştirebiliriz.
Bunu bilemeyiz anlamanın yolu deneme-yanılma yoludur.

Şunları deneyin bakalım hangisi veri getirecek?
1 and 1=1#
1 and 1=1-- -
1' and 1=1#
1' and 1=1-- -

Kaç veri getireceğine göre de anlayabiliriz.
1 or 1=1#
1' or 1=1#

Neyse fazla uzattım zaten önceki dersleri iyice okuyanlar dediklerimi rahatlıkla anlamışlardır.

Hemen order by ile içinde bulunduğumuz select deyimi kullanılan sorgudaki kullanılan kolon sayılarını tespit edelim.

3.png3.png

1 order by 1# --> Veri geldi
1 order by 5# --> Veri gelmedi demek ki 1'e eşit veya yüksek ama 5ten az sayıda kolon kullanılmakta.
1 order by 3# --> Veri gelmedi demek ki 1'e eşit veya yüksek ama 3ten az sayıda kolon kullanılmakta.
1 order by 2# --> Veri geldi demek ki 2'e eşit veya yüksek ama 3ten az sayıda kolon kullanılmakta. Ki bu değer sadece 2'dir yani 2 kolon kullanılmakta sorgumuzda.

Hemen kullanılan kolonları seçelim. Ve çıktısı sayfada gösteriliyorsa gösterilen kısımları tespit edelim.

4.png4.png

Bu sefer farklı olarak başına - değerini ekledim neden?
Çünkü eğer arkadaki sistemde yani back-end tarafındaki kodlarda eğer gelen verinin ilk değerini tek göster manasında kod varsa - ile hiçbir veri getirmez ve dolayısıyla direkt olarak sağdaki yapıdan gelen veriler görükecektir.
Yani ilk anlattığım and or mantığının sayfadaki çıktı yapısı gibi.
- koyarak -1 değerine ulaşıyoruz. Ve -1 bir id değeri olamayacağından oradan seçilen veriler gözükmez ve sağ taraftaki yani union select 1,2# dediğimi SQL sorgu parçacağı çalışacaktır ve ilk iki kolonun sayfada çıktısı varsa nerede kullanıldığı gözükecektir.
Bunu neden yapıyoruz? Eğer - koymazsak sayfada başka veriler daha gelebilir. Ama ilk önce o veri geliyor. Yani ilk gelen veriyi gösteriyorsa kodlarda böyle bir düzenleme varsa bizim eklediğimiz union select 1,2# SQL sorgu parçacağı işlev görür ancak çıktısını sayfada vermez.
Bizim asıl amacımız o çıktıyı almak yani kolonların sayfada nerede kullanıldıklarını tespit etmek ve onların içine kritik veriler yerleştirmek.

Galiba karışık anlattım biraz. Ama SQL sorgularını ve çalışma yapısını bilmeniz zaten konu gerekliliklerinden olduğunu ilk konumda söylemiştim.

Şimdi basitçe kritik verileri çekelim. Bir önceki SQL injection konusuyla birebir aynı zaten o yüzden fazla uzatmayacağım.

5.png5.png

Evet güzel bir yolculukla MySQL veritabanı yazılımı kullanılıyorken SELECT ile veri seçimi olup bu verinin sayfada bir çıktısı varsa nasıl istismar edebileceğimiz öğrenmiş olduk.

Teşekkürler. Sırada pratik olarak nasıl SQL injection yapabileceğimizi lablar üzerinden göstereceğim.
 
Selamlar

Bu yazımızda temel SQL injection serimizi sonlandırıyoruz.
Çünkü SQL injection saldırılarında SELECT deyimi kullanılan yerlerden MySQL veritabanı varsa nasıl istismar edeceğimizi öğrendik.

Ve bu sefer gerçek hayata daha yakın olacak. Çünkü kaynak kod analizi yapmadan tahmin ederek işlemler gerçekleştireceğiz.
Real-life SQL injection saldırılarında zaten elimizde statik kodlar olmayacağından bu örnekler daha anlamlı olacaktır.

Başlayalım.

Önce basitçe SQL sorguları ile sistemi istismar etmeyi deneyelim.

Ekli dosyayı görüntüle 140031.png

Tek tırnak attık hata vermedi ama veri de gelmedi yani sayfanın statik kodlarında buluna SQL sorgusunda SQL yapısını bozmuş olabiliriz.

Basit birkaç SQL sorguları ile SQL injection saldırısını gerçekleştirelim.

Ekli dosyayı görüntüle 140052.png

1' and 1=1# ----> Burada veri gelmedi demekki yapı hala bozuk. Ama and 1=1 her zaman true döndürür. ve ilk yapı yani 1' yapısı SQL sorgusunu hala bozuyor tırnağı kaldıralım belki girdiğimiz veri integer olarak sorguda kullanılıyordur.
1 and 1=1# ----> Veri geldi yani attığımız tek tırnak yapıyı bozuyormuş. Veri direkt olarak sorguya alınıyor. 2 Tek tırnak arasında değil yani.
1 and 1=2# -----> 1 sayısı 2 sayısına eşit olmadığından false döner ve and false olduğundan 2 taraftan 2'si de true olamayacağından veri dönmez.

İpucu: Neden "1' or 1=1#" yapısıyla başlamadık.
Veri ilk seferde gösteriliyorsa yani dönen veri ya da veri grubunun ilk değeri alınıyorsa or 1=1 true dönse bile önceki yapı true olup olmayacağını bilmediğimizden or yapısındaki true bizim için bir şey ifade etmeyecektir.
Kısaca MySQL içerisindeki or deyimi 2 tarafın birini karşıladığında veri döndürdüğü için sol taraftaki yapıyı anlamayız. Çünkü sağ taraftaki yapı true olacağından sol taraftaki yapının önemi kalmayacaktır.
Ama biz sol taraftaki yapıyı anlamaya çalışıyoruz çünkü ilerleyen aşamalar ona göre gerçekleşecek.
Eğer or yapsaydık ve gelen bütün veriler gösterilseydi or yapısıyla da SQL injection gerçekleştirebilirdik.
Ancak arkadaki kodları bilemeyeceğimizden tahmin yürütüyoruz.
Genellikle arkada gelen veri grubunun ilk değerini al gibisinden bir kod olacağından and denemek daha faydalıdır.

İpucu 2: Sonuna neden yorum işareti anlamına gelen hashtag işaretini koyduk.
Verdiğimiz veriden sonra başka SQL sorgu deyimleri varsa aynı SQL sorgusunda onlar bizim saldırımızı engelleyecek ya da zorlaştıracaktır.
Ama yorum satırına alarak VARSA BİLE görmezden gel manasına getiriyoruz sorgumuzu. Bu sayede SQL injection saldırımızdaki SQL sorgularını daha rahat kullanabiliriz.

Peki neden başka yorum satırı kullanmadık direkt olarak # işaretini kullandık.
Aslında bunu arkadaki MySQL sürümüne göre bilmeliyiz, hangi yorum işaretini kullanacağımıza.
Deneme yanılma yapmalıyız burada çünkü zaten 2 yorum işareti var biri hashtag diğeri 2 tire yanyana ve bir boşluktan oluşuyor.
"#" --> 1. Yorum karakteri
"-- " --> 2. Yorum karakteri

Belki içinde bulunduğumuz sorguda girdiğimiz veriden sonra başka bir SQL deyimi olmayabilir bu durumda hiç yorum kullanmazsakta SQL sorgu istismarını gerçekleştirebiliriz.
Bunu bilemeyiz anlamanın yolu deneme-yanılma yoludur.

Şunları deneyin bakalım hangisi veri getirecek?
1 and 1=1#
1 and 1=1-- -
1' and 1=1#
1' and 1=1-- -

Kaç veri getireceğine göre de anlayabiliriz.
1 or 1=1#
1' or 1=1#

Neyse fazla uzattım zaten önceki dersleri iyice okuyanlar dediklerimi rahatlıkla anlamışlardır.

Hemen order by ile içinde bulunduğumuz select deyimi kullanılan sorgudaki kullanılan kolon sayılarını tespit edelim.

Ekli dosyayı görüntüle 140073.png

1 order by 1# --> Veri geldi
1 order by 5# --> Veri gelmedi demek ki 1'e eşit veya yüksek ama 5ten az sayıda kolon kullanılmakta.
1 order by 3# --> Veri gelmedi demek ki 1'e eşit veya yüksek ama 3ten az sayıda kolon kullanılmakta.
1 order by 2# --> Veri geldi demek ki 2'e eşit veya yüksek ama 3ten az sayıda kolon kullanılmakta. Ki bu değer sadece 2'dir yani 2 kolon kullanılmakta sorgumuzda.

Hemen kullanılan kolonları seçelim. Ve çıktısı sayfada gösteriliyorsa gösterilen kısımları tespit edelim.

Ekli dosyayı görüntüle 140084.png

Bu sefer farklı olarak başına - değerini ekledim neden?
Çünkü eğer arkadaki sistemde yani back-end tarafındaki kodlarda eğer gelen verinin ilk değerini tek göster manasında kod varsa - ile hiçbir veri getirmez ve dolayısıyla direkt olarak sağdaki yapıdan gelen veriler görükecektir.
Yani ilk anlattığım and or mantığının sayfadaki çıktı yapısı gibi.
- koyarak -1 değerine ulaşıyoruz. Ve -1 bir id değeri olamayacağından oradan seçilen veriler gözükmez ve sağ taraftaki yani union select 1,2# dediğimi SQL sorgu parçacağı çalışacaktır ve ilk iki kolonun sayfada çıktısı varsa nerede kullanıldığı gözükecektir.
Bunu neden yapıyoruz? Eğer - koymazsak sayfada başka veriler daha gelebilir. Ama ilk önce o veri geliyor. Yani ilk gelen veriyi gösteriyorsa kodlarda böyle bir düzenleme varsa bizim eklediğimiz union select 1,2# SQL sorgu parçacağı işlev görür ancak çıktısını sayfada vermez.
Bizim asıl amacımız o çıktıyı almak yani kolonların sayfada nerede kullanıldıklarını tespit etmek ve onların içine kritik veriler yerleştirmek.

Galiba karışık anlattım biraz. Ama SQL sorgularını ve çalışma yapısını bilmeniz zaten konu gerekliliklerinden olduğunu ilk konumda söylemiştim.

Şimdi basitçe kritik verileri çekelim. Bir önceki SQL injection konusuyla birebir aynı zaten o yüzden fazla uzatmayacağım.

Ekli dosyayı görüntüle 140095.png

Evet güzel bir yolculukla MySQL veritabanı yazılımı kullanılıyorken SELECT ile veri seçimi olup bu verinin sayfada bir çıktısı varsa nasıl istismar edebileceğimiz öğrenmiş olduk.

Teşekkürler. Sırada pratik olarak nasıl SQL injection yapabileceğimizi lablar üzerinden göstereceğim.
Eline Sağlık
 
Selamlar

Bu yazımızda temel SQL injection serimizi sonlandırıyoruz.
Çünkü SQL injection saldırılarında SELECT deyimi kullanılan yerlerden MySQL veritabanı varsa nasıl istismar edeceğimizi öğrendik.

Ve bu sefer gerçek hayata daha yakın olacak. Çünkü kaynak kod analizi yapmadan tahmin ederek işlemler gerçekleştireceğiz.
Real-life SQL injection saldırılarında zaten elimizde statik kodlar olmayacağından bu örnekler daha anlamlı olacaktır.

Başlayalım.

Önce basitçe SQL sorguları ile sistemi istismar etmeyi deneyelim.

Ekli dosyayı görüntüle 140031.png

Tek tırnak attık hata vermedi ama veri de gelmedi yani sayfanın statik kodlarında buluna SQL sorgusunda SQL yapısını bozmuş olabiliriz.

Basit birkaç SQL sorguları ile SQL injection saldırısını gerçekleştirelim.

Ekli dosyayı görüntüle 140052.png

1' and 1=1# ----> Burada veri gelmedi demekki yapı hala bozuk. Ama and 1=1 her zaman true döndürür. ve ilk yapı yani 1' yapısı SQL sorgusunu hala bozuyor tırnağı kaldıralım belki girdiğimiz veri integer olarak sorguda kullanılıyordur.
1 and 1=1# ----> Veri geldi yani attığımız tek tırnak yapıyı bozuyormuş. Veri direkt olarak sorguya alınıyor. 2 Tek tırnak arasında değil yani.
1 and 1=2# -----> 1 sayısı 2 sayısına eşit olmadığından false döner ve and false olduğundan 2 taraftan 2'si de true olamayacağından veri dönmez.

İpucu: Neden "1' or 1=1#" yapısıyla başlamadık.
Veri ilk seferde gösteriliyorsa yani dönen veri ya da veri grubunun ilk değeri alınıyorsa or 1=1 true dönse bile önceki yapı true olup olmayacağını bilmediğimizden or yapısındaki true bizim için bir şey ifade etmeyecektir.
Kısaca MySQL içerisindeki or deyimi 2 tarafın birini karşıladığında veri döndürdüğü için sol taraftaki yapıyı anlamayız. Çünkü sağ taraftaki yapı true olacağından sol taraftaki yapının önemi kalmayacaktır.
Ama biz sol taraftaki yapıyı anlamaya çalışıyoruz çünkü ilerleyen aşamalar ona göre gerçekleşecek.
Eğer or yapsaydık ve gelen bütün veriler gösterilseydi or yapısıyla da SQL injection gerçekleştirebilirdik.
Ancak arkadaki kodları bilemeyeceğimizden tahmin yürütüyoruz.
Genellikle arkada gelen veri grubunun ilk değerini al gibisinden bir kod olacağından and denemek daha faydalıdır.

İpucu 2: Sonuna neden yorum işareti anlamına gelen hashtag işaretini koyduk.
Verdiğimiz veriden sonra başka SQL sorgu deyimleri varsa aynı SQL sorgusunda onlar bizim saldırımızı engelleyecek ya da zorlaştıracaktır.
Ama yorum satırına alarak VARSA BİLE görmezden gel manasına getiriyoruz sorgumuzu. Bu sayede SQL injection saldırımızdaki SQL sorgularını daha rahat kullanabiliriz.

Peki neden başka yorum satırı kullanmadık direkt olarak # işaretini kullandık.
Aslında bunu arkadaki MySQL sürümüne göre bilmeliyiz, hangi yorum işaretini kullanacağımıza.
Deneme yanılma yapmalıyız burada çünkü zaten 2 yorum işareti var biri hashtag diğeri 2 tire yanyana ve bir boşluktan oluşuyor.
"#" --> 1. Yorum karakteri
"-- " --> 2. Yorum karakteri

Belki içinde bulunduğumuz sorguda girdiğimiz veriden sonra başka bir SQL deyimi olmayabilir bu durumda hiç yorum kullanmazsakta SQL sorgu istismarını gerçekleştirebiliriz.
Bunu bilemeyiz anlamanın yolu deneme-yanılma yoludur.

Şunları deneyin bakalım hangisi veri getirecek?
1 and 1=1#
1 and 1=1-- -
1' and 1=1#
1' and 1=1-- -

Kaç veri getireceğine göre de anlayabiliriz.
1 or 1=1#
1' or 1=1#

Neyse fazla uzattım zaten önceki dersleri iyice okuyanlar dediklerimi rahatlıkla anlamışlardır.

Hemen order by ile içinde bulunduğumuz select deyimi kullanılan sorgudaki kullanılan kolon sayılarını tespit edelim.

Ekli dosyayı görüntüle 140073.png

1 order by 1# --> Veri geldi
1 order by 5# --> Veri gelmedi demek ki 1'e eşit veya yüksek ama 5ten az sayıda kolon kullanılmakta.
1 order by 3# --> Veri gelmedi demek ki 1'e eşit veya yüksek ama 3ten az sayıda kolon kullanılmakta.
1 order by 2# --> Veri geldi demek ki 2'e eşit veya yüksek ama 3ten az sayıda kolon kullanılmakta. Ki bu değer sadece 2'dir yani 2 kolon kullanılmakta sorgumuzda.

Hemen kullanılan kolonları seçelim. Ve çıktısı sayfada gösteriliyorsa gösterilen kısımları tespit edelim.

Ekli dosyayı görüntüle 140084.png

Bu sefer farklı olarak başına - değerini ekledim neden?
Çünkü eğer arkadaki sistemde yani back-end tarafındaki kodlarda eğer gelen verinin ilk değerini tek göster manasında kod varsa - ile hiçbir veri getirmez ve dolayısıyla direkt olarak sağdaki yapıdan gelen veriler görükecektir.
Yani ilk anlattığım and or mantığının sayfadaki çıktı yapısı gibi.
- koyarak -1 değerine ulaşıyoruz. Ve -1 bir id değeri olamayacağından oradan seçilen veriler gözükmez ve sağ taraftaki yani union select 1,2# dediğimi SQL sorgu parçacağı çalışacaktır ve ilk iki kolonun sayfada çıktısı varsa nerede kullanıldığı gözükecektir.
Bunu neden yapıyoruz? Eğer - koymazsak sayfada başka veriler daha gelebilir. Ama ilk önce o veri geliyor. Yani ilk gelen veriyi gösteriyorsa kodlarda böyle bir düzenleme varsa bizim eklediğimiz union select 1,2# SQL sorgu parçacağı işlev görür ancak çıktısını sayfada vermez.
Bizim asıl amacımız o çıktıyı almak yani kolonların sayfada nerede kullanıldıklarını tespit etmek ve onların içine kritik veriler yerleştirmek.

Galiba karışık anlattım biraz. Ama SQL sorgularını ve çalışma yapısını bilmeniz zaten konu gerekliliklerinden olduğunu ilk konumda söylemiştim.

Şimdi basitçe kritik verileri çekelim. Bir önceki SQL injection konusuyla birebir aynı zaten o yüzden fazla uzatmayacağım.

Ekli dosyayı görüntüle 140095.png

Evet güzel bir yolculukla MySQL veritabanı yazılımı kullanılıyorken SELECT ile veri seçimi olup bu verinin sayfada bir çıktısı varsa nasıl istismar edebileceğimiz öğrenmiş olduk.

Teşekkürler. Sırada pratik olarak nasıl SQL injection yapabileceğimizi lablar üzerinden göstereceğim.
Eline sağlık
 
131,868Konular
3,272,138Mesajlar
316,432Kullanıcılar
spazioSon Üye
Üst Alt