3 – amaliy ish Mavzu: OWASP WebGoat simulyatorida SQL ineksiya tahdidini amalga oshirish Ishdan maqsad: Ma’lumotlar ba’zalariga bo‘ladigan SQL – ineksiya tahdidi haqidagi nazariy va amaliy bilim ko‘nikmalarni shakllantirish Nazariy qism SQL ineksiya tahdidi ma’lumotlar bazasiga tegishli bo‘lgan tahdid bo‘lib, SQL so‘rovlarga taqiqlangan belgilarni kiritish va buning natijasida ma’lumotlar bazasida boshqa natija olishga qaratilgan. Bu tahdid turi eng ko‘p uchraydigan tahdid turi bo‘lib, uning hajmi yildan – yilga ortib bormoqda. Sodda misol. Bu tahdidni tushunish uchun quyidagi sodda hayotiy misolni keltiraylik. “Alining otasi onasiga Aliga 100$ pul berish kerakligini yozib maktub qoldirdi.” Bu gapni SQL so‘rovi shaklida ifodalansa quyidagicha bo‘ladi: “cho‘ntagimdan 100$ OL VA HAMMASINI BER ALIGA”. Qoldirilgan maktubni Alining akasi Vali ko‘rib qoldi. Vali bo‘lg‘usi xaker bo‘lganligi uchun, qoldirilgan maktubga “YoKI VALIGA” deb qo‘shib qo‘yadi. Ona kelib maktubni oladi va kecha Aliga pul berganligi uchun pulni Valiga beradi. Bu SQL ineksiya tahdidiga bir hayotiy misol. Ona qoldirilgan maktubni filterlamaslik natijasida pulni Valiga berib yubordi. SQL ineksiyaning 5 ta asosiy sinfi mavjud: UNION query SQL injection. Ushbu tur ineksiyaning klassik ko‘rinish bo‘lib, bundan so‘rov “UNION ALL SELECT” dan takshil topgan bo‘ladi. Bu turdagi ineksiya SELECT dagi natija to‘g‘ridan – to‘g‘ri qaytarilganda yuzaga keladi. Error-based SQL injection. Bu holda skaner tekshirish davomida zaif belgini almashtirish yoki qo‘shgan vaqtda yuzaga keladi va ma’lumotlarni boshqarish tizimlarida xatolik yuz berganda foydalaniladi. Stacked queries SQL injection. Bu turdagi ineksiyada SELECT komandasidan tashqari buyruqlar (INSERT yoki DELETE) foydalanilgan holda va HTTP so‘rovlarini tekshirish jarayonida nuqtali vergul (;) bilan almashtirish sodir bo‘lganda yuzaga keladi. Boolean-based blind SQL injection. Ushbu turdagi ineksiya “ko‘r” ineksiya deb atalib, ma’lumotlar bazasidan zaiflik yaqqol ko‘rinmagan holda foydalaniladi. Bunda sintaktik to‘g‘ri bo‘lgan so‘rovlarni kiritish orqali qaytarilgan mantiqiy javobga asoslanib natija aniqlanadi. Time-based blind SQL injection. Bu to‘liq “ko‘r” ineksiya bo‘lib, unda so‘rovda quyi so‘rov kiritiladi va bu so‘rov ma’lumotlar ba’zasini boshqarish tizimining ishini bir muncha to‘xtatib turadi (SLEEP() yoki BENCHMARK()). Bu tahdid asosan taqiqlangan belgilarni tekshirmaslik natijasida kelib chiqadi. Quyida ushbu zaiflikni o‘z ichiga olgan SQL so‘rovi keltirilgan: statement = "SELECT * FROM users WHERE name = '" + userName + "';" Bu so‘rovga asosan aynan kerakli foydalanuvchi nomi ma’lumotlar bazasidan qidirilmoqda. Agar bu so‘rov buzg‘unchi tomonidan userName o‘rniga ' OR '1'='1 kiritilsa, quyidigi so‘rov hosil bo‘ladi: SELECT * FROM users WHERE name = '' OR '1'='1'; Natijada ma’lumotlar bazasidan barcha foydalanuvchilar to‘g‘risidagi ma’lumotlar chiqariladi. Bu yerda quyidagi taqiqlangan belgilar birikmasidan ham foydalanish mumkin. ' OR '1'='1' -' OR '1'='1' ({ ' OR '1'='1' /* Bu tahdidlarni oldini olishda kiruvchi so‘rov maxsus belgilarga tekshirilishi kerak. Ammo, bu so‘rovlarni kundan-kunga yangi turlari kelib chiqmoqda. So‘rovlarni SQL ineksiyaga zaifligini tekshirish 1. Buning uchun ma’lumot bazasi yaratib, unda sodda jadvallar yaratamiz. Masalan, “news” nomli jadval yaratib unga “id” nomli ustun qo‘shing. Quyidagi sodda so‘rov jadvaldan berilgan id tegishli ma’lumotni qaytaradi. $id = $_GET['id']; $query = "SELECT * FROM news WHERE id=$id"; Ushbu so‘rov SQL ineksiyaga tekshirilmagan bo‘lib, uni tekshirish uchun quyidagi so‘rovni kiritamiz: sqlinj/index1.php?id=1' agar ushbu buyruq kiritilganda xatolik yuz bersa demak zaiflik mavjud bo‘ladi. Xatolik yuz bersa demak zaiflikga qarshi tekshirilgan yoki xatolikni ko‘rsatish o‘chirib qo‘yilgan. 2. Qator kiritilganda mavjud xatolikni aniqlash uchun ham yuqoridagi kabi so‘rovni qator tipidagi ustun uchun kiritish zarur. $user = $_GET['user']; $query = "SELECT * FROM news WHERE user='$user'"; Quyidagi so‘rovni kiritish orqali uni aniqlash mumkin: sqlinj/index1.php?user=hacker' 3. SQL tilida kommentariyaga olish “--” belgisi bilan amalga oshiriladi. Ushbu belgini oldidan va orqasidan probel bo‘lishi zarur. URL manzillarda probel “%20” kabi ifodalanadi. SELECT * FROM news WHERE user='hacker' -- blablabla URL da ifodasi sqlinj/index1.php?user=hacker'%20--%20 blablabla 4. UNION buyrug‘idan foydalanish orqali maydonlar sonini bilish mumkin. sqlinj/index1.php?id=1 UNION SELECT 1,2 xatolik sqlinj/index1.php?id=1 UNION SELECT 1,2,3 xatolik yuq demak ustunlar soni 3 ga teng. 5. GROUP BY dan foydalangan holda ustunlar sonini aniqlash. sqlinj/index1.php?id=1 GROUP BY 2 Amaliy qism 1. Mantiqiy “ko‘r” ineksiyani yaratish. Buning uchun Owaspweb Goat simulyatoridan foydalaniladi. Dastlab siqilgan faylni oching (WebGoat-OWASP_Standard-5.2.zip) 4.1-rasm. WebGoat-OWASP_Standard-5.2.zip –Run webgoat.bat (or webgoat_8080.bat) ishga tushuriladi 4.2-rasm. webgoat_8080.bat –http://localhost/WebGoat/attack (ixtiyoriy brauzer orqali ko‘rsatilgan linkga murojat qilinadi ) 4.3-rasm. http://localhost/WebGoat/attack Id = guest, pw = guest so‘zini kiritamiz va natijada quyidagi oyna paydo bo‘ ladi: 4.3-rasm. Umumiy oyna Start WebGoat tugmasi orqali quyidagi oyna paydo bo‘ladi, bu yerda kirish, umumiy qoidalar, ruhsatlarni boshqarish qoidalari, injection qoidalari va boshqa qismlardan iborat. Injection Flaws tugmasini bosish orqali uning tarkibiy element funksiyalarini ko‘rishimiz mumkin bo‘ladi. 4.4-rasm. Injection Flaws 4.1-jadval Injection flaws tarkibiy element funksiyalari Command Injection Blind SQL Injection Numeric SQL Injection Log Spoofing XPATH Injection LAB: SQL Injection Stage 1: String SQL Injection Stage 2: Parameterized Query #1 Stage 3: Numeric SQL Injection Stage 4: Parameterized Query #2 String SQL Injection Database Backdoors Blind SQL Injection quyidagi oyna hosil bo‘ladi va u yerga first_name kattalining uzunligi 6 ga teng bo‘lga ismni toppish talab etiladi, toppish uchun 101 and ((select ascii(substr(first_name,1,1)) from user_data where userid = 15613) >= 74) and ((select ascii(substr(first_name,1,1)) from user_data where userid = 15613) <= 74) so‘rovini kiritamiz qachonki shartni qanolatlantigunga qadar davom etadi. 4.4-rasm. So‘rov kiritish jarayoni Yuqoridagi so‘rovdan foydalanib, 15613 raqamli foydalanuvchini first_name ni toping (http://138.25.67.99/AsciiTable.html). 4.5-rasm. ASCII jadvali 2. Qatorli SQL ineksiya. Bu vazifa uchun ham Owaspweb Goat simulyatoriidan foydalaniladi. - Fayl ochiladi –Run webgoat.bat (or webgoat_8080.bat) –http://localhost/WebGoat/attack –Id = guest –pw = guest - “Tamper Data” plagini Mozilla Firefox uchun o‘rnatiladi va “Tools” menyusi orqali sinab ko‘riladi. - Shundan so‘ng “Injection flaws”→”Lab: SQL injection”→”Stage 1:String SQL Injection” tanlanadi. - Bu sahifadan vazani aniqlang va Mozilla Firefox ning “Tools” menyusidan “Tamper Data” bandini tanlab “Start Tamper”tugmasini bosing. - webgoat muhitidan “Neville Bartholomew (admin)” login sifatida tanlab, parol bandigi ochiq qoldirib Login tugmasini bosing. Quyidagi oyna ko‘rinadi. 4.6 – rasm. Tamper Data oynasi - Bu oynadan siz parol sohasi bo‘shligini ko‘rishingiz mumkin va bu yerda SQL ineksiyaga olib keluvchi kodni kiriting. - Tahdidni amalga oshirish orqali ('Neville') qayd yozuviga to‘g‘ri parolni bilmasdan kirib ko‘ring. - Foydalangan SQL – so‘rovni hisobotga qayd eting. Topshiriq Yuqoridagi so‘rovdan foydalangan holda 15613 raqamli foydalanuvchini first_name (ism)ni toping. Nazorat savollari 1. SQL ineksiya nima va uning turlari. 2. Qanday qilib bu tahdiddan himoyalanish mumkin. 3. Bu turdagi tahddilar axborot xavfsizligiga zarar yetkazish imkoniyati qanday.