Advanced SQL
1. Giriş
Bu otaq yalnız SQL injectionu orta səviyyədə anlayanlar üçündür. Əgər sənin bu haqda kifayət qədər məlumatın yoxdursa SQL Fundamentals, SQLMap The Basics, SQL Injection, SQL Injection Lab bu otaqları bitirib davam etməyin vacibdir. SQL Injection — şirniyyat mağazasının arxa qapısını tapmaq kimidir. Çünki bu veb zəiflik xakerlərə tətbiqinizin SQL sorğularını manipulyasiya etməyə və bunun nəticəsində müxtəlif qiymətli verilənlərə giriş imkanı verir. Məlumatlarınızın dəyişdirilməsi, silinməsi, və yaxud bilavasitə onlar tərəfindən idarə olunmasını düşünün.
Bu otaqda biz sadəcə dillər əzbəri olmuş “’ OR ‘1’=’1” injeksiyasından danışmırıq. Biz bu otaqda Second-Order SQL injection (İkinci dərəcəli SQL injeksiyaları), təhlükəsizlik filtrlərindən yayınma və çətində olsa Out-Of-Band SQL injection kimi mürəkkən və daha çətin mövzulardan danışacağıq. Eyni zamanda Avtomatlaşdırma alətlərinin hücumlarını (sqlmap, sqlninja, jsql injection, bbqsql) necə işlədiyin anlayacaq və SQL injeksiyalardan hücumlarından məlumatlarınızı qorumaq üçün müdafiəni necə keçilməz qalaya çevirə biləcəyinizi öyrənəcəksiniz.
Nə öyrənəcəksiniz?
- Mütəxəssis kimi SQL zəifliklərin aşkarlanması və praktikası.
- Öz Veb tətbiqlərinizi bu hücumlardan müdafiə etmək.
- Filtrlərin, avtomatlaşdırma vasitələrinin və Nmap skanlarının daha incə nüanslarını başa düşmək.
İlkin şərtlər
- SQL Injection əsasları (bunu bilməmək əlifbanı bilmədən Şekspirin əsərlərini oxumağa bənzəyir)
- SQLMAP (SQLi üçün qılıncınız)
- OWASP Top 10 (təbiiki hər şeydən məlumatlı olmağın zərəri yoxdur)
- Nmap (gizli portları tapmaq üçün lazım olacaq)
Praktik!
VM-i işə salın və praktiki işə başlayaq. Mənim ip addresim budur və izahlarda məhz bu ip üzərindən olacaq 10.10.233.102. İp-adress sizdədə yükləndiyinə görə artıq sürətli şəkildə giriş edə bilərik.
Nmap skanı onun açıq portları və xidmətləri haqqında detalları bizim qarşımıza gətirir. Spoiler: Windows-da MySQL ilə işləyir.
Terminaldan görüntü (köçürtmə xD)
nmap -A -T4 -p 3306,3389,445,139,135 10.10.233.102
Sual: MySQL xidmətinin işlədiyi port hansıdır?
Cavab: 3306

