SQL-Injection

SQL-Injection


SQL-Injection – bu ma’lumotlar bazasiga qilingan so‘rovni qalbakilashtirish, ya’ni dasturchi e’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 bir saytda foydalanuvchini kirish formasi bo‘lsin, foydalanuvchini ro‘yxatda mavjudligi va paroli quyidagi auth.php faylidagi kod yordamida tekshirilsin:

auth.php:

$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:

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:

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 ixtiyoriy 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‘ladi SQL 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.


Report Page