- Qoşulub
- 1 Oktyabr 2022
- Mesajlar
- 121
SQL açığı (SQL Injection), veb tətbiqlərinə daxil olan istifadəçi məlumatlarının SQL sorğularına daxil edilməsi nəticəsində əmələ gələn bir təhlükəsizlik zəifliyidir. Bu açıq, hücumçuların zərərli SQL kodu daxil edərək verilənlər bazasına müdaxilə etmələrinə, məlumatları oğurlamalarına, dəyişdirmələrinə və ya silmələrinə imkan verir. SQL açığı, xüsusilə istifadəçi tərəfindən daxil edilən məlumatların düzgün şəkildə yoxlanılmaması və filtrlənməməsi səbəbindən yaranır.
Bir istifadəçi adı və parolunun daxil edildiyi bir login formunu düşünək. Əgər tətbiqçi aşağıdakı kimi bir SQL sorğusu istifadə edirsə:
Əgər user_input və password_input birbaşa SQL sorğusuna daxil edilərsə, bir hücumçu aşağıdakı kimi məlumatlar daxil edərək SQL Injection hücumu edə bilər:
Bu halda, SQL sorğusu belə görünəcək:
Bu SQL sorğusu həmişə doğru olacaq və hücumçu hər hansı bir istifadəçi hesabına daxil ola biləcək.
SQL Açığının Yaranma Səbəbləri:
- İstifadəçi Girişlərinin Yoxlanılmaması:
- İstifadəçinin daxil etdiyi məlumatlar birbaşa SQL sorğularına daxil edilərsə və bu məlumatlar təmizlənməzsə, hücumçu SQL kodunu daxil edə bilər. Məsələn, login formasında istifadəçi adı və parolunun daxil edilməsi zamanı bu məlumatların heç bir doğrulama və filtrləmə aparılmadan SQL sorğusuna əlavə edilməsi SQL injection təhlükəsi yaradır.
- Dynamic SQL Sorğuları:
- Dinamik SQL, istifadəçinin daxil etdiyi məlumatları SQL sorğusuna birbaşa daxil edir. Bu üsulda, istifadəçinin inputu təmizlənməzsə, zərərli SQL kodu işləyəcək.
- Məsələn:
SQL:SELECT * FROM users WHERE username = 'user' AND password = 'password';
Yuxarıdakı sorğuya hücumçu username və password sahələrinə zərərli SQL kodu daxil edə bilər. - Bəzi SQL Funksiyalarının Yaxşıca Yoxlanılmaması:
- SQL-in təklif etdiyi bəzi funksiyalar (məsələn, UNION, DROP, SELECT, INSERT, UPDATE və s.) zərərli məqsədlər üçün istifadə edilə bilər, amma bunlar düzgün yoxlanılmadığı halda təhlükə yarada bilər.
- Yoxlanılmayan Query Parametrləri:
- URL parametrləri, form məlumatları və ya query stringlər daxilində istifadə edilən parametrlər düzgün filtrlənməyibsə, SQL injection açığı yarana bilər.
SQL Injection Hücumunun Nümunəsi:
Bir istifadəçi adı və parolunun daxil edildiyi bir login formunu düşünək. Əgər tətbiqçi aşağıdakı kimi bir SQL sorğusu istifadə edirsə:
SQL:
SELECT * FROM users WHERE username = 'user_input' AND password = 'password_input';
Əgər user_input və password_input birbaşa SQL sorğusuna daxil edilərsə, bir hücumçu aşağıdakı kimi məlumatlar daxil edərək SQL Injection hücumu edə bilər:
- username = ' OR '1'='1
- password = ' OR '1'='1
Bu halda, SQL sorğusu belə görünəcək:
SQL:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '' OR '1'='1';
Bu SQL sorğusu həmişə doğru olacaq və hücumçu hər hansı bir istifadəçi hesabına daxil ola biləcək.
SQL Injection Hücumunun Qarşısını Almaq Üçün Tədbirlər:
- Prepared Statements və Parameterized Queries:
- Prepared Statements və Parameterized Queries SQL injection hücumlarına qarşı ən effektiv qorunma üsuludur. Bu yanaşma ilə, istifadəçi daxil etdiyi məlumat SQL sorğusundan ayrı saxlanılır, beləliklə istifadəçi məlumatları zərərli SQL kodu olaraq qəbul edilmir.
- PHP-də hazırlanmış bir nümunə:
-
SQL:
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?"); $stmt->bind_param("ss", $username, $password); $stmt->execute();
Burada istifadəçi daxil etdiyi məlumatlar əvvəlcədən bind_param ilə bağlıdır və SQL sorğusunda birbaşa istifadə olunmur.- Stored Procedures:
- Stored Procedures istifadə edərək SQL sorğuları server tərəfindən əvvəlcədən müəyyən edilə bilər. Bu, istifadəçilərin daxil etdiyi məlumatları kodun içərisində birbaşa istifadə etməmək və təhlükəsizliyini artırmaq üçün faydalıdır.
- İstifadəçi Girişlərinin Doğrulaması və Filtrələnməsi:
- İstifadəçinin daxil etdiyi məlumatlar, uyğunluq yoxlaması edilməli və input validation (daxil edilən məlumatların doğruluğunu yoxlama) həyata keçirilməlidir. Məsələn, yalnız rəqəmlər və hərflərdən ibarət məlumatları qəbul etmək.
- Whitelist (ağ siyahı) yanaşması ilə yalnız müəyyən dəyərləri qəbul etmək daha təhlükəsizdir.
- Escape (Qaçırma) və Encoding:
- SQL sorğularında istifadəçilərdən alınan məlumatları "escape" etməli və ya HTML encoding etməlisiniz. Bu, SQL sorğularının daxil edilməsini əngəlləyir.
- Least Privilege (Ən Az İcazə) Prinsipi:
- Verilənlər bazası istifadəçiləri yalnız zəruri icazələrlə təmin edilməlidir. Hücumçu verilənlər bazasında yüksək səlahiyyətlərə malik bir istifadəçi hesabı ilə hücum edərsə, ciddi zərər verə bilər.
- Web Application Firewall (WAF):
- Web Application Firewall (WAF) hücumları mühafizə etmək və SQL injection da daxil olmaqla zərərli fəaliyyətləri aşkar etmək üçün istifadə edilə bilər.
- Məlumatların Təhlükəsiz Saxlanması:
- Verilənlər bazasına daxil olan bütün həssas məlumatlar (məsələn, parollar) düzgün şəkildə şifrələnməli və hash edilməlidir. Bu, SQL injection hücumu ilə belə məlumatların oğurlanmasını çətinləşdirir.
- Davamlı Təhlükəsizlik Testləri və Auditin Keçirilməsi:
- Tətbiqlərin müntəzəm olaraq təhlükəsizlik testlərinə və auditlərə tabe tutulması SQL injection və digər təhlükəsizlik zəifliklərini aşkar etmək üçün vacibdir.