SQL Injection Attack Nümunəsi Və Qarşısının Alınması
Müəllif : Bəhram Ağaəhmədli
SQL İnjeksiya Nümunələri və Veb Tətbiqlərində SQL Injeksiya Hücumlarının qarşısının alınması yolları
Veb saytı və ya sistemi sınaqdan keçirərkən pentest edənin məqsədi sınaqdan keçirilmiş saytın mümkün qədər qorunduğunu təmin etməkdir.
Adətən bu məqsədlə Pentest aparılır. İlkin olaraq, bu cür testləri həyata keçirmək üçün hansı hücumların baş vermə ehtimalını nəzərə almalıyıq. SQL İNJEKSİYA bu hücumlardan biridir.
SQL İNJEKSİYA sisteminizə və həssas məlumatlarınıza ciddi və zərərli nəticələr verə biləcəyi üçün ən çox yayılmış hücumlardan biri hesab olunur.
SQL İNJEKSİYA Nədir?
İstifadəçi daxiletmələrindən bəziləri verilənlər bazasında tətbiq tərəfindən yerinə yetirilən SQL Statements tərtibində istifadə oluna bilər . Tətbiqin istifadəçi tərəfindən verilən daxiletmələri düzgün idarə etməsi MÜMKÜN DEYİL.
Əgər belədirsə, zərərli istifadəçi proqrama gözlənilməz daxiletmələr verə bilər ki, bunlar daha sonra verilənlər bazasında SQL statements çərçivəyə salmaq və icra etmək üçün istifadə olunur. Buna SQL İNJEKSİYA deyilir. Belə bir hərəkətin nəticələri qorxulu ola bilər.
Adından da göründüyü kimi, SQL İNJEKSİYA hücumunun məqsədi zərərli SQL kodunu yeritməkdir.
Veb saytın hər bir sahəsi verilənlər bazasına bir qapı kimidir. Giriş formasında istifadəçi giriş məlumatlarını, axtarış sahəsinə istifadəçi axtarış mətnini, məlumatların saxlanması formasında isə saxlanacaq məlumatları daxil edir. Göstərilən bütün məlumatlar verilənlər bazasına daxil olur.
Düzgün məlumat əvəzinə, hər hansı bir zərərli kod daxil edilərsə, verilənlər bazasına və bütün sistemə ciddi ziyan vurma ehtimalı var.
SQL injeksiya SQL proqramlaşdırma dili ilə həyata keçirilir. SQL (Structured Query Language) verilənlər bazasında saxlanılan məlumatları idarə etmək üçün istifadə olunur. Buna görə də bu hücum zamanı bu proqramlaşdırma dili kodu zərərli injeksiya kimi istifadə olunur.
Bu, ən populyar hücumlardan biridir, çünki verilənlər bazası demək olar ki, bütün texnologiyalar üçün istifadə olunur.
Tətbiqlərin əksəriyyəti bir növ verilənlər bazasından istifadə edir. Pentest edilən proqram aşağıdakı vəzifələri yerinə yetirmək üçün istifadə edilən istifadəçi girişini qəbul edən istifadəçi interfeysinə malik ola bilər:
#1) İstifadəçiyə müvafiq saxlanılan məlumatları göstərin , məsələn, proqram istifadəçi tərəfindən daxil edilmiş giriş məlumatından istifadə edərək istifadəçinin etimadnaməsini yoxlayır və istifadəçiyə yalnız müvafiq funksionallıq və məlumatları təqdim edir.
#2) İstifadəçinin daxil etdiyi məlumatları verilənlər bazasına yadda saxlayın, məsələn , istifadəçi formanı doldurub təqdim etdikdən sonra proqram verilənlər bazasında məlumatları saxlamağa davam edir; bu məlumatlar daha sonra eyni sessiyada, eləcə də sonrakı seanslarda istifadəçiyə təqdim olunur.
SQL İnjeksiyanın Riskləri
Hal-hazırda, verilənlər bazası demək olar ki, bütün sistemlər və veb-saytlar üçün istifadə olunur, çünki məlumatlar haradasa saxlanmalıdır.
Həssas məlumatlar verilənlər bazasında saxlandığı üçün sistemin təhlükəsizliyi ilə bağlı daha çox risk var. Hər hansı bir şəxsi veb-sayt və ya bloq məlumatları oğurlanarsa, bank sistemindən oğurlanacaq məlumatlarla müqayisədə çox zərər olmayacaq.
Bu hücumun əsas məqsədi sistemin verilənlər bazasını ələ keçirməkdir, ona görə də bu hücumun nəticələri həqiqətən zərərli ola bilər.
Aşağıdakılar SQL İnjeksiya nəticəsində yarana bilər
Başqasının hesabını ələ keçirmək.
Veb saytın və ya sistemin həssas məlumatlarının oğurlanması və surətinin çıxarılması.
Sistemin həssas məlumatlarının dəyişdirilməsi.
Sistemin həssas məlumatlarının silinməsi.
İstifadəçi proqrama başqa istifadəçi, hətta administrator kimi daxil ola bilər.
İstifadəçilər digər istifadəçilərə məxsus şəxsi məlumatlara baxa bilərlər.
İstifadəçi proqram konfiqurasiya məlumatlarını və digər istifadəçilərin məlumatlarını dəyişə bilər.
İstifadəçi verilənlər bazasının strukturunu dəyişdirə bilər; hətta proqram verilənlər bazasında cədvəlləri silin.
İstifadəçi verilənlər bazası serverinə nəzarəti ələ keçirə və istədiyi zaman oradakı əmrləri yerinə yetirə bilər.
Yuxarıda sadalanan risklər həqiqətən ciddi hesab edilə bilər, çünki verilənlər bazasını və ya onun məlumatlarını bərpa etmək çox baha başa gələ bilər. İtirilmiş məlumat və sistemləri bərpa etmək şirkətinizin nüfuzuna və pula başa gələ bilər.
Bu hücumun mahiyyəti
Daha əvvəl qeyd edildiyi kimi, bu hücumun mahiyyəti məlumat bazasını zərərli məqsədlə ələ keçirməkdir.
Bu Pentesti həyata keçirmək üçün əvvəlcə həssas sistem hissələrini tapmalı və sonra onlar vasitəsilə zərərli SQL kodunu verilənlər bazasına göndərməlisiniz. Əgər bu hücum sistem üçün mümkün olarsa, o zaman müvafiq zərərli SQL kodu göndəriləcək və verilənlər bazasında zərərli hərəkətlər edilə bilər.
Veb saytın hər bir sahəsi verilənlər bazasına bir qapı kimidir. Adətən sistemin və ya veb saytın hər hansı sahəsinə daxil etdiyimiz hər hansı məlumat və ya giriş verilənlər bazası sorğusuna gedir. Ona görə də düzgün məlumat əvəzinə hər hansı zərərli kodu yazsaq, o zaman verilənlər bazası sorğusunda icra oluna və zərərli nəticələr verə bilər.
Bu hücumu həyata keçirmək üçün müvafiq verilənlər bazası sorğusunun aktını və məqsədini dəyişdirməliyik. Bunu yerinə yetirməyin mümkün üsullarından biri sorğunu həmişə doğru etmək və bundan sonra zərərli kodunuzu daxil etməkdir. Verilənlər bazası sorğusunun həmişə doğruya dəyişdirilməsi ‘ və ya 1=1;– kimi sadə kodla həyata keçirilə bilər.
Pentesterlər yadda saxlamalıdırlar ki, sorğunun həmişə doğruya dəyişdirilməsinin olub-olmadığını yoxlayarkən, müxtəlif sitatlar sınaqdan keçirilməlidir — tək və cüt. Buna görə də, əgər ‘və ya 1=1;– kimi kodu sınamışıqsa, ikiqat dırnaq işarəsi olan kodu da sınamalıyıq “ və ya 1=1;–.
Məsələn , hesab edək ki, verilənlər bazası cədvəlində daxil edilmiş sözü axtaran sorğumuz var:
Buna görə də axtarış sözünün əvəzinə SQL Injeksiya sorğusunu ‘ və ya 1=1;– daxil etsək, sorğu həmişə doğru olacaq.
Bu halda, “mövzu” parametri sitatla bağlanır və sonra bizdə kod və ya 1=1 var, bu da sorğunu həmişə doğru edir. “–” işarəsi ilə biz icra olunmayacaq sorğu kodunun qalan hissəsini şərh edirik. Bu, sorğuya nəzarət etməyə başlamağın ən populyar və asan yollarından biridir.
Sorğunun həmişə doğru olması üçün bir neçə başqa kod da istifadə edilə bilər, məsələn:
Burada ən vacib hissə odur ki, vergül işarəsindən sonra icra edilməsini istədiyimiz istənilən zərərli kodu daxil edə bilərik.
Məsələn , ‘ or 1=1; drop table notes; —
Əgər bu injeksiya mümkündürsə, onda hər hansı digər zərərli kod yazıla bilər. Bu halda, bu, yalnız zərərli istifadəçinin bilik və niyyətindən asılı olacaq. SQL injeksiyanını necə yoxlamaq olar?
Bu zəifliyin yoxlanılması çox asanlıqla həyata keçirilə bilər. Bəzən sınanmış sahələrə ‘ or “ daxil olmaq kifayətdir. Hər hansı gözlənilməz və ya qeyri-adi mesajı qaytararsa, o zaman əmin ola bilərik ki, bu sahə üçün SQL Injeksiya mümkündür.
Məsələn , axtarış nəticəsində ‘Internal Server Error‘ kimi xəta mesajı alsanız, bu hücumun sistemin həmin hissəsində mümkün olduğuna əmin ola bilərik.
Mümkün bir hücum barədə məlumat verə biləcək digər nəticələr bunlardır:
Boş səhifə yükləndi.
Heç bir xəta və ya müvəffəqiyyət mesajı yoxdur — funksionallıq və səhifə girişə reaksiya vermir.
Zərərli kod üçün müvəffəqiyyət mesajı.
Bunun praktikada necə işlədiyinə nəzər salaq.
Məsələn, uyğun giriş pəncərəsinin SQL Injeksiya üçün həssas olub olmadığını yoxlayaq. E-poçt ünvanı və ya parol sahəsinə aşağıda göstərildiyi kimi daxil olun.
Əgər belə daxiletmə ‘Internal Server Error‘ səhv mesajı və ya sadalanan hər hansı digər uyğun olmayan nəticə kimi nəticə verirsə, o zaman bu hücumun həmin sahə üçün mümkün olduğuna demək olar ki, əmin ola bilərik.
Çox çətin bir SQL İnjeksiya kodu da sınaqdan keçirilə bilər.
Buna görə də, bir sitat ilə SQL İnjeksiyalarını yoxlamaq bu hücumun mümkün olub olmadığını yoxlamaq üçün olduqca etibarlı bir yoldur.
Tək sitat heç bir uyğun olmayan nəticə verməzsə, biz ikiqat dırnaqları daxil etməyə və nəticələri yoxlamağa cəhd edə bilərik.
Həmçinin, sorğunun həmişə doğru olaraq dəyişdirilməsi üçün SQL kodu bu hücumun mümkün olub-olmadığını yoxlamaq üçün bir üsul kimi qəbul edilə bilər. Parametri bağlayır və sorğunu ‘true’ olaraq dəyişir. Ona görə də təsdiq edilmədikdə, belə giriş istənilən gözlənilməz nəticəni qaytara bilər və eyni zamanda bu hücumun bu halda mümkün olduğunu bildirə bilər.
Mümkün SQL hücumlarının yoxlanılması vebsaytın linkindən də həyata keçirilə bilər. Tutaq ki, bizdə http://(saytın adı)/books=1 kimi vebsayt linki var . Bu halda “books” parametr, “1” isə onun dəyəridir. Əgər verilən linkdə 1 yerinə ‘ işarəsi yazsaydıq, o zaman mümkün injeksiyaları yoxlayardıq.
Buna görə də http://(saytın adı)/books= linki http://www.(saytın adı).com vebsaytı üçün SQL hücumunun mümkün olub -olmaması test kimi olacaq .
Bu halda, www.(saytinadi).com/book=’ linki ‘Internal Server Error‘ və ya boş səhifə və ya hər hansı digər gözlənilməz xəta mesajı kimi səhv mesajı qaytarırsa, SQL Injeksiyanın mümkün olduğuna əmin ola bilərik. həmin sayt üçün. Daha sonra veb saytın linki vasitəsilə daha çətin SQL kodu göndərməyə cəhd edə bilərik.
Bu hücumun veb saytın linki vasitəsilə mümkün olub-olmadığını yoxlamaq üçün ‘ və ya 1=1;– kimi kodlar da göndərilə bilər.
Xatırlatmaq istərdim ki, nəinki gözlənilməz səhv mesajı SQL İnjeksiya zəifliyi kimi qəbul edilə bilər, lakin bir çox Pentesterlər mümkün hücumları yalnız səhv mesajlarına uyğun olaraq yoxlayır.
Bununla belə, yadda saxlamaq lazımdır ki, heç bir doğrulama xətası mesajı və ya zərərli kod üçün uğurlu mesaj bu hücumun mümkün ola biləcəyinə işarə ola bilməz.
Veb Tətbiqlərin SQL İnjeksiyasına Qarşı Pentesti
Veb tətbiqlərinin Pentesti sadə nümunələrlə izah olunur:
Bu zəiflik texnikasına icazə verilməsinin nəticələri ağır ola biləcəyi üçün, bu hücum tətbiqin pentest zamanı sınaqdan keçirilməlidir. İndi bu texnikanın icmalı ilə SQL injeksiyasının bir neçə praktik nümunəsini başa düşək.
Vacib: Bu SQL İnjeksiya Testi yalnız pentest mühitində sınaqdan keçirilməlidir.
Tətbiqin giriş səhifəsi varsa, proqramın aşağıdakı ifadə kimi dinamik SQL-dən istifadə etməsi mümkündür. SQL ifadəsində istifadəçi adı və parol daxil edilmiş bir sıra olduqda, bu ifadənin nəticə olaraq İstifadəçilər cədvəlindən istifadəçi təfərrüatları ilə ən azı bir sıra qaytarması gözlənilir.
Əgər Pentester John-u strUserName (istifadəçi adı üçün mətn qutusunda) və Smith-i strPassword (parol üçün mətn qutusunda) kimi daxil edərsə, yuxarıdakı SQL ifadəsi belə olacaq:
Pentester John’-a strUserName kimi və heç bir strPassword daxil etsəydi, SQL ifadəsi belə olardı:
Qeyd edək ki, SQL ifadəsinin Condan sonrakı hissəsi şərhə çevrilir. İstifadəçilər cədvəlində Con istifadəçi adı olan istifadəçilər varsa, proqram Pentesterə Con istifadəçisi kimi daxil olmağa imkan verəcək. Pentester indi Con istifadəçisinin şəxsi məlumatlarına baxa bilər.
Bəs pentester tətbiqin hər hansı mövcud istifadəçisinin adını bilmirsə? Bu halda, sınayıcı admin, administrator və sysadmin kimi ümumi istifadəçi adlarını sınaya bilər.
Əgər bu istifadəçilərdən heç biri verilənlər bazasında mövcud deyilsə, tester strUserName kimi John’ or ‘x’=’x as strUserName and Smith’ or ‘x’=’x as strPassword.. Bu, SQL ifadəsinin aşağıdakı kimi olmasına səbəb olacaq.
‘x’=’x’ şərti həmişə doğru olduğundan, nəticə dəsti İstifadəçilər cədvəlindəki bütün sətirlərdən ibarət olacaq. Tətbiq pentesterə İstifadəçilər cədvəlində ilk istifadəçi kimi daxil olmağa imkan verəcək.
Əhəmiyyətli: Pentester aşağıdakı hücumlara cəhd etməzdən əvvəl verilənlər bazası administratorundan və ya tərtibatçıdan sözügedən cədvəli kopyalamasını tələb etməlidir.
Əgər pentester edən John’a daxil olsaydı’;
DROP table users_details;’ — strUserName və strPassword kimi hər şey, onda SQL ifadəsi aşağıdakı kimi olacaq.
Bu bəyanat “users_details” cədvəlinin verilənlər bazasından həmişəlik silinməsinə səbəb ola bilər.
Yuxarıdakı nümunələr yalnız giriş səhifəsində SQL injeksiya texnikasından istifadə ilə bağlı olsa da, pentester bu texnikanı tətbiqin mətn formatında istifadəçi daxiletməsini qəbul edən bütün səhifələrində sınaqdan keçirməlidir, məsələn, axtarış səhifələri, rəy səhifələri və s.
SSL istifadə edən proqramlarda SQL injeksiyası mümkün ola bilər. Hətta bir firewall belə tətbiqi bu texnikadan qoruya bilməyəcək.
Bu hücum texnikasını sadə formada izah etməyə çalışmışam. Bir daha təkrar etmək istərdim ki, bu hücum hər hansı digər mühitdə yox, yalnız pentest mühitində sınaqdan keçirilməlidir.
Bu Hücumun Həssas Hissələri
Pentest prosesinə başlamazdan əvvəl, hər bir səmimi pentester hansı hissələrin bu hücuma daha çox həssas olacağını az və ya çox bilməlidir.
Sistemin hansı sahəsinin dəqiq və hansı ardıcıllıqla yoxlanılacağını planlaşdırmaq da yaxşı təcrübədir.
Bu hücum verilənlər bazasında həyata keçirildiyi üçün bütün məlumat daxiletmə sisteminin hissələri, giriş sahələri və veb-sayt keçidləri həssasdır.
Zəif hissələrə aşağıdakılar daxildir:
Giriş sahələri
Axtarış sahələri
Şərh sahələri
Hər hansı digər məlumat girişi və saxlama sahələri
Veb sayt bağlantıları
Qeyd etmək vacibdir ki, bu hücuma qarşı pentest zamanı yalnız bir və ya bir neçə sahəni yoxlamaq kifayət deyil. Bir sahənin SQL Injeksiyadan qoruna biləcəyi olduqca yayğındır, lakin sonra digəri yox. Buna görə də veb saytın bütün sahələrini pentesti unutmamaq vacibdir.
SQL İnjeksiya Pentestlərinin avtomatlaşdırılması
Bəzi sınaqdan keçmiş sistemlər və ya veb-saytlar olduqca mürəkkəb ola və həssas məlumatları ehtiva edə bildiyinə görə, əl ilə test etmək həqiqətən çətin ola bilər və bu da çox vaxt aparır. Buna görə də, bu hücuma qarşı xüsusi alətlərlə sınaqdan keçirmək bəzən həqiqətən faydalı ola bilər.
Qeyd etmək lazımdır ki, avtomatlaşdırılmış alətlər vaxtınıza qənaət etsə də, onlar həmişə çox etibarlı hesab edilmir. Əgər siz bank sistemini və ya çox həssas məlumatı olan hər hansı veb saytı sınaqdan keçirirsinizsə, onu əl ilə sınamağınız çox tövsiyə olunur. Siz dəqiq nəticələrə baxa və təhlil edə bilərsiniz. Həm də bu vəziyyətdə heç bir şeyin atlanmadığına əmin ola bilərik.
Digər Hücumlarla Müqayisə
SQL Injeksiya ən ciddi hücumlardan biri hesab edilə bilər, çünki o, verilənlər bazasına təsir edir və məlumatlarınıza və bütün sistemə ciddi ziyan vura bilər.
Şübhəsiz ki, bunun Javascript İnjeksiya və ya HTML İnjeksiyadan daha ciddi nəticələri ola bilər, çünki onların hər ikisi müştəri tərəfində həyata keçirilir. Müqayisə üçün qeyd edək ki, bu hücumla siz bütün verilənlər bazasına daxil ola bilərsiniz.
Bu hücuma qarşı pentest etmək üçün SQL proqramlaşdırma dilini kifayət qədər yaxşı bilməlisiniz və ümumiyyətlə, verilənlər bazası sorğularının necə işlədiyini bilməlisiniz. Həmçinin bu injeksiya hücumunu həyata keçirərkən daha diqqətli olmalısınız, çünki hər hansı bir qeyri-dəqiqlik SQL injeksiya qala bilər.
Nəticə
Ümid edirik ki, SQL İnjeksiyasının nə olduğu və bu hücumların qarşısını necə almalı olduğumuz barədə aydın təsəvvürünüz olardı.
Bununla belə, verilənlər bazası olan sistem və ya veb sayt hər dəfə sınaqdan keçirilərkən bu tip hücumlara qarşı pentest keçirilməsi çox tövsiyə olunur. İstənilən verilənlər bazası və ya sistem zəifliyi şirkətin reputasiyasına, eləcə də bütün sistemi bərpa etmək üçün çoxlu resurslara baha başa gələ bilər.
Bu injeksiyaya qarşı pentest ən mühüm təhlükəsizlik zəifliklərini tapmağa kömək etdiyindən , pentest alətləri ilə yanaşı biliklərinizi də investisiya etmək tövsiyə olunur. Pentest planlaşdırılırsa, SQL Injeksiya qarşı pentest ilk planlaşdırılmalıdır.
Last updated