SQL Injection, web uygulamalarında yaygın olarak karşılaşılan ve ciddi güvenlik açıklarına yol açabilen saldırı türüdür. Bu saldırı, kötü niyetli kişilerin, uygulamanın veri tabanına doğrudan erişim sağlamak amacıyla, SQL sorgularına zararlı kod enjekte etmeleri ile gerçekleşir. SQL Injection saldırıları, kullanıcı bilgilerini çalmak, veri tabanında bulunan verileri değiştirmek veya silmek gibi pek çok zararlı etkinliğe sebep olabilir. Bu makalede, SQL Injection’ın ne olduğu, nasıl çalıştığı ve bu tür saldırılardan korunmak için alınabilecek önlemler detaylı şekilde ele alınacaktır.
SQL Nedir?
SQL, (Structured Query Language – Yapılandırılmış Sorgu Dili) anlamına gelir. SQL, veritabanları ile çalışmak için tasarlanmış bir programlama dilidir. SQL, veritabanlarından veri almak, veri eklemek, veri güncellemek, veri silmek, veritabanı tabloları oluşturmak, veritabanı tablolarını değiştirmek ve veritabanı tablolarını silmek gibi işlemleri yapmak için kullanılır.
SQL, birçok veritabanı sistemi tarafından desteklenen standart bir dildir. Örneğin, Oracle, MySQL, Microsoft SQL Server, PostgreSQL, SQLite ve MongoDB gibi popüler veritabanı sistemleri SQL’i kullanır. SQL’in farklı versiyonları vardır, ancak temel komutlar ve sözdizimi aynıdır.
SQL’in temel yapısı şöyledir:
- SQL komutları büyük veya küçük harfle yazılabilir. Ancak genellikle büyük harfle yazılır.
- SQL komutları noktalı virgül (;) ile sonlandırılır.
- SQL komutları birden fazla satıra bölünebilir.
- SQL komutları tek veya çift tırnak içinde yazılabilir. Ancak genellikle tek tırnak kullanılır.
- SQL komutları yorum satırları içerebilir. Yorum satırları — veya /* ve */ ile başlar ve biter.
SQL’in en önemli komutları şunlardır:
- SELECT: Veri tabanından belirli sütunlara sahip kayıtları seçmek için kullanılır.
- FROM: Veritabanından hangi tablonun veya tabloların seçileceğini belirtmek için kullanılır.
- WHERE: Veritabanından belirli koşullara uyan kayıtları filtrelemek için kullanılır.
- GROUP BY: Veritabanından seçilen kayıtları belirli sütunlara göre gruplamak için kullanılır.
- HAVING: Veritabanından seçilen kayıtları gruplama sonucuna göre filtrelemek için kullanılır.
- ORDER BY: Veritabanından seçilen kayıtları belirli sütunlara göre sıralamak için kullanılır.
- INSERT INTO: Veritabanına yeni bir kayıt eklemek için kullanılır.
- UPDATE: Veritabanında var olan bir kaydın değerlerini değiştirmek için kullanılır.
- DELETE: Veritabanından belirli koşullara uyan bir veya daha fazla kaydı silmek için kullanılır.
- CREATE TABLE: Veritabanında yeni bir tablo oluşturmak için kullanılır.
- ALTER TABLE: Veritabanında var olan bir tablonun yapısını değiştirmek için kullanılır.
- DROP TABLE: Veritabanından var olan bir tabloyu silmek için kullanılır.
SQL hakkında daha fazla bilgi edinmek istiyorsanız, bu blog yazısını okumaya devam edin. Bu blog yazısında, SQL’in temel özelliklerini ve örneklerini göstereceğim. Ayrıca, SQL’i öğrenmenize yardımcı olacak bazı kaynaklar da paylaşacağım. Haydi devam ediyoruz.
SQL Injection Nedir?
Bir SQL (Injection) enjeksiyonu, bir SQL veri tabanını kullanarak çevrimiçi bir uygulamadaki güvenlik açığından komutları geçen bir saldırıdır. SQL Injection, veri tabanına dayalı web uygulamalarına saldırmak için kullanılan bir tekniktir. Bu teknikte, saldırgan SQL dili özelliklerinden faydalanarak web uygulamasının girdi alanlarına zararlı SQL ifadeleri girer. Bu sayede, saldırgan veri tabanındaki verilere erişebilir, değiştirebilir veya silebilir.
SQL Injection, bilgisayar korsanları tarafından bir sisteme yetkisiz erişim sağlamak, verilerin yerleştirilmesini ve manipülasyonunu kolaylaştırmak veya güvenli veri tabanı bilgilerini görüntülemek için yaygın olarak kullanılır. Güvenli bilgi, kredi kartı numaralarını, şifreleri vb. içerir.
SQL Injection saldırıları, web uygulamalarının en yaygın ve tehlikeli güvenlik açıklarından biridir. Bir web uygulaması SQL Injection açığına sahipse, saldırgan veri tabanındaki hassas bilgilere ulaşabilir, web uygulamasının işleyişini bozabilir veya web sunucusunu ele geçirebilir.
SQL Injection Nasıl Yapılır?
Sql injection, web sitesinin veri tabanına zarar vermek veya yetkisiz erişim sağlamak için kötü amaçlı SQL komutlarını enjekte etmek anlamına gelir. Bu, yasa dışı ve zararlı eylemdir.
Saldırganlar bu saldırıları gerçekleştirmek için aşağıdaki yöntemleri kullanabilir:
1- Union based (Ters-köprü): Saldırganlar bu yöntemde, mevcut bir SQL sorgusunun sonunda UNION SQL komutunu ekleyerek, veri tabanındaki bilgilere erişebilir.
2- Boolean-based: Saldırganlar bu yöntemde, bir sorgunun sonucunu TRUE veya FALSE olarak döndüren kodlar kullanarak veri tabanındaki bilgilere erişebilir.
3- Error-based: Saldırganlar bu yöntemde, sorguda yanlış SQL kodunu kullanarak veri tabanından yanıt alır ve bilgiye erişebilir.
4- Tamamen otomatize: Saldırganlar bu yöntemde, çeşitli saldırı araçlarını kullanarak otomatik olarak saldırı gerçekleştirir. Bu araçlar, web sitesinin iç yapısını ve veri tabanı yapısını analiz eder ve otomatik olarak saldırılar gerçekleştirirler.
SQL Injection Örneği
SQL Injection tekniğinin temel bir örneği, web uygulamasının girişi ile gerçek bir ifade göndermektir. Örneğin, ‘veya’ 1 ‘=’ 1 ‘veya’ veya ‘a’ = ‘a’ olan bir kullanıcı adı ve şifre, bu ifadeler doğruysa kullanıcı erişimine izin verir.
SQL Injection, veri tabanına dayalı uygulamalara saldırmak için kullanılan bir atak tekniğidir; burada saldırgan SQL dili özelliklerinden faydalanarak standart uygulama ekranındaki ilgili alana yeni SQL ifadelerini ekler. (Örneğin saldırgan, veritabanı içeriğini kendisine aktarabilir). SQL Injection, uygulamaların yazılımları içindeki bir güvenlik açığından faydalanır, örneğin, uygulamanın kullanıcı giriş bilgileri beklediği kısma SQL ifadeleri gömülür, eğer gelen verinin içeriği uygulama içerisinde filtrelenmiyorsa veya hatalı şekilde filtreleniyorsa, uygulamanın, içine gömülmüş olan kodla beraber hiçbir hata vermeden çalıştığı görülür. SQL Injection, çoğunlukla web siteleri için kullanılan bir saldırı türü olarak bilinse de SQL veri tabanına dayalı tüm uygulamalarda gerçeklenebilir.
SQL injection saldırıları, saldırganların, sistemdeki kullanıcılardan birinin bilgileriyle giriş yapmasına, mevcut verilere müdahale etmesine, bazı işlemleri iptal etmesine veya değiştirmesine, veri tabanındaki tüm verileri ifşa etmesine, veri tabanındaki tüm verileri yok etmesine, veri tabanı sunucusunda sistem yöneticisi olmasına olanak sağlar.
SQL Injection Korunma Yolları
SQL enjeksiyonu, kötü niyetli kullanıcıların web uygulamalarına zarar vermek veya veritabanından yetkisiz veri almak için kullandığı yaygın bir saldırı türüdür. SQL enjeksiyon saldırılarını önlemek için aşağıdaki koruma yöntemlerini kullanabilirsiniz:
Parametreli sorgular kullanın
SQL sorgularınızda parametreleri kullanmak, girişleri sorguya doğrudan eklemek yerine parametre olarak iletmeyi sağlar. Bu, SQL enjeksiyon saldırılarını engellemeye yardımcı olur. Kullanılabilir olduğunda parametreli sorgular kullanın.
Örneğin, PHP PDO veya ASP.NET Entity Framework gibi ORM (Object-Relational Mapping) araçları kullanıyorsanız, parametreli sorguları otomatik olarak kullanır ve SQL enjeksiyon riskini azaltır.
Giriş doğrulaması yapın
Kullanıcı girişlerini doğrulamak, yanlış veya zararlı verilerin veritabanına gönderilmesini engeller. Giriş doğrulaması, kullanıcı girişlerini filtrelemek ve beklenmeyen karakterleri veya ifadeleri engellemek için yapılan bir işlemdir. Örneğin, sayısal bir değer bekleniyorsa, girişin bir sayı olup olmadığını kontrol edebilirsiniz.
Özel karakterleri kaçışlayın
Kullanıcı girişlerinde özel karakterleri etkisiz hale getirmek için kaçış karakterlerini (örneğin, tek tırnak) kullanın. Bu, özel karakterleri kullanarak yapılan SQL enjeksiyon saldırılarını engellemeye yardımcı olur. İşletim sistemine veya veritabanı sunucusuna gönderilen girişlerin doğru bir şekilde işlenmesini sağlamak için uygun kaçış fonksiyonlarını kullanın.
Least Privilege (En Az Ayrıcalık) prensibini uygulayın
Veritabanı kullanıcı hesaplarının sadece ihtiyaç duydukları minimum ayrıcalıklara sahip olmalarını sağlayın. Bu şekilde, potansiyel bir SQL enjeksiyon saldırısının etkileri sınırlı olacaktır. Örneğin, bir web uygulamasının veritabanına sadece okuma ve yazma yetkisi olan bir hesapla erişmesi gerekiyorsa, bu hesabı oluşturun ve uygulamanın bu hesapla çalışmasını sağlayın.
Güncel ve güvenli kodlama pratiklerini kullanın
Güvenli yazılım geliştirme standartlarına uyun ve güncel güvenlik açıklarını dikkate alın. Bu, SQL enjeksiyonu gibi saldırılara karşı korumayı artırabilir. Güvenlik açıklarını düzeltmek için düzenli olarak güncelleme ve yama sağlayan bir güncelleme politikası uygulayın.
Güvenlik testleri yapın
Web uygulamanızı düzenli olarak güvenlik açıkları için test edin. Bu, SQL enjeksiyonu gibi saldırıları tespit etmenizi ve düzeltmenizi sağlar. Sızma testleri veya güvenlik açığı taraması yapmak için üçüncü taraf araçları veya güvenlik uzmanlarından yardım alabilirsiniz.
Bu koruma yöntemlerini kullanarak SQL enjeksiyon saldırılarını önlemek ve web uygulamanızı güvende tutmak için önemli adımlar atabilirsiniz. Ancak, SQL enjeksiyonuna karşı tamamen imkansız olabileceğini unutmayın. Güvenlik önlemleri her zaman katmanlı ve kapsamlı olmalıdır.
SQL Injection Nasıl Tespit Edilir?
SQL injection, web uygulamalarına yönelik en yaygın ve tehlikeli saldırı türlerinden biridir. SQL injection, saldırganın veritabanı ile etkileşime giren web uygulamasına zararlı SQL komutları göndermesine izin veren bir güvenlik açığıdır. Bu şekilde, saldırgan veritabanındaki hassas verilere erişebilir, verileri değiştirebilir, silmeyebilir veya hatta sunucuyu ele geçirebilir.
SQL injection tespiti için temel yöntem, web uygulamasının kullanıcı girdilerini nasıl işlediğini ve veritabanına nasıl sorgular gönderdiğini analiz etmektir. Web uygulamasının kullanıcı girdilerini doğrulamadığı veya filtrelemediği durumlarda, saldırgan girdi alanlarına zararlı SQL komutları ekleyebilir. Örneğin, bir login formunda kullanıcı adı ve şifre alanlarına 'OR 1=1 --
gibi bir değer girilirse, bu değer veritabanına gönderilen SQL sorgusuna eklenecek ve her zaman doğru olacak bir koşul oluşturacaktır. Bu da saldırganın kimlik doğrulamasını atlamasına ve sisteme erişmesine olanak sağlayacaktır.
SQL injection tespiti için başka bir yöntem de, web uygulamasının hatalı veya beklenmedik davranışlarını gözlemlemektir. Örneğin, web uygulaması bir SQL hatası mesajı döndürüyorsa, bu web uygulamasının SQL sorgularını düzgün bir şekilde oluşturmadığını veya işlemediğini gösterebilir. Bu da saldırganın SQL injection yapabileceği bir zafiyet olduğunu anlamasına yardımcı olabilir. Ayrıca, web uygulamasının beklenenden farklı sonuçlar döndürmesi, sayfa içeriğinin değişmesi veya yönlendirilmesi gibi durumlar da SQL injection olasılığını artırabilir.
SQL injection tespiti için kullanılabilecek bazı araçlar da vardır. Bu araçlar, web uygulamalarını otomatik olarak tarayarak SQL injection zafiyetlerini bulmaya çalışır. Bazı popüler SQL injection tarama araçları şunlardır:
- sqlmap: Açık kaynaklı ve komut satırı tabanlı bir araçtır. Çeşitli veri tabanı sistemlerini destekler ve çok güçlü ve esnek bir araçtır.
- Acunetix: Ticari ve web tabanlı bir araçtır. Web uygulamalarının genel güvenlik durumunu değerlendirmek için kullanılabilir. SQL injection dışında başka zafiyetleri de tespit edebilir.
- Netsparker: Ticari ve web tabanlı bir araçtır. Web uygulamalarının güvenlik açıklarını bulmak ve düzeltmek için kullanılabilir. SQL injection dışında başka zafiyetleri de tespit edebilir.
SQL injection, web uygulamalarının güvenliğini tehdit eden ciddi bir sorundur. Bu nedenle, web uygulamalarını geliştirirken ve test ederken SQL injection zafiyetlerine karşı dikkatli olmak ve önlem almak gerekir. Web uygulamalarının kullanıcı girdilerini doğrulamak, filtrelemek, parametreli sorgular kullanmak, hata mesajlarını gizlemek ve veri tabanı izinlerini kısıtlamak gibi bazı önlemler SQL injection riskini azaltabilir.
Sonuç
2012’de yapılan bir araştırmada, bir web uygulamasının ayda ortalama 4 saldırı aldığı ve perakendecilerin diğer endüstrilerden iki kat fazla saldırı aldığı görülmüştür. SQL Injection saldırılarını önlemek için, web uygulamasının girdi alanlarını doğrulamak, parametreli sorgular kullanmak ve veri tabanı erişim yetkilerini sınırlandırmak gibi önlemler alınmalıdır. Ayrıca, web uygulamasının güvenlik güncellemelerini takip etmek ve güvenlik duvarı gibi araçlarla korumak da önemlidir.