SQL ve UNION SQL INJECTION

Mr.Storm~

Yeni üye
20 Ara 2020
2
0
-------------------Neden web Uygulamalarına Yönelik Saldırılar Yapılıyor?-------------

Web uygulamaları kurumların dış dünyaya bakan yüzü olduğu için saldırılar genelde web sitesi üzerinden gelir.

Saldırgan kurumunuzun içinde değil dünyanın öteki ucunda dahi olsa kurumunuzun sistemlerine girmek için web uygulamalarınızı giriş kapısı olarak kullanabiliyor.

Web uygulamaları dinamikleştikçe yani php, javascript gibi programlarla desteklenmesiyle ve saldırganların atak yapacağı alanlar genişledikçe buraya olan saldırılarda artmaya başladı.

Son olarak web uygulamalarına yönelik pentestler yani güvenlik testleri yapılmıyor göz ardı ediliyor genelde yada sadece yaptırıldı denilsin diye yapılıyor.

-----------------------------------------------------------------SQL NEDİR?------------------------------------------------------


Sql’in açılımı ‘Structured Query Language’dir. Yani Türkçe olarak çevirirsek ‘Yapılandırılmış Sorgulama Dili’dir.
SQL’in ana amacı sınırsız sayıdaki veri arasından dilediğiniz veriyi bulmak, sınırsız sayıdaki veri arasından istediğiniz her sorguyu yapabilmek, veri tabanına yeni veriler kaydetmek, veri tabanında var olan verileri çekmek, güncellemek, düzenlemek ve silmek, veri tabanı içinde yeni bir tablo oluşturmak, yeni veri tabanı eklemek ya da mevcut veri tabanını değiştirmek gibi işlemleri yapmaktır.




----------------------------------------------------Veritabanı nedir?---------------------------------------------------

Veri tabanı, her zaman erişim imkânı olan, yönetilebilir, güncellenebilir, taşınabilir, birbirleri arasında tanımlı ilişkiler bulunabilen bilgiler kümesidir. Bilgisayar sisteminizde arkadaş ya da müşterilerinizin ad ve adreslerini toplayabilirsiniz.
Ve bunun gibi birçok veriyi bir araya getirip işleyebilirsiniz.
Özellikle şirketler için müşterilerin kişisel bilgileri, adresleri ya da fatura gibi bilgilerini saklamak için veri tabanından destek alınır. Sadece müşteri konusunda değil çalışanların da bilgileri de bu sistem içerisinde saklanır. Sadece bir kişi için belirli bilgileri kayıt altına almak kolaydır.
Ancak sayı milyonlara ulaştığı zaman işlemler büyük bir oranda aksamaya başlar. İşte veri tabanı bütün bu verileri düzenli bir halde saklanmasını sağlar.

------------------------------------------------------------Tablo Nedir?---------------------------------------------------------
Veri tabanında bilgilerin saklandığı alt birimlere tablo denir. Veri tabanları tablolardan oluşmaktadır.
Bir veri tabanında aynı isimde iki tablo bulunamaz. Bu fotoğrafta gördüğünüz cocuk,personel,birim vs tablo isimleridir.

-----------------------------------------------------------------Kolon nedir?----------------------------------------------------
Tablolar da kolonlardan oluşur. Kolonlar, her birinde aynı türden veri saklayan birimlerdir. Örneğin çalışan bilgilerini saklayan bir tabloda, bir kolon adını ve diğer bir kolon da soyadını tutar. Yani her bir özelleşmiş bilgi, bir kolonda saklanır.

SELECT?
En sık kullanılan SQL komutu SELECT ifadesidir. SQL SELECT ifadesi, veri tabanındaki bir tablodan veriyi sorgulamak veya almak için kullanılır.

WHERE

SQL komutlarına belirli koşullar uygulamak ve filtrelemek için kullanılır.

ORDER BY
Sıralama işlemi yapmaya yarar.
Normal şartlarda SELECT ile sorguladığımız veriler tabloya kayededilme sırasına göre elde edilir. Fakat bu normal akışı ORDER BY deyimi aracılığıyla değiştirebiliriz.

Order by SQL İnjection İçin kritik görev arz ediyor. Çünkü Biz ilerde göreceğimiz union sorgusunu çalıştırmak için öncelikle kaç kolon olduğunu tespit etmemiz gerekecek.
Yani burada sıralama yaparken örneğin 5 kolon varsa 1,2,3,4,5 diye sıralayabiliriz ama 6 dersek bize hata verir sql yani biz buradan anlıyoruz ki burada 5 kolon varmış

UNION
UNION operatörü, iki veya daha fazla SELECT ifadesinin sonuç kümesini birleştirmek için kullanılır.
Farklı tablolardaki seçeceğimiz alanları birleştirerek tek bir tabloymuş gibi gösterebiliriz.
Fakat UNION içindeki her SELECT ifadesi diğer sorgu ile aynı sayıda sütuna sahip olmalıdır ve Sütunların da benzer veri türlerine sahip olması gerekir..
Bu operatör bizim sql injection yaparken çok işimize yarayacak.