. . .
2. Sürətli xülasə
Son SQL injection bölməsində biz SQL injeksiyasının əsaslarını araşdırdıq, hücum edənlərin veb tətbiqlərdəki boşluqlardan necə istifadə edərək SQL sorğularını manipulyasiya etdiyini və icazəsiz məlumatlara necə giriş əldə etdiyini anladıq. Biz əsas texnikaları, məsələn, səhv-məlumatına əsaslanan (error-based) və birləşdirməyə əsaslanan (union-based) SQL injeksiyalarını, eləcə də Blind SQL injeksiyası üsullarını — məntiqə əsaslanan (boolean-based) və vaxta əsaslanan (time-based) hücumları əhatə etdik. Aşağıda SQL injeksiyasının əsas növlərini əhatə edən bu bölmənin qısa xülasəsi verilmişdir.
In-Band SQL Injection: The Chatterbox Approach
Ümumiyyətcə In-Band nə deməkdir: fərz edinki dostunuzu evinizə qonaq dəvət edirsiz o isə evinizə qışqıraraq gəlir. Bu texnika SQL injeksiya hücumlarının ən yayılmış və sadə növü hesab olunur. Bu üsulda hücum edən şəxs həm SQL injeksiyasını həyata keçirmək, həm də məlumatları əldə etmək üçün eyni kommunikasiya kanalından istifadə edir. İki əsas in-band SQL injeksiya növü mövcuddur:
- Error-Based SQL Injection: Bu üsul payload ataraq verilənlər bazasını error mesajı ilə əldə etməkdir.
SELECT * FROM users WHERE id = 1 AND 1=CONVERT(int, (SELECT @@version));
Verilənlər bazasının versiyası xəta mesajında göstərildikdə, verilənlər bazası haqqında məlumatların açığa çıxmasına səbəb olur.
- Union-Based SQL Injection: Xaker iki və ya daha çox SELECT sorğularının nəticələrini vahid bir nəticədə birləşdirmək üçün UNİON operatorundan istifadə edir və bununla istədiyi cədvəllərdən məlumatları əldə edə bilər.
SELECT name, email FROM users WHERE id = 1 UNION ALL SELECT username, password FROM admin
Inferential (Blind) SQL Injection
Şerlok Holms olduğunuzu düşünün gecənin zülmət qaranlığında müəyyən izləri araşdırmaq Blind SQL injeksiyasını axtarmaq kimidir. Xaker proqram cavablarına və ya gecikmələrə əsaslanaraq verilənlər bazası təfərrüatlarını təxmin edir.
- Boolean-Based Blind SQL Injection: Tətbiqin davranışında dəyişiklikləri müşahidə etmək üçün doğru/yanlış şərtləri düzəldən sorğu daxil etməkdir.
SELECT * FROM users WHERE id = 1 AND 1=1;
SELECT * FROM users WHERE id = 1 AND 1=2;
Nəticə: Sorğularda müxtəlif cavablar olduğuna əsaslanan çox bilmiş xaker artıq müəyyən yolları tapıb.
- Time-Based Blind SQL Injection: Əgər SQL sorğusu doğru olarsa daxil edilən dəyər qədər geciksin. Buda xaker üçün yaxşı bir trikdir.
SELECT * FROM users WHERE id = 1; IF (1=1) WAITFOR DELAY '00:00:05';
Result: 5 saniyə gecikdi = bomba partladı!
Out-of-Band SQL Injection
İşlər çətinləşdikdə, bu üsul ən yaxşı metoda çevrilir. Out-of-Band, hücum və məlumatların axtarışı üçün ayrı-ayrı kanallardan istifadə edir. Xarici serverə isə DNS və ya HTTP sorğularını manipulyasiya edərək göndərir.
- Məsələn: Verilənlər bazası öz məlumatlarını sakitcə xakerin öz idarəsi altında olan serverinə göndərir.
- Niyə yaxşıdır: Effektiv və gizlidir, lakin xarici serverə nəzarət və düzgün verilənlər bazası konfiqurasiyasını tələb edir və buda bir qədər işləri çətinləşdirir, amma imkansız deyil.
SQL Injection texnikaları
- In-Band SQL Injection: Sürətli və bilinəndir, həm də asanlıqla aşkar edilir.
- Inferential SQL Injection: Yavaşdır, lakin error mesajları nəticəyə verdikdə işləyir.
- Out-of-Band SQL Injection: Nadir və elit, mürəkkəb işlərdə olduqca mükəmməldir.
Təbiiki bu texnikalar və hücumları dərindən başa düşmək SQL Injection bilmək deyil, eyni zamanda bu hücumlardan qorunmaq lazımdır. Out-of-Band SQL Injectionı daha dərindən öyrənərkən və araşdırarkən eyni zamanda öz sisteminizi qorumağı öyrənirsiniz.
Hər kəs verilənlər bazasına giriş əldə etmək istəyir… amma biz də!
Sual: SQL inyeksiyasının hansı növü həm injeksiya, həm də məlumatların axtarışı üçün eyni rabitə kanalından istifadə edir?
Cavab: In-band
Sual: Out-of-Band SQL inyeksiyasında adətən sorğu nəticələrini xakerin serverinə göndərmək üçün hansı protokoldan istifadə olunur?
Cavab: HTTP
3. İkinci dərəcəli SQL injeksiyası
SQL injeksiyanın qorxulu olduğunu düşündün? Hahaha, doğru düşünürsən, amma indi daha da qorxacaqsan. Second-Order SQL Injection – uzun-uzun düşünən, səbirli bir hücumdur. Bu hücum növü cari vaxtda özünü göstərmir, bu hücum üz payloadını verilənlər bazasına sözün əsl mənasında injektə edir və bütün serveri çökərtmək üçün o “müqəddəs” vaxtı gözləyir. Bir növ Trojan atlı SQL hücumu kimi başa düşə bilərsiniz, əvvəl özünü zərərsiz verilən kimi görsədir, sonra isə öz işini görür.
Necə işləyir
- Birinci Addım: Xaker payloadı (“12345′; DROP TABLE books; –”) zahirən zərərsiz formada daxil edir.
- İkinci addım: Giriş məlumat bazasında saxlanılır, rahat və zərərsiz görünür.
- Üçüncü addım: Məlumat daha sonra fərqli sorğuda istifadə edildikdə, BUM — payload işə düşür və verilənlər bazası öz işini itirir.
Niyə bu qədər təhlükəlidir
Second-Order SQL Injection saatlı bomba yerləşdirmək kimidir:
- İlkin olaraq pis bir şey etmədiyi üçün input hissəsinin yoxlanılmasından yan keçir.
- İşə salınana qədər verilənlər bazasında sakitcə gizlənir.
- O partlayanda artıq çox gecdir – verilənlər bazanız cooked olunub xD.
http://10.10.233.102/second/add.php daxil oluruq və açılan səhifə normal olaraq kitab əlavə etmək səhifəsi kimi görünə bilər, amma biz bu gün xakerik, verilənlər bazasını çökdürməliyik bunun üçün bunları daxil edirik.

