Anti-armenia.ORG - Forumlar - SQL Injection'a Giriş



Istifadəçi
    2012-03-23 18:42 GMT                 

Hero_Xazar



İstifadəçi
Mesaj Sayı : 16
Mövzu Sayı :
Rep Ver : 
Rep Sayı :   0  
Indi Saytda : Durum
Cinsiyyət : Oğlan
Şəhər :
Ölkə :
Məslək :
Yaş :
Mesaj :

Mövzunu Paylaş!


[center][img] [url]http://endir.net/photo/photos/VIGXZ_7242.jpg[/img][/center][/url]

SQL Injection veb tətbiqlərində ki ən ciddi açıqlayarın başında gəlir. Xüsusilə frameworkler və ORM (Object Relational Mapping) kimi əlavə verilənlər bazası laylarının məşhurlaşması ilə köhnəsinə görə bu günlərdə bir az daha az görülməkdədir amma əmin olun hələ hər yerdələr!

Veb tətbiqi inkişaf etdiricilərçiləri SQL Injection' ı tam anlamadıqlarından ötəri bəzi ölümcül səhvlər edərlər. Buna görə bu gün bilinən sadə SQL Injection metodları o qədər çox görünməsə də irəli də izah edəcəyimiz irəli səviyyə SQL Injection açıqlarını çox böyük firmalardan, hazır sistemlərə qədər bir çox yerdə görə bilərsiniz.

Təhlükəsizlik Günahı !
Mən xaklaya bilmədimsə kimsə xaklaya bilməz

Təhlükəsizlikdəki böyük günahlardan biri kəslərin bəzi açıqlayar haqqında "mən hackleyemediysem etibarlıdır." deyə düşünmələri. Yazı silsilə/serialı boyunca bu şəkildə bir silsilə/serial SQL Injection şəhər
əfsanələrinə də yer verəcəyik.

Son olaraq SQL Injection haqqında əhəmiyyətli bir qeyd,
SQL Injection verilənlər bazasından və dildən müstəqil olaraq hər cür tətbiq-verilənlər bazası əlaqəsinə sahib sistemdə ol/tapıla bilər və bu verilənlər bazalarının bir açığı deyil. SQL Injection' dan qorunmaq veb inkişaf etdiricisinin vəzifəsidir.

SQL Nədir?
SQL (Structured Query Language) verilənlər bazalarında verilən çəkmə, silmə və dəyişdirmə kimi əməliyyatlar üçün istifadə edilən sadə quruluşlu bir dildir. Bu gün az qala bütün veb tətbiqlərinin infrastrukturunda verilənlər bazası dəstəyi vardır və bu veb tətbiqləri verilənlər bazası ilə SQL vasitəsilə razılaşarlar.

Bir sayta mesaj buraxdığınızda bu mesaj verilənlər bazasına yazılar. O mesaj təsdiqləndiyində verilənlər bazasındakı bir sahə aktuallaşmış olar. İdarəçi verilənlər bazasındakı qeydi silərək o mesajın saytdan silinməsini təmin edər.

Nümunə bir qeyd silmə SQL cümləsi bu şəkildə ola bilər;
DELETE FROM members WHERE id=17

Yuxarıdakı kod verilənlər bazası tərəfindən işlədildiyində members tablo/cədvəlində id sahəsni 17 olan qeyd silinəcək.

Bu məqalə SQL dilinin sadə detallarını ələ almayacaq. Əgər SQL mövzusunda zəif sinizsə məqaləni anlamanız güc olacaq. Məqaləyə davam etmədən əvvəl SQL en təməl əmrlərini öyrənmənizi və verilənlər bazası məntiqiniz anlamanızı tövsiyə edərəm.

SQL Injection Nədir?

Veb tətbiqlərində bir çox əməliyyat üçün istifadəçidən alınan məlumat ilə dinamik SQL cümləcikləri yaradılar. Məsələn "SELECT * FROM Products" nümunə SQL cümləciyi sadə şəkildə verilənlər bazasından veb tətbiqinə bütün məhsulları çevirəcək. Bu SQL cümləcikləri yaradılarkən araya sıxışdırılan hər hansı bir əmtəə-xarakter SQL Injection' a səbəb ola bilər.

əmtəə-Xarakter Nədir?
Əmtəə-xarakter bir proqram üçün xüsusi mənasnı olan xarakterlərə verilən addır. Nümunə olaraq C əsaslı C#, Javascript, PHP kimi dillərdə (\) backslash xarakteri bir əmtəə-xarakterdir. Compiler (yığıcı) ya da Interpreter (şərh edici) bu xarakteri görüncə ondan sonrakı xarakteri ona görə işlər.

SQL' üçün kritik metakarakter (‘) tək dırnaq' dır. Çünki iki tək dırnağın arası string hesab edilər. Digər bir əhəmiyyətli əmtəə-xarakter isə (;) nöqtəli vergüldür, sətirin bitdiyini və yeni sətir başladığını bildirər.

Ümumi bir veb tətbiqində ola biləcək bir üzv girişi əməliyyatı bu şəkildədir;

