- Katılım
- 21 Nis 2021
- Konular
- 1,033
- Mesajlar
- 4,724
- Çözüm
- 15
- Online süresi
- 3mo 27d
- Reaksiyon Skoru
- 1,970
- Altın Konu
- 343
- TM Yaşı
- 5 Yıl 1 Ay 15 Gün
- Başarım Puanı
- 287
- Yaş
- 51
- MmoLira
- 3,408
- DevLira
- 12
ROHAN2 WORLD 1-120 TR TİPİ OFFICIAL YOHARA, BALATHOR VE AMON! 80. GÜNÜNDE! +10.000 ONLİNE! HİLE VE BOT %100 ENGELLİ HEMEN TIKLA!
SQL Enjeksiyon Nedir? SQL Enjeksiyon Nasıl Önlenir?..
SQL enjeksiyonları, kuruluşlardan hassas verileri almak amacıyla kullanılan en çok kullanılan web saldırı vektörlerinden biridir. Çalınan kredi kartları veya şifre listeleri hakkında bir şeyler duyduğunuzda, bunlar genellikle SQL enjeksiyon güvenlik açıkları aracılığıyla gerçekleşir. Neyse ki, web sitenizi SQL enjeksiyon saldırılarından korumanın yolları var.
SQL enjeksiyonu nedir?
SQL enjeksiyonu, saldırganların giriş alanlarına SQL sorgusu eklemek ve ardından temeldeki SQL veritabanı tarafından işlenmek üzere uyguladığı bir tekniktir. Bu zayıflıklar, giriş formları, kullanıcı tarafından oluşturulan SQL ifadelerinin doğrudan veritabanını sorgulamasına izin verdiğinde kötüye kullanılabilir.Size örnek bir senaryo vermek için, bir kullanıcı ve e-posta alanından ve bir şifre alanından oluşan tipik bir oturum açma formu alın. Giriş bilgileri gönderildikten sonra web sunucunuz üzerinde bir SQL sorgusu ile birleştirilir. PHP'de komut şu şekilde yazılır:
Kod:
<?php
$query = "SELECT * FROM users WHERE username = '" . $_POST['username'] . "'";
$query .= " AND password = '" . $_POST['password'] . "'";
?>
İlgili şifre ile geçerli bir kullanıcı adı verilip verilmediğini doğrulamak için sunucuya gönderilir. "1111" şifresine sahip bir "james" kullanıcı adı şu komutla sonuçlanır:
Kod:
SELECT * FROM users WHERE username='james' AND password='1111'
Ama "james';--" gibi bir şey koyarlarsa, sorgu şöyle görünür:
Kod:
SELECT * FROM users WHERE username='james'; -- ' VE şifre='1111'
Bu senaryoda, saldırgan SQL yorum sözdizimini kullanıyor. Çift tire (--) dizisinden sonra kalan kod çalışmayacaktır. Yani bir SQL şöyle olur:
Kod:
SELECT * FROM users WHERE username='james';
Daha sonra şifre alanına girilen kullanıcı verilerini döndürür. Bu hareket, giriş ekranının atlanmasına izin verebilir.
Saldırgan, aşağıdaki sorguyla sonuçlanacak olan "VEYA 1=1" başka bir Seçim koşulu ekleyerek daha da ileri gidebilir:
SELECT * FROM users WHERE username='james' VEYA 1=1;
Sorgu, "kullanıcılar" tablosu veritabanının tamamıyla olası oturum açma işlemleri için boş olmayan bir veri kümesi döndürür.
Yukarıdaki hack, size herhangi bir sitenin önemli bir güvenlik açığını gösterdi, ancak bu, yapabileceklerinin sadece küçük bir örneği. Daha gelişmiş saldırılar, bir saldırganın keyfi açıklamalar yapmasına izin vererek çok daha büyük hasara neden olur. Bu yol açabilir:
- Kredi kartları, pasaportlar, hastane kayıtları gibi özel verilerin çıkarılması
- Bu oturum açma bilgilerinin diğer web sitelerinde kullanılmasına izin veren kimlik doğrulama kullanıcı ayrıntılarının numaralandırılması
- Tüm web sitesi için bozuk bir veritabanı, işletim sistemi komutlarının yürütülmesi, silinen veya eklenen veriler ve yok edilen işlemler
- Tam sistem uzlaşması
SQL enjeksiyon önleme teknikleri
Kullanıcı giriş kanalları bu tür saldırılar için ana vektör olduğundan, en iyi yaklaşım, saldırı modellerini izlemek için kullanıcı girişini kontrol etmek ve incelemektir. Geliştiriciler ayrıca aşağıdaki ana önleme yöntemlerini uygulayarak güvenlik açıklarından kaçınabilir.Giriş doğrulama
Doğrulama süreci, bir kullanıcı tarafından gönderilen girdi türüne izin verilip verilmediğini doğrulamayı amaçlar. Giriş doğrulama, kabul edilen tür, uzunluk, biçim vb. olduğundan emin olur. Yalnızca doğrulamayı geçen değer işlenebilir. Giriş dizesine eklenen tüm komutları önlemeye yardımcı olur. Bir bakıma kapıyı açmadan önce kimin çaldığına bakmaya benzer.Doğrulama yalnızca kullanıcıların giriş yapmasına izin veren alanlara uygulanmamalı, yani aşağıdaki durumlara da eşit ölçüde dikkat etmelisiniz:
- Güçlü giriş doğrulaması sağlamak için yapılandırılmış veriler (ad, yaş, gelir, anket yanıtı, posta kodu gibi) için normal ifadeleri beyaz listeler olarak kullanın.
- Sabit bir değer kümesi olması durumunda (açılır liste, radyo düğmesi gibi), hangi değerin döndürüleceğini belirleyin. Giriş verileri, sunulan seçeneklerden biriyle tam olarak eşleşmelidir.
Kod:
switch ($tableName) {
case 'fooTable': return true;
case 'barTable': return true;
default: return new BadMessageException('unexpected value provided as table name');
}
$tableName değişkeni daha sonra doğrudan eklenebilir; artık bir tablo adı için yasal ve beklenen değerlerden biri olduğu yaygın olarak bilinmektedir.
Açılır liste durumunda, verileri doğrulamak çok kolaydır. Bir kullanıcının 1'den 5'e kadar bir derecelendirme seçmesini istediğinizi varsayarsak, PHP kodunu aşağıdaki gibi değiştirin:
Kod:
<?php
if(isset($_POST["selRating"]))
{
$number = $_POST["selRating"];
if((is_numeric($sayı)) && ($sayı > 0) && ($sayı < 6)
{
echo "Seçilen derecelendirme: " . $sayı;
}
Başka
echo "Derecelendirme 1 ile 5 arasında bir sayı olmalıdır!";
}
İki basit kontrol eklediniz:
- Bir sayı olmalıdır (is_numeric() işlevi).
- $sayısının 0'dan büyük ve 6'dan küçük olmasını istersiniz, bu da sizi 1-5 aralığında bırakır.
Parametrik sorgular
Parametreli sorgular, bir SQL ifadesini önceden derlemenin bir yoludur, böylece daha sonra ifadenin yürütülmesi için parametreleri sağlayabilirsiniz. Bu yöntem, veritabanının kodu tanımasını ve onu giriş verilerinden ayırt etmesini mümkün kılar.Kullanıcı girişi otomatik olarak alıntılanır ve sağlanan giriş amacın değişmesine neden olmaz, bu nedenle bu kodlama stili bir SQL enjeksiyon saldırısını azaltmaya yardımcı olur.
MySQLi uzantısıyla parametreli sorgular kullanmak mümkündür, ancak PHP 5.1 veritabanlarıyla çalışırken daha iyi bir yaklaşım sunar: PHP Veri Nesneleri (PDO). PDO, parametreli sorguların kullanımını basitleştiren yöntemleri benimser. Ek olarak, sadece MySQL'de değil, çeşitli veritabanlarında çalıştığı için kodun okunmasını daha kolay ve daha taşınabilir hale getirir.
Bu kod, SQL enjeksiyon güvenlik açığını önlemek için parametreli sorgularla PDO kullanır:
Kod:
<?php
$id = $_GET['id'];
$db_connection = new PDO('mysql:host=localhost;dbname=sql_injection_example', 'dbuser', 'dbpasswd');
// sorgu hazırlanıyor
$sql = "Kullanıcı adını SEÇ
kullanıcılardan
NEREDE id = :id";
$sorgu = $db_connection->prepare($sql);
$query->bindParam(':id', $id);
$sorgu->execute();
//sonucu alma
$query->setFetchMode(PDO::FETCH_ASSOC);
$sonuç = $sorgu->fetchColumn();
print(htmlentities($sonuç));
saklı prosedürler
Saklı yordamlar (SP), geliştiricinin bir yürütme planı oluşturmak için bir veya daha fazla SQL ifadesini mantıksal bir birime gruplandırmasını gerektirir. Sonraki yürütmeler, ifadelerin otomatik olarak parametreleştirilmesine izin verir. Basitçe söylemek gerekirse, daha sonra saklanabilen ve birçok kez kullanılabilen bir kod türüdür.Bu nedenle, sorguyu yürütmeniz gerektiğinde, tekrar tekrar yazmak yerine, saklı yordamı çağırabilirsiniz.
İşte MySQL sunucusunda saklı bir prosedür oluşturma süreci. Örneğin, şöyle bir tablonuz var:
Kod:
TABLO OLUŞTUR `maaş` (
"empid" int(11) NULL DEĞİL,
`sal` int(11) VARSAYILAN NULL,
BİRİNCİL ANAHTAR (`empid`)
) MOTOR=InnoDB DEFAULT CHARSET=utf8;
Bu tablodan şirket maaşına ilişkin toplu verileri alması gereken bir çalışan olduğunu varsayalım. İlk olarak, bir 'tr' kullanıcısı oluşturmanız gerekir:
Kod:
'mypass' TARAFINDAN TANIMLANAN 'tr'@'localhost' KULLANICI OLUŞTURUN;
Bu kullanıcının, tablonun bulunduğu şema için yalnızca bir EXECUTE ayrıcalığına ihtiyacı olacaktır:
Kod:
tr@`%` için hris.* tarihinde yürütme izni verin
SP şu şekilde oluşturulur:
Kod:
DELIMITER $$
PROSEDÜR OLUŞTUR `ortalama_sal`(ortalama_sal ondalık sayı dışarı)
BAŞLAMAK
maaştan avg(sal) öğesini avg_sal olarak seçin;
SON
Komutu verme işlemi avg_sal SP'yi oluşturur ve çağrılmaya hazır veritabanında saklanır.
Bir PHP uygulamasından bir SP'yi aramak için PDO'yu kullanabilirsiniz:
Kod:
$db_connection = new PDO('mysql:host=localhost;dbname=hris', 'tr', 'mypass');
$sorgu = $db_connection->exec('çağrı avg_sal(@out)');
$res = $query->query('select @out')->fetchAll();
print_r($res);
$res, kullanıcının isteğine göre ortalama maaşı gösterecektir. Daha sonra kullanıcı çıktı işlemini PHP ile gerçekleştirebilir.
SP artık kullanıcıyı (çalışan) ve kullanıcının doğrudan erişimi olmayan tabloyu (maaş) birbirine bağlayarak, onu veritabanı güvenliğinde önemli bir varlık haline getiriyor.
kaçmak
Her bir veritabanı yönetim sistemi (DBMS) tarafından sağlanan kullanıcı tarafından sağlanan giriş için her zaman karakterden kaçan işlevleri kullanın. Bu, DBMS'nin asla geliştirici tarafından sağlanan SQL ifadesiyle karıştırılmamasını sağlamak için yapılır.Örneğin, istenmeyen bir SQL komutuna yol açabilecek karakterlerden kaçınmak için PHP'de mysql_real_escape_string() işlevini kullanın. Oturum açma atlama senaryosu için değiştirilmiş bir sürüm aşağıdaki gibi görünür:
Kod:
$db_connection = mysqli_connect("localhost", "kullanıcı", "şifre", "db");
$kullanıcı adı = mysqli_real_escape_string($db_connection, $_POST['kullanıcı adı']);
$şifre = mysqli_real_escape_string($db_connection, $_POST['şifre']);
$query = "SELECT * FROM users WHERE kullanıcı adı = '" . $kullanıcı adı. "' VE şifre = '" . $şifre . "'";
Önceden, kodunuz tek tırnakların önüne bir kaçış karakteri (\) eklemeye açıktı. Ancak, bu küçük değişikliğin yapılması, gayri meşru bir kullanıcıya karşı koruma sağlayacak ve SQL enjeksiyonunu azaltacaktır.
Yönetici ayrıcalıklarından kaçınma
Kök erişimi olan bir hesap kullanarak uygulamanızı veritabanına bağlamayın. Saldırganlar tüm sisteme erişebileceğinden, bu yalnızca kesinlikle gerekliyse yapılmalıdır. Yönetimsel olmayan hesaplar sunucusu bile bir uygulama üzerinde risk oluşturabilir, hatta veritabanı sunucusu birden fazla uygulama ve veritabanı tarafından kullanılıyorsa daha da fazla risk oluşturabilir.Bu nedenle, uygulamayı SQL enjeksiyonuna karşı savunmak için veritabanında en az ayrıcalık uygulamak daha iyidir. Her uygulamanın kendi veritabanı kimlik bilgilerine sahip olduğundan ve bu kimlik bilgilerinin uygulamanın ihtiyaç duyduğu minimum haklara sahip olduğundan emin olun.
Hangi erişim haklarını elinizden almanız gerektiğini belirlemeye çalışmak yerine, uygulamanızın ihtiyaç duyduğu erişim haklarını veya yükseltilmiş izinleri belirlemeye odaklanın. Bir kullanıcının yalnızca bazı bölümlere erişmesi gerekiyorsa, bu işleve kesinlikle hizmet eden bir mod oluşturabilirsiniz.
Web uygulaması güvenlik duvarı
SQL enjeksiyon saldırılarını belirlemeye yönelik en iyi uygulamalardan biri, bir web uygulaması güvenlik duvarına (WAF) sahip olmaktır. Web sunucularının önünde çalışan bir WAF, web sunucularına giren ve çıkan trafiği izler ve tehdit oluşturan kalıpları belirler. Esasen, web uygulaması ile İnternet arasına konulan bir engeldir.Bir WAF, tanımlanmış özelleştirilebilir web güvenlik kuralları aracılığıyla çalışır. Bu politika grupları, WAF'a hangi zayıflıkları ve trafik davranışını araması gerektiğini bildirir. Dolayısıyla, bu bilgilere dayanarak, bir WAF, kötü niyetli trafiği bulmak ve engellemek için aldığı uygulamaları ve GET ve POST isteklerini izlemeye devam edecektir.
Bir WAF'nin değeri, kısmen ilke değişikliğinin uygulanabilme kolaylığından gelir. Kısa sürede yeni politikalar eklenebilir, bu da hızlı kural uygulamasına ve hızlı olay yanıtına olanak tanır.
WAF'ler, aşağıdakiler gibi bir dizi kötü amaçlı güvenlik saldırısına karşı etkin koruma sağlar:
- SQL enjeksiyonu
- Siteler arası komut dosyası çalıştırma (XSS)
- Oturum çalma
- Dağıtılmış hizmet reddi (DDoS) saldırıları
- çerez zehirlenmesi
- Parametre kurcalama
- Yalnızca güçlü varsayılan politikalarla değil, aynı zamanda özel WAF mimariniz için düzeltmelerle de değişen, bilinen ve bilinmeyen tehditlere karşı otomatik koruma
- Neler olduğunu anında görmenizi sağlayan gerçek zamanlı uygulama güvenliği izleme ve güçlü HTTP trafik günlüğü
SQL enjeksiyon koruması: sonuç
Giriş doğrulama, parametreli sorgular, saklı yordamlar ve kaçış gibi önleme teknikleri, değişen saldırı vektörleriyle iyi çalışır. Ancak, SQL enjeksiyon saldırılarının modelindeki büyük çeşitlilik nedeniyle, genellikle veritabanlarını koruyamazlar.
Bu nedenle, tüm temelleri kapsamak istiyorsanız, yukarıda belirtilen stratejileri güvenilir bir WAF ile birlikte uygulamalısınız. WAF'ın birincil yararı, aksi takdirde korumasız kalacak olan özel web uygulamaları için koruma sağlamasıdır.
WAF teknolojisi:
- Tehditleri bir web sunucusuna ulaşmadan durdurarak algılama ve yakalama oranını en üst düzeye çıkarır.
- Kara listeye alma yoluyla bilinen güvenlik açıkları için endüstri standartlarına ulaşılmasına yardımcı olur.
- Beyaz listeye alma yoluyla güvenlik açıklarını hemen düzeltir.
- Uygulamanın kendisini değiştirmek zorunda kalmadan kullanım kolaylığı ile koruma sağlar.
- PT AF, sanal altyapınızın performansına müdahale etmez.
- SQL enjeksiyonlarını, XSS, DDoS, sıfır gün saldırılarını (birkaç isim) azaltmak için yenilikçi çözümler sunuyoruz ve tehdit triyajı otomatik bir şekilde yapılır.
- Bulut, donanım veya sanal cihaz dahil olmak üzere birden çok dağıtım seçeneği vardır.
- WAF çözümümüz, PCI gereksinimlerini düşük maliyetli bir şekilde karşılamanıza da yardımcı olur.
Önde gelen bir güvenlik çözümleri sağlayıcısı olarak, sürekli iyileştirme, araştırma ve pratik sızma testlerine bağlıyız. Web sitenizi bugün PT BlackBox Tarayıcı ile test edin : basit, doğru ve ücretsiz.
- Katılım
- 10 May 2015
- Konular
- 183
- Mesajlar
- 1,057
- Çözüm
- 6
- Online süresi
- 7d 15h
- Reaksiyon Skoru
- 394
- Altın Konu
- 8
- TM Yaşı
- 11 Yıl 28 Gün
- Başarım Puanı
- 193
- Yaş
- 32
- MmoLira
- 933
- DevLira
- 0
Paylaşım için teşekkürler
- Katılım
- 7 Haz 2021
- Konular
- 96
- Mesajlar
- 715
- Online süresi
- 14d 19h
- Reaksiyon Skoru
- 427
- Altın Konu
- 0
- TM Yaşı
- 4 Yıl 12 Ay 3 Gün
- Başarım Puanı
- 149
- MmoLira
- 1,019
- DevLira
- 0
Paylaşım için teşekkürler 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 2
- Görüntüleme
- 32
- Cevaplar
- 0
- Görüntüleme
- 66
- Cevaplar
- 3
- Görüntüleme
- 74
- Cevaplar
- 3
- Görüntüleme
- 67