Kimsə kitab təfərrüatlarını yeniləməyə çalışana qədər hər şey yaxşı görünür. Payload aktivləşir və verilənlər bazasındakı bütün kitab adlarını “Hacked ” vəziyyətinə çevirir. SSN hissəsinı yazmağımızın məqsədi isə odur ki, admin tərəfindən belə kitabın SSN kodunun dəyişdirə bilinməməsidir.
if (isset($_POST['submit'])) {
$ssn = $conn->real_escape_string($_POST['ssn']);
$book_name = $conn->real_escape_string($_POST['book_name']);
$author = $conn->real_escape_string($_POST['author']);
$sql = "INSERT INTO books (ssn, book_name, author) VALUES ('$ssn', '$book_name', '$author')";
if ($conn->query($sql) === TRUE) {
echo "<p class='text-green-500'>New book added successfully</p>";
} else {
echo "<p class='text-red-500'>Error: " . $conn->error . "</p>";
}
}
PHP kodunda daxil edilən məlumatlardakı xüsusi simvolları (məsələn, tək dırnaq işarəsi və digər SQL meta-simvolları) real_escape_string() metodu ilə qaçıraraq bəzi ilkin SQL injeksiya risklərini azalda bilər. Lakin bu metod tətbiqi Second Order SQLi qarşısında qorumaq üçün kifayət deyil. Əsas problem burada parametrləşdirilmiş sorğuların (parameterised queries) olmamasıdır ki, bu da SQL injeksiyalarının qarşısını almaqda əsas təhlükəsizlik tədbiridir.
real_escape_string() metodu ilə daxil edilən məlumatlar dərhal zərər verməsə də, sonrakı mərhələdə — həmin məlumat başqa bir SQL sorğusunda istifadə olunduqda — təhlükəli ola bilər.
Məsələn, bir kitabın adı belə daxil olarsa: Intro to PHP'; DROP TABLE books;--
bu, INSERT əməliyyatında zərər verməyə bilər. Lakin əgər bu kitab adı daha sonra başqa bir SQL sorğusunda istifadə olunarsa və həmin sorğu da düzgün təmizlənməzsə, bu verilənlər bazasındakı “books” cədvəlinin silinməsi kimi ciddi nəticələrə səbəb ola bilər.
Bu səbəbdən parametrləşdirilmiş sorğular istifadə etmək ən etibarlı yanaşmadır.
Payloadı işə salmaq üçün isə http://MACHİNE_İP/second/update.php daxil oluruq və payload əlavə etdiyim məlumatı və yaxud istənilən bir məlumatı UPDATE etdikdə avtomatik olaraq yazdığımız payload işə düşmüş olacaq. Mövzudan kənarda olsa ssn hissəsində Reflected XSS var xD. Gəlin bu taskın suallarına baxaq.
Sual: Bütün kitabların adını “compromised” olaraq yenilədikdən sonra bayraq dəyəri nədir?
Cavab: THM{SO_HACKED}
İzah: verilmiş payloadda sadəcə Hacked yerine compromised yazırıq və update səhifəsini yenilədikdə səhifənin yuxarı hissəsində bayraq görsənir.
Sual: Hello cədvəlini verilənlər bazasından atdıqdan sonra bayraq dəyəri nədir?
Cavab: THM{Table_Dropped}
İzah: '; DROP TABLE books;-- paylaodından istifadə edirik.
. . .
4. Filtrdən yayınma üsulları
Filtrlərin ən güclüsü, pentesterlərin isə daha güclü olduğu qabaqcıl SQL injection liqasına xoş gəlmisiniz! Əgər siz əsas SQL injeksiyasının bir parça tort olduğunu düşünürsünüzsə, yenidən düşünün. Müasir veb proqramlar hər bir hərəkətinizi filtrləyən və bloklayan müdafiə vasitələri ilə silahlanmış spartalar kimidir. Amma qorxmayın, biz ninjayıq, təbiiki bu filtrdəndə yayına bilərik.
1. Simvolların Kodlanması: Yeni Ən Yaxşı Dostunuz
İnjeksiya hücumlarınızda təbiiki filtr etmə məsələsi olacaq və bu kifayət qədər can sıxıcı mövzudur, amma başqa çarəmiz yoxdur, öyrənməkdən başqa. Simvol kodlaşdırması ilə siz payloadınızı gizli agent kimi gizlədə bilərsiniz. Filtrlər cəfəngiyat görə bilər, amma verilənlər bazası? Hər şeyi görür.
- URL kodlaşdırması: URL kodlaması simvolların faiz (%) işarəsi və ardınca onaltılıq rəqəmdə ASCII dəyəri ilə təmsil olunduğu ümumi üsuldur. Məsələn,
' OR 1=1--bu payload%27%20OR%201%3D1--kimi kodlaşdırıla bilər. Bu kodlaşdırma veb proqram filtrlərindən keçməsinə və verilənlər bazası tərəfindən deşifrə edilməsinə kömək edə bilər ki, bu da ilkin emal zamanı onu zərərli hesab etməyə bilər. - Hexadecimal kodlaşdırması: Onaltılıq kodlaşdırma onaltılıq dəyərlərdən istifadə edərək SQL sorğularının qurulması üçün başqa təsirli bir texnikadır. Məsələn,
SELECT * FROM users WHERE name = 'admin'sorğuSELECT * FROM users WHERE name = 0x61646d696ekimi kodlaşdırıla bilər. Simvolları onaltılıq ədədlər kimi təqdim etməklə xaker girişi emal etməzdən əvvəl bu dəyərləri deşifrə etməyən filtrləri keçə bilər. Həmdəki0x61646d696evə ya61%64%6d%69%6eolduğu təqdirdə niyə məhz'admin'işlədəsənki xD. - Unicode kodlaşdırması: Unicode ardıcıllığından istifadə edən simvolları təmsil edir. Məsələn,
adminsözü\u0061\u0064\u006d\u0069\u006ekimi kodlaşdırıla bilər. Bu üsul yalnız xüsusi ASCII simvollarını yoxlayan filtrləri keçə bilər, çünki verilənlər bazası kodlanmış girişi düzgün emal edəcəkdir.
2. No-Quote SQL Injection: Gizli rejimə keçmək
Burda düşünmə qabiliyyəti əsas götürülür. Məsələn ' || 1=1= yazaraq filtrdən keçmək olar, baxmayaraq ki OR və || eyni şeylərdir. Bəzən ' OR '1'='1 bu payload yerinə OR 1=1 yazıldıqda filtrdən yayına bilir. Başqa bir üsul sorğunun qalan hissəsini dayandırmaq üçün SQL şərhlərindən istifadə etmək lazımdır. Xakerlər dırnaqsız sətir qurmaq kimi SQL funksiyalarından istifadə edə bilərlər. Bu zaman köməyimizə CONCAT() gəlir. Məsələn, CONCAT(0x61, 0x64, 0x6d, 0x69, 0x6e) mənası admin deməkdir.
3. Space-Free Payloads: Filtrlər həyatlarından nifrət etdikdə
Filtrlər boşluqları qadağan etməklə özlərini ağıllı hesab edirlər. Biz isə onlarla zarafat edirik, çünki %20, nişanlar və ya hətta /**/ kimi şərhlər payloadımızı davam etdirə bilər. Məsələn, xaker bu sorğununSELECT * FROM users WHERE name = 'admin' əvəzinə bunu istifadə edə bilər SELECT/**/*FROM/**/users/**/WHERE/**/name/**/='admin'. Başqa bir yanaşma , boşluqları əvəz edən nişan (\t) və ya yeni sətir (\n) simvollarından istifadə etməkdir. Bəzi filtrlər bu simvollara icazə verə bilər ki, bu da təcavüzkarın kimi bir sorğu yaratmasına imkan verir Bu texnika xüsusi olaraq boşluq axtaran filtrləri keçə bilər SELECT\t*\tFROM\tusers\tWHERE\tname\t=\t'admin'.
Alternativ simvollar: Effektiv üsullardan biri tab əvəzinə bu kodu %09, yeni sətr əvəzinə bu kodu %0A əvəz edib istifadə etmək olar. Bu yolun mənası müxtəlif növ boşluqları təmsil edən alternativ URL kodlu simvollardan istifadə etməkdir. Bu simvollar payloadda boşluqları əvəz edə bilər. %09, %0A, %0C, %0D, %A0. Məsələnə yeni sətr olan %0A encoding olduqda space kimi görsənir.
Real Həyat nümunəsi
Təsəvvür edin: Developer OR, AND və UNION kimi SQL açar sözlərini silmək üçün qürurla str_replace() funksiyasından istifadə edir. Özünüzü təhlükəsiz hiss edərsinizmi? Mən yox. Bununla yanaşı, Oskar mükafatına layiq olduğu qədər payload ilə filtrdən yan keçərək, URL kodlaşdırması olan pentester gəlir. Sonra isə developer verilenlər bazasının drop olduğunu görüb ağlayır xD.
- Orijinal payload:
Intro to PHP' || 1=1 --+ - Kodlanmış yük:
Intro%20to%20PHP%27%20OR%201%3D1%20 — +
Nə olduğunu təxmin etdinsə əla, səni sevdim. Yazdığımız payload özünü ağıllı sanan developerin əlavə etdiyi filtrdən yağ kimi keçdi.
- Developerlər üçün: Filtrlər əladır, lakin parametrləşdirilmiş sorğular və hazırlanmış ifadələr Kevlar kimidir — güllə keçirməz.
- Pentesters üçün: Həyat sizə filtrlər verəndə çıxış yolunuzu kodlayın və ya yeni yollar öyrənməyə davam edin, çünki filtr oyunu həmişə dəyişir.
Nəhayət, hər şey rəqibinizi qabaqlamaqdan ibarətdir. İstər developer olub müdafiə edin, istərsə də penterser olub hücüm edin, unutmayın: SQL injeksiyası ağıl oyunudur və ən ağıllı kod qalib gəlir!
İndi isə öyrətdiyimiz məlumatlarla sualları həll etməyə çalışın (təbiiki bizdə izah verəcik).
Sual: Yanlış simvollarla yanlış sorğu daxil edildikdə MySQL xəta kodu nədir?
Cavab: 1064