Formadan gələn istifadəçi adı və şifrə məlumatı ilə əlaqədar SQL cümləciyi yaradılar (SELECT * FROM members WHERE user='admin' AND password='sifre' kimi)

SQL cümləciyi qeyd çevirirsə belə bir istifadəçinin var olduğu mənasını verər və session(oturum) açılar və əlaqədar istifadəçi üzv girişi etmiş olar.

Əgər verilənlər bazasından qeyd dönmədisə "istifadəçi ol/tapıla bilmədi" və ya "şifrə səhv" kimi bir səhv ilə ziyarətçi təkrar üzv girişi formasına göndərilər.

Nümunə bir üzv girişi kodu
ASP ilə yazılmış nümunə bir üzv girişi kodu;

<%
1. FUsername = Request.Form("username")
2. FPassword = Request.Form("password")
3.
4. Set RsLogin = SQLConn.Execute("SELECT * FROM Members WHERE username = '" & FUsername & "' AND Password = '" & FPassword & "'")
5.
6. If RsLogin.EOF AND RsLogin.BOF Then
7. Response.Redirect "/error.asp"
8.
9. Əlsə
10. Session("login") = RsLogin("user_id")
11. Response.Redirect "../"
12.
13. End If
%>

Kod çox sadə. 1. və 2. sətirdə "username" və "password" forma dəyişənlərinin dəyərlərini al/götürür. 4. sətirdə SQL cümləciyinin içərisinə yerləşdirib istifadəçi idarəsni edir.

Bu əməliyyatdan sonra 6. sətirdə nəticənin boş olub olmadığına baxır. Əgər boş isə yəni istifadəçi verilənlər bazasında ol/tapılmadısa 7. sətirdə görüldüyü kimi istifadəçini səhv səhifəsinə göndərir.

Əgər ol/tapıldısa 10 və 11. sətirdəki əməliyyatları edir. Yəni istifadəçiyə id' si ilə birlikdə bir session açır. Bu sayədə istifadəçi sistemə daxil olmuş olur.

Bu klassik bir login prosedurasnı. Təbii ki daha fərqli ya da qarışıq ola bilər.

İstifadəçi adı və şifrəyə bir injection sınağı edib nələr olacağını araşdıraq. Əgər istifadəçi adı və şifrə yerinə "' OR ''='" və "' OR ''='" girsək müvəffəqiyyətli bir şəkildə üzv daxil olmuş oluruq amma necə və niyə?

İndi çalışan nümunə kodu təkrar xatırlayaq 1 və 2. sətir forma dəyərini al/götürürdü 4. sətirdə bu gələn dəyərləri SQL' en içərisinə yerləşdirib verilənlər bazasında sorğu etdirdiyirdi.

Forma dəyərlərini yerlərinə yerləşdirək və az əvvəlki çalışan SQL' e baxaq;

SELECT * FROM Members WHERE username = '' OR ''='' AND Password = '' OR ''=''

Fərqinə vardığınız üzrə bu SQL sorğusu hər vaxt doğru dönəcək və "Members" tablo/cədvəlindəki bütün üzvləri gətirəcək. Bu SQL cümləciyini tərcümə etsək bu şəkildə olacaq. Members tablo/cədvəlindən username boş olanları və password ü boş olanları gətir ya da boş bərabərdir boş!

Birinci və ikinci məntiqi idarənin qeyd çevirib çevirməsi əhəmiyyətli deyil çünki üçüncü idarə hər vaxt doğru olaraq dönəcəyindən (boş hər zamana boşa bərabər deyilmi?) bu SQL cümləciyi hər vaxt bütün qeydləri çevirəcək. Yəni qeyd boşmu dolumu deyə nəzarət etdiyimizdə qeyd dolu olaraq görünəcək. Fərqinə vardınızsa OR istifadə etdik ötəriylə məntiqi sorğuların hər hansı bir doğru (true) olaraq dönsə bütün qeydlər dönmüş olur.

Bu səbəbdən bu SQL Injection' ı etdiyimizdə dönən qeydlərdəki ilk istifadəçi olaraq daxil olulmuş olacaq.

Gördüyünüz kimi SQL Injection; SQL cümləciklərinin arasına çöldən girdi edərək SQL' i istədiyiniz şəkildə manipüle etmənizə icazə verir.


MÖVZU ALINTIDIR..

Anti-armenia.ORG
    

Istifadəçi
    2012-03-24 11:20 GMT                 

Avatar Fearless



VIP
Mesaj Sayı : 1299
Mövzu Sayı :
Rep Ver : 
Rep Sayı :   23  
Indi Saytda : Durum
Cinsiyyət : Oğlan
Şəhər : Gävle
Ölkə :
Məslək : Hacker,Defacer,Programmer
Yaş : 26
Mesaj :

Mövzunu Paylaş!


Təşəkkürlər Yararlı Mövzudur

http://s017.radikal.ru/i404/1202/c6/a2947080a3c4.png
Anti-armenia.ORG