MWN9LGx8LGF4NWZcMqR5NWVdLTcsynIkynwbzD1c

SQL Injection Eğitimleri

Tüm Detaylarıyla SQL Injection Eğitimleri Makale Oku.

Ak Blog SEO
4349759590016280108

SQL Injection Eğitimleri

4 Nisan 2021 Pazar

Tüm Detaylarıyla SQL Injection Eğitimleri

SQL Injection konusuna ilişkin eğitim dokümanı formatında sizlere bilgiler vermeye çalıştık.

SQL Injection Eğitimleri
SQL Injection
SQL Injection ile ilgili aşağıda okuyacağınız makalede, elimizden geldiğince tüm detayları vermeye çalıştık. Yararlı olması dileğiyle.

SQL Injection

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çekleşebilir.

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.

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.

Ne Zaman Ortaya Çıktı? Özetle Tarihçe

SQL Injection, 1998 yılı civarında tartışılmaya başlanmıştır.[Örneğin, 1998'de Phrak dergisinde yayımlanan bir makalede SQL Injection'dan söz edilmiştir. 

Form

Açık Web Uygulaması Güvenlik Projesi (AWUGP)'ne göre, SQL Injection (SQLI), 2007-2010 yılları arasında web uygulamalarında en fazla görülen 10 güvenlik açığından biri olduğu belirtilmiştir. 2013'te ise yine AWUGP kapsamında, SQLI'ın web uygulamalarına en fazla yapılan saldırı olduğu kabul edilmiştir

SQL Injection'ın dört ana alt sınıfı vardır:

  • Klasik SQLI
  • Blind or Inference SQL injection
  • Veri Tabanı Yönetim Sistemi- Özel SQL injection
  • Bileşik (Compounded) SQL injection:
    • SQL injection + yetersiz kimlik doğrulama 
    • SQL injection + DDoS saldırıları 
    • SQL injection + DNS Korsanlığı 
    • SQL injection + XSS

Storm Worm saldırısı, Compounded SQLI saldırılarına bir örnektir. Bu sınıflandırma, 2010'a kadar olan SQLI saldırıları için geçerlidir. Yeni gelişmeler için sınıflandırmalar yapım aşamasındadır.

Teknik uygulamaları

Çıkış (Escape) karakterlerinin yanlış filtrelenmesi

SQLI'ın bu türü, kullanıcıdan gelen veri escape karakterlerine göre filtrelenmediği zaman, uygulamaya kullanıcı girişinden yeni SQL ifadeleri eklenmesiyle oluşur. Eklenen SQL ifadeleri, son kullanıcının veri tabanını istediği şekilde manipüle etmesine neden olur.

Aşağıdaki kod satırı, bu güvenlik açığını göstermektedir:

sorgu = "SELECT * FROM kullanicilar WHERE isim =' " + kullaniciAdi + " ';"

Yukarıdaki SQL sorgusu girilen kullanıcı adı bilgisine ait tüm verileri, kullanıcı tablosundan çekecek şekilde tasarlanmıştır. Sistem kullanıcı adı bekliyorken, kullanıcı adı kısmına kötü niyetli bir kullanıcı tarafından sisteme zarar verecek sql ifadeleri yazılabilir. Örneğin, "kullaniciAdi" değişkenini aşağıdaki şekilde düzenleme yapılabilir.

' or '1'='1

Bu girdi Sql ifadesinin aşağıdaki şekilde işlenmesine neden olur:

sorgu = "SELECT * FROM kullanicilar WHERE isim =' " + kullaniciAdi ' or '1' = '1 + " ';"

Sorgunun geri kalanını engellemek için yorum satırı karakterleri kullanılır. (Aşağıda üç farklı SQl yorum satırı karakteri gösterilmiştir). Üç satırın sonunda da bir boşluk bulunmaktadır.

' or '1'='1' -- 
' or '1'='1' ({ 
' or '1'='1' /* 

Saldırgan bu SQL ifadelerini, uygulamaya kullanıcı girişi olarak girerse, uygulama tabanında çalışacak sorgu aşağıdaki şekilde olur.

SELECT * FROM kullanicilar WHERE kullaniciAdi ='' or '1' = '1 + " ';

"SELECT * FROM kullanicilar WHERE isim ='' or '1' = '1 + " ';"

"SELECT * FROM kullanicilar WHERE isim = '' OR '1'='1' -- ';

SELECT * FROM kullanicilar WHERE kullaniciAdi = '' OR '1'='1' -- ';

kullaniciAdi verisi ne olursa olsun '1'='1' koşulu sağlanacağı için ve aradaki işlemin OR olmasından dolayı sorgu sonucu her zaman olumlu olacaktır. Yorum satırı karakterlerinden sonra gelen tüm karakterler yorum niteliği kazanacaktır ve onların bir önemi kalmayacaktır.

Aşağıdaki SQL ifadesindeki "kullaniciAdi" na girilen değer, kişiler tablosunun silinmesine ve kişiBilgileri tablosundaki tüm verilerin ifşa edilmesine neden olur.

a';DROP TABLE kullanıcilar;SELECT*FROM kullanıciBilgileri WHERE 't'='t'

Bu girdi Sql ifadesinin aşağıdaki şekilde işlenmesine neden olur:

Not: kodlar tek bir sıra halinde. Aşağıda verilen kodları iki satır olarak düşünmeyin. Tek bir sıra olarak düşünün. "kullanicilar; SELECT * FROM" olan kısım bitiş olarak metin belgesine kayıt edebilirsiniz.

SELECT * FROM kullanicilar WHERE kullaniciAdi = 'a';DROP TABLE kullanicilar; 
SELECT * FROM kullaniciBilgileri WHERE 't' = 't';

Çoğu SQL sunucusu, bir çağrı ile birden fazla SQL ifadesinin yürütülmesine izin verirken, PHP'nin mysql_query () fonksiyonu gibi bazı SQL API'leri güvenlik nedenlerinden dolayı buna izin vermez. Bu durum, saldırganların farklı sorgular açmalarını engeller, ancak sorguları değiştirmelerine engel değildir.

Yanlış tip işleme (Incorrect type handling)

SQLI'ın bu türü, kullanıcı tarafından girilen alanın tür kontrolü düzgün yapılmadığında oluşur. Bir sql ifadesinde sayısal değer kullanıldığında, kullanıcının girdisinin de sayısal  değer olması gereklidir. Bu kontrol yapılmadığı zaman bir güvenlik açığı oluşur. 

Örneğin:

sorgu = " SELECT * FROM kullaniciBilgileri WHERE id =" + deger + "; "

Bu ifadede "id" alanına bir sayının gelmesi amaçlandığı açıktır. Ancak bir string gelmesi bekleniyorsa, son kullanıcı sql ifadesini istediği şekilde değiştirebilir. Örneğin değer yerine aşağıdaki ifade yazılırsa,

1;DROP TABLE kullanicilar

Sql ifadesi aşağıdaki şekilde olacak ve bu ifade sonucunda kullanicilar tablosu veri tabanından silinecektir.

SELECT * FROM kullaniciBilgileri WHERE id=1; DROP TABLE kullanicilar;

Blind SQL injection

Blind SQL injection, bir web uygulaması bir SQLI'na karşı açık olduğunda kullanılır, ancak sonuçları saldırgan tarafından görülemez. Güvenlik açığı bulunan sayfada veriler ifşa edilemez ama SQL ifadesinin içine gömülmüş olan mantıksal ifade nedeniyle değiştirilmiş veriler görüntülenebilir.

Koşullu yanıtlar (Conditional Responses)

Veritabanını, sıradan bir uygulamada, mantıksal bir ifadeyi değerlendirmeye zorlar. Örneğin bir kitap inceleme sitesinde, hangi kitabın görüntüleneceğini belirlemek için yandaki sorgu kullanılır. https://kitaplar.akblog.net/incelemeyiGoster.php?ID=5 URL'si sunucunun sorguyu çalıştırmasına neden olur.

SELECT * FROM kitapIncelemeleri WHERE id=Deger(ID);

Sorgu sunucuda tamamlanır. Kullanıcı veritabanının, tablonun veya alanların adlarını ve sorgu ifadesini bilmediği için bu kısımlara müdahale edemez. Sadece yukarıdaki URL'nin bir kitap incelemesi getirdiğini görür.

Saldırgan, https://kitaplar.akblog.net/incelemeyiGoster.php?ID=5 OR 1 = 1 ve https://kitaplar.akblog.net/incelemeyiGoster.php?ID=5 AND 1 = 2 URL'lerini yüklediği zaman aşağıdaki sorgulara neden olabilir.

SELECT * FROM kitapIncelemeleri WHERE id='5' OR '1'='1';
SELECT * FROM kitapIncelemeleri WHERE id='5' AND '1'='2';

Bu sorgular sonucunda "1 = 1" URL'si ile orijinal inceleme sayfası geliyorsa veya "1 = 2" URL'si ile boş sayfa veya hata sayfası gönderiyorsa, sorgu büyük olasılıkla her iki durumda başarıyla geçmiştir ve site SQL injection saldırılarına açıktır. 

Hacker, sunucuda çalışan MySQL sürüm numarasını ortaya çıkarmak için tasarlanmış bu sorgu dizesiyle devam edebilir:

http://kitaplar.akblog.net/incelemeyiGoster.php?ID=5AND substring(@@version, 1, INSTR(@@version, '.') - 1)=4. Bu sorgu sonrasında  MySQL 4 çalıştıran bir sunucuda kitap incelemesi gösterilecek diğer durumlarda boş sayfa veya hata sayfası gönderecektir. 

Hacker, başka bir saldırı yolu bulana kadar veya hedeflerine ulaşılıncaya kadar sunucudan daha fazla bilgi toplamak için sorgu dizeleri içinde kod kullanmaya devam edebilir.

İkincil SQL injection (Second order SQL injection)

İkincil SQL injection, kötü amaçlı kodlar içeren değerlerin gönderilir gönderilmez yürütülmeyip, bir süre tutulduğu zaman oluşur. Uygulama SQL ifadesini doğru şekilde encode edip, geçerli SQL ifadesi olarak depo edebilir. Sonrasında SQL injectiona karşı denetimsiz olan uygulamanın başka bir kısmında, depolanan SQL ifadesi çalıştırılır. Bu saldırıyı gerçeklemek için saldırganın, gönderilen değerlerin daha sonra nasıl kullanıldığına dair daha fazla bilgiye sahip olması gerekir. Otomatik web uygulaması güvenlik tarayıcıları, bu tür bir SQL injection'ları kolaylıkla algılayamaz. Dolayısıyla kötü niyetli yazılımların kodun hangi kısmında olduğu manuel olarak kontrol edilmelidir.

Saldırılara karşı önlemler

SQL injection, iyi bilinen bir saldırıdır ve basit önlemlerle kolayca önlenebilir. 2015'te Talktalk'daki bariz bir SQL injection saldırısı sonrasında BBC, böyle büyük bir şirketin sql injection açıklarının bulunmasının güvenlik uzmanlarını şaşırttığını belirtti.

Parametreleştirilmiş ifadeler

Çoğu uygulama geliştirme platformunda, parametre olarak kullanıcıdan gelen veri yerine parametrik ifadeler kullanılır.(placeholder veya bind variable olarak da isimlendirilirler.) Bir placeholder sadece verilen tipte veri saklar. Dolayısıyla SQL injection yalnızca ilginç (ve muhtemelen geçersiz) bir parametre değeri olarak ele alınır.

Çoğu durumda, SQL ifadesi belirlidir ve her parametre tablo olarak değil, bir skaler olarak saklanır. Kullanıcıdan gelen veri bu parametreye atanır.

Kod seviyesinde zorlamak (Enforcement at the coding level)

object-relational mapping kütüphanelerini kullanmak, SQL kod yazma gereksinimini ortadan kaldırır. Etkin olan ORM kitaplığı, object-oriented koddan parametrik SQL ifadeleri üretir.

Escaping

SQL'de özel anlamları olan karakterlerden kaçınmak gereklilir. SQL DBMS, hangi karakterlerin  özel bir anlam taşıdığını açıklar ve kapsamlı bir blacklist sunar. Örneğin her parametre içindeki tek tırnak işareti('), geçerli bir SQL string literal oluşturmak için iki tek tırnak ile değiştirilir.