İzah: Buradakı məqsəd odur ki, əvvəl bizim bildiyimiz olan payload, yəni Intro to PHP' OR 1=1 istifadə edək. Bu zaman isə MariaDB error verir (error verməsi belə bizim üçün böyük şeydi və çox şeyi ifadə edir).
Sual: Kitab ID=6 olan kitabın adı nədir?
Cavab: Animal Series
İzah: Yuxarıdakı olan şəkildən göründüyü kimi biz sadə payload yazmışıq, indi isə bu payloadı biraz dəyişdirək. Intro to PHP' || 1=1 --+ bu normal halıdır amma biz bunu birdə url encoding etməliyik. Intro%20to%20PHP'%20OR%201=1. Təbiiki ilk halda da işləyir amma bu hərzaman deyil, necəki istisnalar qaydaları pozmur.
5. Filtrdən yayınma üsulları (Ardı)
Əla, artıq filtrləri daha da anlayırıq. Bəzi SQL injeksiya filtrləri hər yeməkdə yemək seçiminizi mühakimə edən bir dost kimi kotirovkalar haqqında həqiqətən seçici olur. Ancaq narahat olmayın, hətta təklifə ehtiyac duymadan bu filtrlərdən keçməyin yolları var.
Şərhsiz Hack
Onsuzda şərhlər kimə lazımdır? ‘ OR ‘1’=’1 yazmaq əvəzinə sadəcə OR 1=1 yaza bilərsiniz.
Real Dünya Nümunəsi
Deyək ki, boşluqları və ümumi SQL açar sözlərini filtrdən keçirən gizli URL müdafiəsi var. Normalda, bu payloadı 1%27%20||%201=1%20--+ cəhd etsəniz sadəcə bloklanacaq. Lakin gizli yeni sətir kimi %0A simvollarından istifadə edərək, onu etibarlı sorğu kimi şərh olunan kimi görünən bir şeyə çevirə bilərsiniz. Məsələn bu payloadı yazsanız 1'%0A||%0A1=1%0A--%27+ Boom — SQL inyeksiya uğurlu olacaq!
Filtrləri və WAF-ları keçmək üçün məsləhətlər
- SELECT qadağası var? SElEcT cəhd edin və ya bəzi şərhlər yazın: SE/**/LECT .
- Boşluq müdafiəsi var? Filtrləri qarışdırmaq üçün onları
%0Avə ya */**/ilə əvəz edin. - AND/OR qadağası var? && istifadə etməyə və ya concat kimi funksiyalarla birləşdirməyə
çalışın :CONCAT('a', 'd', 'm', 'i', 'n') .
SQL injeksiyası təkcə sistemə eyni köhnə hücumları atmaq deyil. Sən hiyləgər olmalısan! Filtrlər ağıllıdır, sən daha ağıllısan – bəzən hər şey səbr, əzmkarlıq və bir az da gizli yaradıcılıqla bağlıdır. Təcrübə etməyə davam edin və unutmayın ki, xakerlər böyük aşpazlar kimidirlər – onlar əldə etdikləri inqrediyentlərlə necə yaradıcı olmağı bilirlər.
Sual: “attacker” istifadəçi adı üçün parol nədir?
Cavab: tesla
İzah: http://MACHİNE_İP/space/search_users.php?username=?1%27%20||%201=1%20--+
Sual: SELECT açar sözü qadağandırsa, aşağıdakılardan hansı istifadə edilə bilər?
a) SElect
b) SeLect
c) Both a and b
d) SELECT açar söz filtrindən yan keçə bilmərik
Cavab: c