SQL Enjeksiyonu
SQL enjeksiyonu, veritabanı dili olarak SQL kullanan uygulamaları etkileyen ciddi bir güvenlik açığıdır. Arka uç SQL sorgusunu değiştiren zekice oluşturulmuş metin girişleri sayesinde tehdit aktörleri, uygulamayı özel verileri çıkarmaya veya istihbarat sağlayan şekillerde yanıt vermeye zorlayabilir. SQL enjeksiyon saldırıları, nihayetinde bilgi çalmak ve hatta bir sistemin tüm kontrolünü ele geçirmek için kullanılabilir.
SQL Enjeksiyon Türleri
SQL enjeksiyonları, bilgilerin nasıl alındığına bağlı olarak birden çok türe ayrılabilir: birleşim tabanlı, hata tabanlı, boolean tabanlı, zaman tabanlı ve bant dışı enjeksiyonlar.
SQL enjeksiyonlarının hafifletilmesinin bir yolu, giriş temizliğidir. Temizleme, tehlikeli karakterleri kullanıcı girişinden kaldırma işlemidir.
Tehlikeli karakterler şunları içerebilir:
Tehlikeli karakterler şunları içerebilir:
- ’
- ;
- \--
Bu, saldırganların bir veritabanından daha fazla bilgi elde etmek için SQL sorgularını genişletmesine izin verdiği için önemlidir.
Dikkatli olun, bu yöntem SQL enjeksiyonlarına karşı mükemmel bir savunma değildir. Karakterleri kaldırmanın bazı sorgularda bir etkisi olmayabilir ve bir saldırgan temizleme sürecini atlamanın bir yolunu bulursa, sisteminize kolayca veri ekleyebilir.
UNION İki ayrı sorgu almak SELECTve sonuçlarını birleştirmek için SQL anahtar sözcüğünü kullanır . Kullanıcı girişini göz önünde bulundurun:
Sorguya ekleniyor:
Sonuç:
Dikkatli olun, bu yöntem SQL enjeksiyonlarına karşı mükemmel bir savunma değildir. Karakterleri kaldırmanın bazı sorgularda bir etkisi olmayabilir ve bir saldırgan temizleme sürecini atlamanın bir yolunu bulursa, sisteminize kolayca veri ekleyebilir.
Kod:
SELECT username, email FROM users WHERE id = '1' AND '1' = '2';
UNION İki ayrı sorgu almak SELECTve sonuçlarını birleştirmek için SQL anahtar sözcüğünü kullanır . Kullanıcı girişini göz önünde bulundurun:
Kod:
soap' UNION SELECT username,password,NULL FROM user_table;-- -
Sorguya ekleniyor:
Kod:
query = "SELECT product_name, product_cost, product_description FROM product_table WHERE product_name = " + USER_INPUT + "'";
Sonuç:
Kod:
SELECT product_name, product_cost, product_description FROM[/B][/CENTER]
[B][CENTER]product_table WHERE product_name = 'soap' UNION SELECT username,password,NULL FROM user_table;-- -';
Ortaya çıkan bu sorgu, kullanıcıların tüm kullanıcı adlarını ve şifrelerini açığa çıkarır!
Hata Tabanlı Enjeksiyonlar (Error-Based Injections)
Saldırgan, uygulamayı hassas veriler içeren bir hata mesajı döndürmeye zorlamak için kötü amaçlı bir SQL sorgusu yazar. Aşağıdaki SQL sorgusunun iç ifadesi, profil kimliği 1 için parolayı alır, ancak döndürülmesi gereken değer türünde bir hata atar. Bu hata yanlışlıkla şifreyi ele veriyor!
Kod:
SELECT user_id FROM users WHERE username='asdf' UNION select 1, exp(~(select*from(SELECT Password FROM profiles WHERE ID=1)x)); -- -
Boolean-Based Injections
Saldırgan, TRUE veya FALSE ile sonuçlanan SQL sorguları gönderdikten sonra web yanıtlarındaki farkı not eder. Sonuca bağlı olarak, HTTP yanıtı değişir veya aynı kalır. Veritabanından hiçbir veri döndürülmese de, saldırgan veritabanı hakkında fikir edinebilir (tablo adlarını bulabilir) ve sonunda Union tabanlı bir enjeksiyon için kurulum yapabilir.
Kod:
SELECT username, email FROM users WHERE id = '1' AND '1' = '1';
Time-Based Injections
Bir uygulamanın yanıt süresinde görünür gecikmelere neden olmak için SLEEP ve gibi çeşitli yerleşik SQL işlevlerini kullanır . BENCHMARK Boole tabanlı enjeksiyonlar gibi, bu da bir saldırgan tarafından veritabanı hakkında bilgi çıkarmak için kullanılır.
Kod bloğundaki SQL sorgusunu düşünün. Sunucudan yanıt gelmeden önce 5 saniyelik bir gecikme olursa, saldırgan kullanıcının admin parolasının P@ssw0rd123.
Out-of-Band SQL Injections
Rare and difficult injections to execute for an attacker because the attacker is unable to use the same channel to send the SQL query and gather results. Generally, these SQL injections will cause the database server to send HTTP or DNS requests containing SQL query results to an attacker-controlled server. From there, the attacker could review the log files to identify the query results.
SQL enjeksiyonlarının hafifletilmesinin bir yolu, hazırlanmış ifadelerdir. Hazırlanan ifadeler ile yürütmek istediğimiz sorgu önceden veri tabanına sağlanır. Herhangi bir giriş daha sonra bir parametre olarak değerlendirilir ve SQL kodu olarak değerlendirilmez.
Mitigating SQL Injection Attacks: Prepared Statements
SQL enjeksiyonlarının hafifletilmesinin bir yolu, hazırlanmış ifadelerdir. Hazırlanan ifadeler ile yürütmek istediğimiz sorgu önceden veri tabanına sağlanır. Herhangi bir giriş daha sonra bir parametre olarak değerlendirilir ve SQL kodu olarak değerlendirilmez.
- İlk olarak, veritabanına bir SQL sorgu şablonu gönderilir. Parametre adı verilen belirli değerler belirtilmeden bırakılır. Örneğin, kullanıcı girişi.
- Veritabanı sorguyu işler ve iyileştirmeler gerçekleştirir.
- Değerler parametrelere bağlanır ve SQL sorgusu yürütülür.
Kod:
$username= $_GET['user']; // Set parameter[/B][/CENTER]
[B][CENTER]$stmt = $conn->prepare("SELECT * FROM Users WHERE name = '?'"); // Prepare statement
$stmt->bind_param("s", $username); // Bind parameter to SQL query
$stmt->execute(); // Execute the SQL query
Mitigating SQL Injection Attacks: validator.js
npm paketi, validator.jsSQL enjeksiyonlarını hafifletmeye yardımcı olan veri girişlerini temizlemeye yönelik işlevleri içeren dize doğrulayıcıları ve temizleyicilerden oluşan bir kitaplıktır.
Giriş doğrulayıcılardan bazıları şunları içerir:
Giriş doğrulayıcılardan bazıları şunları içerir:
- isEmail()- Girişin geçerli bir e-posta adresi olup olmadığını kontrol eder
- isLength()- Girişin belirli bir uzunlukta olup olmadığını kontrol eder
- isCurrency()- Girişin para birimi biçiminde olup olmadığını kontrol eder
- isMobilePhone()- Girişin geçerli bir cep telefonu numarası olup olmadığını kontrol eder
normalizeEmail()- Potansiyel olarak tehlikeli karakterleri kaldırmak için e-posta girişlerindeki biçimlendirmeyi kaldırır
- escape()- HTML varlıklarıyla karıştırılabilecek <, >, , ve karakterlerini değiştirir&'"
Kod:
// Prints "true"[/B][/CENTER]
[B][CENTER]console.log(validator.isCurrency("$42.25"))
// Prints "[email protected]"
console.log(validator.normalizeEmail(" [email protected]"))
// Prints "1 < 2"
console.log(validator.escape("1 < 2"))
Kaynaklarım codeacedemiy