-----------------------------------------------------------Information schema--------------------------------------------
Bu database altındaki tablolar bize veri tabanındaki tüm tablolaları ve kolonları getirir.

--------------------------------------------------------------SQL Injection-------------------------------------------------------
Sql Injectıon zafiyetinin temeli kullanıcıdan alınan verilerin SQL sorguları içerisine herhangi bir güvenlik önlemi alınmadan gönderilmesinden dolayı oluşur.
SQL Injection, veri tabanından ve dilden bağımsız olarak her türlü uygulama-veri tabanı ilişkisine sahip sistemde bulunabilir ve bu veri tabanlarının yada programlama dilinin bir açığı değildir. Bunun sebebi web geliştircisinin yazdığı koddur.
SQL Injection’ dan korunmak, web geliştiricisinin görevidir.
Web geliştirici siteyi tasarlarkan kullanıcıdan alınan değerleri elekten geçirerek sql serverına göndermelidir. Hiç bir şekilde önlem almazsa saldırgan kendi sorgularını sql sistemi üzerinde gerçekleştirebilir.
Kısaca bir saldırganın bir uygulamanın veri tabanına yaptığı sorgulara müdahale etmesini sağlayan bir web güvenlik açığıdır diyebiliriz. Günümüzde geliştirilen bir web uygulaması %99 bir veritabanına bağlanıyor.
Ürün arama gerçekleştiren bir site buna örnek olabilir. Mesela son kullanıcı olarak bizim arama butonunu yazmamız gereken bulmak istediğimiz üründür. Örneğin ayakkabı sitesi olsun ve biz bot arayalım.
SQL sorgusu şöyle olacak select * from urunler where uruntıpı='bot'
Burada son kullanıcıdan veri tabanına gönderilen bilgilerde bir önlem almazsak saldırgan, diğer kullanıcılara ait verileri veya uygulamanın kendisinin erişebileceği diğer verileri çekebilir.
Yani normalde sistemde sadece yetkili kişilerin girebileceği yerlere girebilir. Çoğu durumda, bir saldırgan bu verileri değiştirebilir, silerek uygulamanın içeriğinde veya davranışında kalıcı değişikliklere neden olabilir.


-------------------------------BAŞARILI BİR SQL İNJECTION SALDIRISININ SONUÇLARI NE OLUR?-----------------
Başarılı bir SQL Injection saldırısı, şifreler, kredi kartı bilgileri veya kişisel kullanıcı bilgileri gibi hassas verilere yetkisiz erişime neden olabilir. Bazı durumlarda, saldırgan bir kuruluşun sistemlerinde kalıcı bir BACKDOOR bırakabilir ve orada uzun süre fark edilmeyerek uzun vadeli bir sömürmeye yol açabilir.


-----------------------------------------------SQL İNJECTİON AÇIKLARI-------------------------------------------------------

-----------------------------------------------------------UNION SQL INJECTION----------------------------------
www.xyz.com
Bir tane web sitemiz olsun.

========================

burası ise tetiklenen backhand


Kod:
id = request.get('id')
query = SELECT * FROM haberler WHERE id = id
result = db.execute(query)

if result.size >0:
	for i in result:
		print(i.title)
else:
	print("haber yok")

Burada yazdığımız python kodu kullanıcıdan alınan idyi db ye soruyor eğer varsa haber başlığını yazıyor yoksa haber yok yazıyor.
Bunu saldırgan göremeyecek ama daha anlaşılır olması için bunu da buraya yazıyorum.

idsi bir olan haberi getirsin
www.xyz.com/?id=1
haber başlığı AKINCI UÇUŞA HAZIR olsun

burda çalışan sorgu şöyle olur

SELECT * FROM haberler WHERE id = 1

www.xyz.com/?id=2 yazdığımızda haber başlığı aselsan olanı getirdi.