(''mysqli_real_escape_string();

fonksiyonunu kullanarak parametrelerden kaçınmak yaygın bir yöntemdir.

$mysqli = new mysqli('hostname', 'db_username', 'db_password', 'db_name');
$query = sprintf("SELECT * FROM `Users` WHERE UserName='%s' AND Password='%s'", $mysqli->real_escape_string($username), $mysqli->real_escape_string($password)); $mysqli->query($query);

Bu fonksiyon şu karakterlerin başına backslash (\) ekler. \x00\n\r\'" \x1a. MySQL'e bir sorgu göndermeden önce veri güvenliğini sağlamak için kullanılır.

PHP'de birçok vertabanı türü için birçok fonksiyon var örneğin pg_escape_string() fonsiyonu PostgreSQL için. Slash eklemek için kullanılan addslashes (string $ str) fonksiyonu escaping karakterler için kullnılır. Veri tabanında sorgulanacak karakterlerin başına  backslash (\) eklenmiş bir string döndürür. Bu karakterler tek tırnak işareti ('), çift tırnak işareti ("), backslash (\) ve NUL (NULL bayt) şeklindedir.

İnput güvenliğini sağlamak için şeffaf bir katman oluşturmak hata eğilimini azaltabilir, ancak tamamen ortadan kaldırmaz.

Örüntü kontrolü

Integer, float, boolean, string parametreleri, değerlerinin belirtilen tür için geçerli olup olmadığı kontrol edilebilir. Stringlerin başka paternlara göre de kontrol edilmesi gerekebilir. (tarih, UUID, sadece alfanumerik, vb.)

Veri tabanı izinleri

Web uygulamaları tarafından verilen, veri tabanında oturum açma izinlerini kısıtlamak, web uygulamalarındaki açıkları kullanan bir SQL injection saldırılarının etkinliğini azaltmaya yardımcı olabilir.

Örneğin, Microsoft SQL Server'da bir veritabanı oturum açma işleminde bazı sistem tablolarına erişim kısıtlanabilir bu sayede veritabanındaki tüm text sütunlarına JavaScript eklemeyi deneyen kötü niyetli yazılımlar sınırlandırılmış olur.

deny select on sys.sysobjects to webdatabaselogon;
deny select on sys.objects to webdatabaselogon;
deny select on sys.tables to webdatabaselogon;
deny select on sys.views to webdatabaselogon;
deny select on sys.packages to webdatabaselogon;

Google - Siber Güvenlik - AK Eğitimler

---

akblog.net
Ak Blog SEO - Google SEO Eğitimleri Dokümanları
  1. SQL Injection konusuna ilişkin eğitim dokümanı formatında sizlere bilgiler vermeye çalıştık.

    YanıtlaSil
  2. SQL Injection Eğitim Konu Başlıkları
    1 Ne zaman ortaya çıktı?
    2 Form
    3 Teknik uygulamaları
    3.1 Çıkış (Escape) karakterlerinin yanlış filtrelenmesi
    3.2 Yanlış tip işleme (Incorrect type handling)
    3.3 Blind SQL injection
    3.3.1 Koşullu yanıtlar (Conditional Responses)
    3.4 İkincil SQL injection (Second order SQL injection)
    4 Saldırılara karşı önlemler
    4.1 Parametreleştirilmiş ifadeler
    4.1.1 Kod seviyesinde zorlamak (Enforcement at the coding level)
    4.2 Escaping
    4.3 Örüntü kontrolü
    4.4 Veri tabanı izinleri

    YanıtlaSil
  3. Murat Ata Ulus15 Nisan 2021 12:12

    Vay çok güzel açıklamalı renkli olması harikulade olmuş adminim

    YanıtlaSil
Konu hakkında sormak istediklerinizi yazabilirsiniz.
AK Blog SEO

Read. Think. Exercise (Oku. Düşün. Uygula.)

SEO | SEO | Hukuk | İngilizce Kursu |
Siz hayal edin. Biz Hayata geçirelim.
Akblog.NET
Whatsapp İletişim Formu×
Bilgileriniz
İstek Bilgileriniz
iletişime geç

Merhaba!

Webekle@gmail.com adresine e-posta gönderin veya aşağıdaki temsilcilerimizden biriyle WhatsApp ile iletişime geçin.

Yönetim Ekibi Yönetici ile iletişim geçin.
+905050251428
Destek Ekibi Eva ile iletişime geçin.
+905050251428
Doğrudan arayabilirsiniz +905050251428
Destek Saatleri 09:30 - 17:30
Merhaba! Nasıl Yardımcı Olabiliriz?
×
Nasıl Yardımcı olabilirim?