SQL injection

SQL injection


SQL-Injection – bu ma’lumotlar bazasiga qilingan so’rovni qalbakilashtirish, ya’ni dasturchie’tiborsizligi natijasida kiritiluvchi ma’lumotlarni filtrlanmasligidan foydalanib, so’rovga o’zgartirish kiritish orqali serverdagi ma’lumotlar bazasiga yo’l topishdir. Ushbu holatni misollarda ko’rib chiqamiz. 

Deylik biror birsaytda foydalanuvchini kirish formasi bo’lsin, foydalanuvchini ruyhatda mavjudligi va paroli quyidagi auth.php faylidagi kodyordamida tekshirilsin: 


auth.php: 

Code


… 

$query = mysql_query("SELECT * FROM users WHERE uname=’".$_POST[‘uname’]."’ AND passwd=’".$_POST[‘passwd’].”’”, $link) or die("Kirish so’rovida xatolik:".mysql_error()); 

… 



Bunda: $_POST[‘uname’] va$_POST[‘passwd’] da foydalanuvchi kiritgan ma’lumotlar (login, parol). 

Biz kirish oynasida login uchun “U2B3K” va parol uchun “k12mSaalI3” ni kiritdik deylik. U holda yuqoridagi kod serverda bajarilganda ma’lumotlar bazasiga quyidagicha so’rov beradi: 


Code

SELECT * FROM users WHERE uname=’U2B3K’ AND passwd=’k12mSaalI3’



Yuqoridagi kodda foydalanuvchi kiritgan ma’lumotlar filtrlanmay, to’g’ridan to’g’ri so’rovda ishtirok etyapti, demak bu yerda SQL-Injection mavjud. 

Endi kirish oynasida login uchun “U2B3K” va parol uchun “k12mSaalI3’ OR ‘1’=’1” ni kiritib ko’ramiz. Endi so’rov quyidagicha o’zgaradi: 


Code

SELECT * FROM users WHERE uname=’U2B3K’ AND passwd=’k12mSaalI3’ OR ‘1’=’1’



Bunda paroldan keyin qo’yilgan “’” belgisidan so’ng parolni tekshirish sharti tugaydi va biz yozgan “OR ‘1’=’1” ham SQL so’rovni davomi bo’lib qoladi. Paroldagi oxirgi 1 dan keyin “’” belgisi qo’yilmaganiga sabab, bu belgi shundoq ham kod ichida qo’yilayotganidir ($_POST[‘passwd’] dan keyin “’” belgisi qo’yilgan). 

Shundoq qilib yuqoridagi so’rovdagi shart har doim bajarilganidan (‘1’=’1’), biz saytga ihtiyoriy nom va parol bilan kirishimiz mumkin bo’ladi.

Bunda SQL dagi “UNION”buyrug’idan foydalanib, so’rovga boshqa so’rovni qo’shish, “INTO OUTFILE” dan foydalanib serverda shell hosil qilish (albatta fayl yaratish uchun foydalanuvchida huquq bo’lishi kerak), biror bir jadvaldagi ma’lumotlarni o’qish, “BENCHMARK” buyrug’idan foydalanib serverni “o’ylantirib”qo’yish (DoS) kabi “yomon” ishlarni qilish mumkin SQL Injection MB bilan ishlovchi barcha joyda bo'lishi mumkin. Biror bir saytda SQL Injection bor yo'qligini bilish uchun http://xxxxxx.com/index.php?a=1 kabi so'rovda so'rov oxiriga "'" belgisi qo'yilsa xatolik yuz bersa, yoki http://xxxxxx.com/index.php?a=3-2 deb so'rov berilganda http://xxxxxx.com/index.php?a=1dagi natija chiqsa SQL Injection bo'lishi ehtimoli bor, bunda kirtiluvchi parametrlar filtlanmayotgan bo'ladiSQL Injection ni oldini olish uchun kiruvchi parametrlarni filtrlash, ya'ni undan maxsus belgilarni o'chirish, agar parametr sonli qiymat bo'lsa uni songa aylantirib olish kerak

_________________________________________________________________

SQL injection - bu koderlarni birorbir skript yozishda yo'l qo'ygan xatolaridir. Bukichkinagina sql injection ya'ni inyeksiya orqali saytni odam ko'rib bo'lmaydigan axvolga solib tashlash mumkin. Ushbuxatodan foydalangan xolda ma'lumotlar bazasiga ba'zi bir buyruqlarni berish mumkin. Mashxur skriptlar baza bilan ishlahi va barcha ma'lumotlar bazaga yozilishini hisobga olsak agar ushbu xatodan foydalansa u sayt tamom bo'ladi.


Endi sql inyeksiya haqida yaqinroq tanishamiz.

Misol uchun bizda mana bunday kod bor:


<?php 


... 


$id = $_GET['id']; 


... 


mysql_query("UNION SELECT nick FROM users WHERE id=".$id);..... 


?> 


Bu skriptda bazadan id o'zgaruvchisi bo'yicha so'rov yuboradi. Bu oddiy kod bo'lgani uchun ungga yaxshilab qarasak filtrlash funksiyasi yo'q va biz o'zgaruvchini o'zimizni foydamizga o'zgartirishimiz mumkin. Agar ID o'zgaruvchisi filtrlanmasa biz bazaga xoxlagan so'rovimizni yuborishimiz mumkin. Mana shu MySql inyeksiya deyiladi.

Sql injectionni qanday aniqlasa bo'ladi ?


Masalan: site.uz/index.php?page=1 ni misol qilib olamiz. Sql inyeksiyani ko'pincha bittaliq qo'shtirnoq bilan tekshirishadi: site.uz/index.php?page=1' Agar url ga shuni yozsakva usha saytda qandaydir xatolik bo'lsa mana bunday xato chiqadi:


MySQL Error: mysql_query(.......) error expretion syntax...


2-yo'l:


Agar skriptda error_reporting(0) turgan bo'lsa yoki o'zgaruvchi filtrlansa bizga tepadagi xato ko'rsatilmaydi. Unda biz nima qilamiz ? Buni yo'li oson


http://www.site.ru/index.php?page=2-1


ni teramiz. Agar shundan keyin sizga yana http://www.site.ru/index.php?page=1 sahifasi ochilsa unda bu yerda 99% inyeksiya bor

Bu mavzuni ochishdan maqsad agar saytingiz qandaydir yanmgi chiqqan beta versiyalicms da ishlasa uni har xil inyeksiyalarga tekshirish lozim. Agar tekshirilmasa u holda saytingiz bilan sekin asta xayrlashaverasiz.

Report Page