DƏRS HAQQINDA


Sql açığı ilə mysqldəki məlumatları çəkmək,silmək editləmək və s. əməliyyatlar həyata keçirtmək olar. Sql açıqlarının yaranmasının səbəbləri mysqlə daxil olan və ya mysqldən çıxan məlumatların yoxlanmadan süzgəcdən keçirilmədən əmrləri həyata keçirildiyi üçün baş verir


SQL AÇIĞI NƏDİR


Sql açığı ilə mysqldəki məlumatları çəkmək,silmək editləmək və s. əməliyyatlar həyata keçirtmək olar.
Sql açıqlarının yaranmasının səbəbləri mysqlə daxil olan və ya mysqldən çıxan məlumatların yoxlanmadan süzgəcdən keçirilmədən əmrləri həyata keçirildiyi üçün baş verir
Adi bir Sql açıqlı PHP scriptə nəzər yetirək

Burda açığın yaranması yuxarıda qeyd etdiyimiz kimi heç bir yoxlanışın olmaması üçündür bəs necə bilək ki scriptimizdə açıq var ya yoxdur?
Bunun üçün mysqlə sorğu göndərən methoda `,',`a kimi exploitlərlə müraciət etməliyik
Bu zaman Ekranda mysql əmri əks olunarsa PHP kodlarımızda açıq var deməkdir

Bu açığı daha dəqiq öyrənmək üçün sql açığından istifadə edərək mysqldən məlumatları çəkək bu barədə digər dərsimizdə məlumat alacayıq




SQL AÇIĞINDAN İSTİFADƏ


Sql açığından istifadə etmək üçün ilk öncə mysqldəki cloumların sayını tapmaq lazımdır bunun üçün ?id=1 olan urlnin sonuna order by xxx yazmalıyıq xxx in yerinə rəqəm yazmalıyıq bu rəqəm təxmini olmalıdır Nümunə : 3 bu zaman ?id=1+order+by+3 yazırıq 3 yazanda yenidən səhv verir bizə lazım olan isə səhv verməməsidir

İndi isə order+by+2 yazaq

gördüyümüz kimi mysqldə 2 cloumn olduğu üçün səhv vermədi İndi isə hansı cloumun səhifədə görsəndiyinə baxaq bunun üçün union+select+1,2 yazmalıyıq və mysqlə gedən məlumatın qarşısına "-" işarəsini qoymaq lazımdır
2-ci cloumun ekrana çıxışı olduğu üçün 2 ekrana əks olundu
indi isə mysqldən tabloları çəkək bunun üçün union+select+1,group_concat(table_name)+from+infor mation_schema.tables+where+table_schema=database() kodundan istifadə edəcəyik
databasedə olan mm ve user tablolari çəkildi indi isə burdan bizə lazım olan user tablosundaki məlumatlardır group_concat(column_name)+from+information_schema. columns+where+table_schema=database() bu kodla datadakı bütün cloumnları çəkmək olur Şəkil 7.gif İndi isə user ve parolu çəkək onun üçün ?id=-1+union+select+1,user+from+user kimi qeyd etməliyik Şəkil 8.gif
Qeyd kodlari yazdiqda -1 (dəyər) kimi olmalidir









SQL AÇIĞINI BAĞLAMAQ


Sql açığını bağlamaq üçün mysqldən gələn və mysqlə gedən məlumatları zərərli kodlardan təmizləmək lazımdır. Bu zaman program verilənləri kod kimi deyil mətn kimi oxuyacaq .
Bu iş üçün PHP dilində mysql_real_escape_string( pdo = quote() ),intval,htmlspecialchars,trim (boşluğu aradan qaldırmaq üçün) kimi funksiyalar mövcuddur
Nümünə : $a=$_GET['id']; Bu dəyişkəni belə yazmaq lazımdır. $a=htmlspecialchars(trim($_GET['id']));
Qeyd : bundan başqa where id=".$i." kimi sorğuları where id='".$id."' kimi yazmaq daha uyğundur
Bunu etdikdən sonra dəyişkən stringə çevriləcək və mysql üçün heç bir təhlükə yaratmayacaq _ Əgər sizin dəyişkəndə yalnız rəqəmlər olacaqsa $a=intval($_GET['id']); yazmaq kifayət edər yuxarıdakı kodu hər dəyişkəndə etdikdə uzun ola bilər buna görə funksiya yazaq

//mysql sorğusudursa function antisql($antihucum){

return htmlspecialchars(trim(mysql_real_escape_string($an tihucum)));

} //mysql sorğusu deyilsə function antimethod($antihucum){

return htmlspecialchars(trim(strip_tags($antihucum)));

}
bu zaman sadəcə $a=antisql($a); yazmağımız kifayətdir kodu yoxlayaq


Gördüyümüz kimi heç bir xeta yoxdur açıq bağlandı.