Bu mavzuda quyidagilarni tushuntiramiz.
Agar siz SQL ineksiya zaifliklari ortidagi asosiy tushunchalarni bilsangiz va haqiqiyga yaqin amaliyot uchun tayyorlangan, zaifliklari mavjud tizimlarda ekspluatatsiya qilishni mashq qilmoqchi bo'lsangiz quyidagi havola orqali laboratoriyalarga kirishingiz mumkin.
SQL ineksiya (SQLi) — bu veb-xavfsizlikka oid zaiflik bo'lib, hujumchiga ilovaning ma'lumotlar bazasiga yuboriladigan so'rovlarga aralashish imkonini beradi. Bu hujumchiga, to'g'ridan to'g'ri olishning imkoni bo'lmagan maxfiy ma'lumotlarni ko'rish imkonini beradi. Masalan bularga, saytda ro'yxatdan o'tgan foydalanuvchilarga tegishli ma'lumotlar yoki vebsaytning o'zi kirishi mumkin bo'lgan boshqa ma'lumotlar bo'lishi mumkin. Hujumchi ko'pincha ushbu ma'lumotlarni o'zgartirishi yoki o'chirib tashlashi mumkin, bu esa vebsaytdagi ma'lumotlarga yoki sayt faoliyatida doimiy o'zgarishlarga olib keladi.
Ba'zi vaziyatlarda hujumchi SQL ineksiya hujumini kuchaytirib, asosiy server yoki boshqa ichki tizim infratuzilmasini buzishi mumkin. Bu ularga DoS hujumlarini amalga oshirish imkonini ham berishi mumkin.
Muvaffaqiyatli amalga oshirilgan SQL ineksiya hujumi quyidagi kabi maxfiy ma'lumotlarga ruxsatsiz kirishga olib kelishi mumkin:
SQL ineksiya hujumlari yillar davomida ko'plab yirik va maxfiy ma'lumotlarni buzilishda qo'llanilgan. Bu hujumlar tashkilotlarning obro'siga jiddiy zarar yetkazgan va davlat organlari tomonidan kompaniyalarga jarimalar solinishiga sabab bo'lgan.
SQL ineksiyani qo'lda aniqlash uchun vebsaytning har bir SQL so'rovi bo'lishi mumkin bo'lgan (foydalanuvchi ma’lumot kiritishi mumkin bo‘lgan har bir joy)ga tizimli payloadlar yuborish orqali aniqlash mumkin. Buning uchun odatda quyidagilarni yuborasiz:
' belgisini yuborish va xatolar yoki boshqa noodatiy holatlar paydo bo'lishini tekshirish.OR 1=1 va OR 1=2 kabi Boolean shartlarini yuborish va vebsayt javobidagi o'zgarishlarni aniqlash.Yoki SQL ineksiya zaifliklarining ko'p turlarini Burp Suite veb-zaiflik skaneri yordamida tez va samarali tarzda aniqlash mumkin.
Ko'pgina SQL ineksiya zaifliklari SELECT so'rovining WHERE qismi ichida paydo bo'ladi. Ushbu turdagi SQL ineksiyani tajribali pentesterlar yaxshi tushunishadi.
Biroq, SQL ineksiya zaifliklari, so'rovning istalgan joyida va har xil so'rov turlarida paydo bo'lishi mumkin.
UPDATE so'rovlarida, yangilanayotgan/o'zgartirilayotgan qiymatlar ichida yoki WHERE qismida.INSERT so'rovlarida, kiritilayotgan qiymatlar ichida.SELECT so'rovlarida, jadval yoki ustun nomlari ichida.SELECT so'rovlarida, ORDER BY qismida.Har xil holatda yuzaga keladigan turlicha SQL ineksiya zaifliklari, hujumlar va usullar mavjud.
Tasavvur qiling, bir online internet do'kon bor, u mahsulotlarni turli kategoriyalarga ajratib ko'rsatadi. Foydalanuvchi 'Gifts' kategoriyasini bosganida, uning brauzeri quyidagi URLga so'rov jo'natadi.
https://insecure-website.com/products?category=GiftsBu esa vebsaytga ma'lumotlar bazasidan tegishli mahsulotlar haqidagi ma'lumotlarni olish uchun quyidagicha SQL so'rov yuborishga majbur qiladi
SELECT * FROM products WHERE category = 'Gifts' AND released = 1SQL so'rovi, ma'lumotlar bazasidan quyidagi ma'lumotlarni berishini so'raydi:
products jadvalidanreleased = 1 bo'lgan*) olreleased = 1 sharti hali chiqarilmagan mahsulotlarni yashirish uchun ishlatiladi. Taxmin qilish mumkinki, chiqarilmagan mahsulotlar uchun released = 0 bo‘ladi.
Veb saytda SQL ineksiya hujumiga qarshi hech qanday himoya vositasidan foydalanilmagan. Bu esa hujumchiga quyidagi hujumni amalga oshirish imkonini beradi:
https://insecure-website.com/products?category=Gifts'--Manabu requestning ma'lumotlar bazasida bajariladigan SQL so'rov:
SELECT * FROM products WHERE category = 'Gifts'--' AND released = 1Muhim jihat shundaki -- belgisi SQLda izoh hisoblanadi, natijada SQL so'rovning qolgan qismi izoh sifatida qabul qilinadi. Ushbu misolda, so'rov endi AND released = 1 shartini o'z ichiga olmaydi. Natijada, barcha mahsulotlar, jumladan, hali chiqarilmagan mahsulotlar ham ko'rsatiladi.
Shunga o'xshash hujum orqali hujumchi ilovani istalgan kategoriyadagi barcha mahsulotlarni ko'rsatishga majbur qilishi mumkin:
https://insecure-website.com/products?category=Gifts'+OR+1=1--Bu requestning ma'lumotlar bazasida bajariladigan SQL so'rovi:
SELECT * FROM products WHERE category = 'Gifts' OR 1=1--' AND released = 1O'zgartirilgan so'rov barcha mahsulotlarni qaytaradi, chunki so'rov category Gifts bo'lgan yoki 1=1 bo‘lgan barcha malumotlarni qaytaradi. 1=1 doimo rost bo'lgani uchun, so'rov barcha mahsulotlarni chiqaradi.
SQL so'roviga OR 1=1 shartini qo'shishda ehtiyot bo'lish kerak. U ko'rinishidan zararsiz tuyulsa ham, ko'plab saytlar bitta so'rovdan olingan ma'lumotlarni bir nechta SQL so'rovlarida ishlatishi mumkin. Agar bu shart UPDATE yoki DELETE so'rovlari ichiga tushsa ma'lumotlarning tasodifiy yo'qolishiga olib kelishi mumkin.
Foydalanuvchilarga username va parol orqali kirishga imkon beradigan sahifani tekshirib ko'ring. Agar foydalanuvchi username qismiga wiener va parolga bluecheeseni yuborsa, dastur quyidagi SQL so'rovni bajarish orqali hisob ma'lumotlarini tekshiradi:
SELECT * FROM users WHERE username = 'wiener' AND password = 'bluecheese'Agar so'rov foydalanuvchi ma'lumotlarini qaytarsa, login muvaffaqiyatli amalga oshadi. Aks holda, u rad etiladi.
Bu holatda, hujumchi istalgan foydalanuvchi sifatida tizimga parolsiz kirishi mumkin. Buning uchun u SQLning izoh operatori -- dan foydalanib, so'rovning WHERE qismidagi parol tekshiruvini olib tashlaydi, Masalan, username sifatida administrator'-- va bo‘sh password yuborilsa, quyidagi so‘rov hosil bo‘ladi::
SELECT * FROM users WHERE username = 'administrator'--' AND password = ''Bu so'rov username maydoni administrator ga teng bo'lgan foydalanuvchini qaytaradi va hujumchini shu foydalanuvchi sifatida tizimga muvaffaqiyatli kiritadi.
Agar ilova SQL so‘rovi natijalarini javobda qaytarsa, hujumchi SQL ineksiya zaifligidan foydalanib ma’lumotlar bazasidagi boshqa jadvallardan ham ma’lumotlarni olishi mumkin. Buning uchun UNION kalit so‘zidan foydalanib, qo‘shimcha SELECT so‘rovini bajarish va uning natijalari asl so‘rov natijasiga qo‘shish mumkin. Masalan, agar ilova foydalanuvchi kiritgan Gifts qiymati bilan quyidagi so‘rovni bajarsa:
SELECT name, description FROM products WHERE category = 'Gifts'Hujumchi quyidagi inputni yuborishi mumkin:
' UNION SELECT username, password FROM users--Natijada ilova mahsulot nomlari va tavsiflari bilan birga barcha foydalanuvchi nomlari va parollarni ham qaytaradi.
SQL ineksiya holatlarining ko‘pida blind (ko'rinmas) zaifliklar bo‘ladi. Bu shuni anglatadiki, ilova o‘z javoblarida SQL so‘rovi natijalarini ham, ma’lumotlar bazasidagi xatolar tafsilotlarini ham qaytarmaydi. Shunga qaramay, blind zaifliklardan ruxsatsiz ma’lumotlarga kirish uchun foydalanish mumkin, ammo bunda ishlatiladigan usullar odatda murakkabroq va bajarish qiyinroq bo‘ladi.
Blind SQL ineksiya zaifliklaridan foydalanishda, zaiflikning tabiati va ishtirok etayotgan ma’lumotlar bazasiga qarab, quyidagi usullardan foydalanish mumkin:
Birinchi bosqichli SQL ineksiya ilova HTTP so‘rovdan kelgan foydalanuvchi inputini darrov olib uni SQL so‘roviga xavfsiz bo‘lmagan tarzda qo‘shganda yuz beradi.
Second-order SQL ineksiyada esa ilova HTTP so‘rovdan kelgan foydalanuvchi yuborgan inputni olib darrov ishlatmaydi, balki keyinroq ishlatish uchun saqlab qo‘yadi. Shu paytda zaiflik bilinmasligi mumkin. Keyin esa boshqa bir so‘rov vaqtida ilova o‘sha oldin saqlangan qiymatni olib, uni SQL so‘roviga xavfsiz bo‘lmagan tarzda qo‘shadi. Shu sababli ikkinchi bosqichli SQL ineksiya saqlanadigan SQL ineksiya deb ham ataladi.
Ikkinchi bosqichli SQL ineksiya ko‘pincha dasturchilar SQL ineksiya zaifliklaridan xabardor bo‘lgan holatlarda yuz beradi. Yani ular bu haqida bilishgani uchun ham requestdan keladigan qiymatni databasega birinchi marta joylash jarayonini xavfsiz bajaradilar. Ma’lumot keyinroq qayta ishlanganda esa, u avval xavfsiz tarzda bazaga yozilgan bo‘lgani uchun zararli so'rov ham xavfsiz deb qabul qilinadi. Aynan shu bosqichda ma’lumot xavfsiz bo‘lmagan tarzda kiritiladi, chunki dasturchi uni ishonchli deb o'ylab xato qiladi.
SQL tilining ayrim asosiy xususiyatlari mashhur database platformalarda bir xil tarzda joriy qilingan. Shu sababli SQL ineksiya zaifliklarini aniqlash va ulardan foydalanishning ko‘plab usullari har xil databaselarda bir xil ishlaydi.
Biroq, keng tarqalgan databaselar orasida ko‘plab farqlar ham mavjud. Bu esa SQL ineksiya zaifliklarini aniqlash va ulardan foydalanishning ayrim usullari turli platformalarda turlicha ishlashini anglatadi. Masalan:
SQL ineksiya zaifligini aniqlaganingizdan so‘ng, ko‘pincha ma’lumotlar bazasi haqida ma’lumot olish foydali bo‘ladi. Bu ma’lumot zaiflikdan foydalanishda yordam berishi mumkin.
Siz databasening versiyasini so‘rab olishingiz mumkin. Database turiga qarab versiyani aniqlash usuli ham turlicha ishlaydi. Bu shuni anglatadiki, agar ma’lum bir SQL ineksiya usuli ishlasa, undan ma’lumotlar bazasi turini bilib olish mumkin. Masalan, Oracle’da quyidagi so‘rovni bajarish mumkin:
SELECT * FROM v$versionShuningdek, ma’lumotlar bazasida qanday jadvallar borligi va ular qaysi ustunlarni o‘z ichiga olishini ham aniqlash mumkin. Masalan, ko‘p ma’lumotlar bazalarida jadvallar ro‘yxatini olish uchun quyidagi so‘rovni bajarish mumkin:
SELECT * FROM information_schema.tablesOldingi laboratoriyalarda siz zararli SQL payloadni yuborish uchun stringli query dan foydalandingiz. Biroq, foydalanuvchi yuborgan har qanday ma'lumot ilovada SQL query sifatida ishlatiladigan holatda ham SQL ineksiya hujumlarini amalga oshirish mumkin. Masalan, ayrim veb-saytlar JSON yoki XML formatidagi ma'lumotni qabul qiladi va undan ma’lumotlar bazasini so‘rash uchun foydalanadi.
Bu kabi turli usullar WAF va boshqa himoya mexanizmlari tomonidan bloklanadigan hujumlarni yashirish uchun sizga har xil yondashuv usullarini berishi mumkin. Yetarlicha himoyalanmagan tizimlar ko‘pincha query ichidan SQL ineksiya bilan bog‘liq odatiy kalit so‘zlarni qidiradi, shu sababli taqiqlangan kalit so‘zlardagi belgilarni kodlash yoki escape qilish orqali bu filtrlarni chetlab o‘tish mumkin. Masalan, quyidagi XML asosidagi SQL ineksiya SELECT so‘zidagi S harfini kodlash uchun XML escape sequence’dan foydalanadi:
<stockCheck>
<productId>123</productId>
<storeId>999 SELECT * FROM information_schema.tables</storeId>
</stockCheck>Bu qiymat server tomonida decode qilinadi, so‘ng SQL interpretatorga uzatiladi.
SQL ineksiyaning oldini olish uchun, foydalanuvchi yuborgan ma’lumotni SQL query ichiga to‘g‘ridan-to‘g‘ri qo‘shishdan ko'ra, parametrli so‘rovdan foydalanish kerak. Bunday querylar prepared statements deb ham ataladi.
Quyidagi kod SQL ineksiyaga zaif, chunki foydalanuvchi yuborgan ma’lumot queryga to‘g‘ridan-to‘g‘ri qo‘shib ishlatilgan:
String query = "SELECT * FROM products WHERE category = '"+ input + "'";
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(query);Bu kodni foydalanuvchi yuborgan ma’lumot query tuzilishiga tasir qilolmaydigan qilib qayta yozish mumkin:
PreparedStatement statement = connection.prepareStatement("SELECT * FROM products WHERE category = ?");
statement.setString(1, input);
ResultSet resultSet = statement.executeQuery();Parametrli so'rovlarni foydalanuvchi yuborgan ma’lumot SQL query qiymat sifatida ishlatilishi mumkin bo'lgan barcha joylarda foydalanish mumkin. Bunga WHERE, INSERT yoki UPDATE lar misol bo'lad oladi.
Lekin ularni queryning boshqa qismlarida, masalan jadval nomi, ustun nomi yoki ORDER BY qismida keladigan ishonchsiz ma’lumot uchun ishlatib bo‘lmaydi. Ilova foydalanuvchi yuborgan ma’lumotni so‘rovning bu qismlariga qo‘shib ishlatadigan bo‘lsa, boshqa usul tanlash kerak. Masalan:
Parametrli so‘rov SQL ineksiyadan samarali himoya qilishi uchun, so‘rovning o‘zi har doim kod ichida aniq yozilgan o‘zgarmas string bo‘lishi kerak. U hech qachon hech qayerdan kelgan o‘zgaruvchan ma’lumotni o‘z ichiga olmasligi kerak. Qaysi ma’lumot ishonchli, qaysi biri ishonchsizligini har safar alohida hal qilib, “xavfsiz ko‘ringan” holatlarda yana stringlarni qo‘shib so‘rov tuzishga o‘tib ketmang. Bunday joyda xato qilish juda oson. Bundan tashqari, boshqa koddagi o‘zgarishlar oldin ishonchli deb qaralgan ma’lumotni ham xavfli holatga keltirib qo‘yishi mumkin.