şimdi biz www.xyz.com/?id=2-1 yazdığımızda yeniden akıncıyı getirecek. Bu ne demek sen databasede matematiksel işlem yaptırabiliyorsun demek.
Yani eski referans noktamıza geri döndük
Peki o ne demek sen burada kendi sorgularını çalıştırabilirsin demek.
Burada şimdi biz zafiyeti tespit ettik. Bir sonraki aşama en zor olan kısım bunu sömürmek olacak. Biz burada developerın yazdığı kodu değiştiremediğimiz için onun kodundan sonra kendi kodlarımızı çalıştırmayı deneyeceğiz.
Veri tabanında peş peşe select sorgusu çalıştırmak için union komutu vardı. union dedikten sonra kendimiz sorgumuzu yazabiliriz.
Ama kolon sayıları iki tabloda da eşit olması gerekiyor.
Yani burada developerın çağırdığı haberler tablosunu çağırmak zorunda değiliz. İstediğimiz tabloyu çağırabiliriz.
Ama sorun burda başlıyor hangi kolonu çağırmalıyız
Bu siteyi tasarlayan adam kolon adına ne yazmış burada onu tespit etmek zorundayız. Bunun için UNION komutunu kullanacağız ama union komutunu kullanmak için sağdaki ve soldaki sorgunun kolon sayıları eşit olmalı ama biz kolon sayılarını bilmiyoruz o yüzden tek tek deneyeceğiz hata almayana kadar.
Bunun için de UNION SELECT 1,2,3,4……. Diye rakamlarımızı arttırarak gideceğiz ta ki hata almayana kadar, belli bir sayıya ulaşınca yani web geliştiricinin kullandığı kolon sayısına eşit sayıyı girdiğimiz de hata almayacağız ve web sitesinde artık kendi union sorgumuzu göreceğiz. Gördüğümüz kendi sorgumuz da rakamları da göreceğiz burada mesela gördüğümüz rakamlar 5, 7,9 ve 11 olsun. Bunun anlamı demek ki bu siteyi tasarlayan kişi 5. 7. 9. Ve 11. kolondan (örneğin kullanıcı ürünler fiyat ve resim gibi) buraya veri çekmiş aslında burada belirtilenden daha fazla kolon var ama bu sayfada o kolonları kullanmamış. Yani biz 1 yazdığımız yere de veri çekebiliriz ama göremedikten sonra bu veri bir işe yaramaz. Hatırlarsanız bizim çektiğimiz union sorgusu sayfada gözükmüştü ama bu web sayfasında normal gözükmesi gerekenler gözüktükten sonra yani en altta gözükecek. Sadece kendi sorgunuzun gözükmesini istiyorsanız id numarasını veri tabanında olamayacak kadar yüksek bir rakam girin. (-88888888 olabilir – bir değer kayıt edilmez.)
Biz burada sqlin helper fonksiyonlarını çalıştırabiliriz. Mesela database() yazdığımızda dbnin ismini öğrenmiş olduk db'yi sömürmeye başladık. Şimdi bizim burada işimize yarayan tabloları kullanmamız lazım yani kendi fromlarımızı çalıştıracağız ama ne yazacağız buraya from users mı password mü nerden bileceğiz bunu?
Şöyle bileceğiz her veri tabanı sisteminin, kendi bünyesindeki bütün tabloları ve kolonları tuttuğu ana tablolar olduğunu söylemiştik bunlar information_schema idi.
Sorgumuz şöyle olacak artık
www.xyz.com/?id=2 UNION SELECT 1,2,3,4,5,6,table_name,8,9,10,11 from information_schema.tables where table_schema=database()
Şimdi burada yapılan şey union sorgumuzda information schema tablodan table_scheması database 'e eşit olandan getir diyoruz ne getir diyoruz table_name biz buraya eğer database ismini biliyorsak yazabiliriz. Az önce görmüştük ismini onu buraya table_schema=’dbismi’ yazalım aynı sonucu alırız.
Bu web sitesindeki tablo isimlerini göreceğiz, bizim burada dikkatimizi çeken tablolar olacak illa ki onlara odaklanacağız. Şimdi gelelim bu tablonun kolonlarını çekmeye. Sorgumuz şuna dönecek
www.xyz.com/?id=2 UNION SELECT 1,2,3,4,5,6,column_name,8,9,10,11 from information_schema.columns where table_name='tabloadı'
Kolonları da gördük şimdi yapacağımız şey sorgumuzu çalıştırmak.
www.xyz.com/?id=99999 UNION%20SELECT1,2,3,4,5,6,username,8,9,10,1 from users
Eğer burada bize gösterilen sadece bir alan olsaydı mesela sadece 7 yi görebilseydik tek tek hepsini yazacak mıydık? Tabi ki hayır burada da SQL in concat fonksiyonu devreye giriyor bu birleştirme işine yarar. Oda şöyle oluyor;
1,concat('pass:',pass,'::UNAME::',uname),3,4,5,6... bu şekilde yazılabilir.

Anlattıklarımı test edebileceğiniz site: pictures

Yazının devamı gelecektir. ( Boolen based, time based sql injection)

REFERANSLAR;
https://portswigger.net/web-security/sql-injection
https://www.twitch.tv/mdisec
https://www.w3schools.com/sql/sql_injection.asp

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Öğrendiğimiz her bilgiyi dinimizin bize öğrettiği gibi iyilik üzerine kullanalım..

Sizden, hayra çağıran, iyiliği emreden ve kötülükten men eden bir topluluk bulunsun. İşte kurtuluşa erenler onlardır. (Âl-i İmrân, 3/104)

Biz de kötülükten alıkoymaya çalışanları kurtardık. Yoldan çıkmaları sebebiyle zulmedenleri şiddetli bir azapla yakaladık. (A'râf, 7/165)
 
Moderatör tarafında düzenlendi:
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.