Ushbu bo'limda oddiy fayl yuklash funksiyalari qanday qilib bir qator yuqori jiddiylikdagi hujumlar uchun kuchli vektor bo'lishi mumkinligini o'rganasiz. Web shell yuklash uchun keng tarqalgan himoya mexanizmlarini qanday chetlab o'tishni ko'rsatamiz — bu sizga zaif serverni to'liq nazorat qilish imkonini beradi.
File upload zaifliklari veb-server foydalanuvchilarga fayllarni nomi, turi, mazmuni yoki hajmi kabi narsalarni yetarlicha tekshirmasdan fayl tizimiga yuklashga ruxsat berganda yuzaga keladi. Bu cheklovlarni to'g'ri joriy qilmaslik hatto oddiy rasm yuklash funksiyasi ham ixtiyoriy va potensial xavfli fayllarni yuklash uchun ishlatilishini anglatishi mumkin — bunga masofaviy kod bajarishga (RCE) imkon beruvchi server tomonidagi skript fayllar ham kiradi.
File upload zaifliklarining ta'siri odatda ikki asosiy omilga bog'liq: vebsayt faylning qaysi jihatini (hajmi, turi, mazmuni) to'g'ri tekshirmasligiga; va fayl muvaffaqiyatli yuklangandan keyin unga qanday cheklovlar qo'yilishiga. Eng yomon holatda faylning turi to'g'ri tekshirilmaydi va server sozlamasi .php va .jsp kabi fayllarni kod sifatida bajarishga ruxsat beradi — bu holda hujumchi web shell vazifasini bajaradigan fayl yuklab, server ustidan to'liq nazoratni qo'lga kiritishi mumkin.
Ochiq xavflarni hisobga olib, real vebsaytlarda fayllarga umuman cheklov qo'ymaslik kamdan-kam uchraydi. Ko'proq hollarda dasturchilar mustahkam deb hisoblagan, lekin aslida buzuq yoki oson chetlab o'tiladigan tekshiruvni joriy qiladi. Masalan, ular xavfli fayl turlarini qora ro'yxatga (blacklist) kiritishi mumkin, lekin fayl kengaytmalarini tekshirishdagi nomuvofiqliklarni hisobga olmaydi.
Server so'rovdagi yo'lni tahlil qilib fayl kengaytmasini aniqlaydi, so'ng uni oldindan sozlangan kengaytma↔MIME turi moslamalari bilan solishtiradi. Keyingisi fayl turi va server sozlamasiga bog'liq: turi bajarilmaydigan bo'lsa (rasm, statik HTML), server fayl mazmunini javobda yuboradi; bajariladigan bo'lsa (masalan PHP) va server shunday sozlangan bo'lsa, u skriptni ishga tushiradi; bajariladigan bo'lsa-yu, lekin server bunga sozlanmagan bo'lsa, odatda xato qaytaradi (ba'zan mazmunni oddiy matn sifatida beradi).
Xavfsizlik nuqtai nazaridan eng yomon holat — vebsayt PHP, Java yoki Python kabi server tomonidagi skriptlarni yuklashga ruxsat berishi va ularni kod sifatida bajarishga sozlangan bo'lishi. Bu serverda o'z web shell'ingizni yaratishni arzimas ish qiladi.
Web shell — hujumchiga to'g'ri endpointga HTTP so'rov yuborish orqali masofaviy serverda ixtiyoriy buyruqlarni bajarishga imkon beruvchi zararli skript.
Masalan, quyidagi PHP bir qatorlik kod serverdan ixtiyoriy fayllarni o'qiy oladi:
<?php echo file_get_contents('/path/to/target/file'); ?>Yanada ko'p qirrali web shell quyidagicha ko'rinishi mumkin — u query parametr orqali ixtiyoriy tizim buyrug'ini uzatishga imkon beradi:
<?php echo system($_GET['command']); ?>HTML forma yuborilganda brauzer odatda multipart/form-data content type bilan ma'lumot yuboradi. Xabar tanasi har bir input uchun alohida qismlarga bo'linadi va har bir qism o'z Content-Type sarlavhasiga ega bo'lishi mumkin. Vebsaytlar fayl yuklashni tekshirishning bir yo'li — shu Content-Type sarlavhasi kutilgan MIME turiga mos kelishini tekshirish. Agar server bu sarlavhaga so'zsiz ishonsa va fayl mazmuni haqiqatan mos kelishini tekshirmasa, bu himoyani Burp Repeater bilan oson chetlab o'tish mumkin.
Ikkinchi himoya chizig'i — tarmoqdan o'tib ketgan skriptlarni serverning bajarishiga yo'l qo'ymaslik. Serverlar odatda faqat o'zi bajarishga sozlangan MIME turidagi skriptlarni ishga tushiradi. Bu sozlama ko'pincha kataloglar orasida farq qiladi. Agar foydalanuvchi fayllari yuklanadigan katalogdan farqli, cheklovlar kuchsizroq katalogga skript yuklashning yo'lini topsangiz, server uni bajarishi mumkin.
Zararli skriptlar yuklashning oldini olishning bir yo'li — .php kabi xavfli kengaytmalarni qora ro'yxatga kiritish. Qora ro'yxat tabiatan buzuq, chunki kod bajara oladigan har bir mumkin kengaytmani bloklash qiyin. Bunday ro'yxatlarni ba'zan .php5, .shtml kabi kam ma'lum kengaytmalar bilan chetlab o'tish mumkin.
Ko'p serverlar kataloglar ichida global sozlamalarni bekor qiladigan maxsus konfiguratsiya fayllarini yaratishga ruxsat beradi. Apache serverlar .htaccess faylini, IIS serverlar esa web.config faylini yuklaydi. Agar server o'zining zararli konfiguratsiya faylini yuklashingizga yo'l qo'ysa, kerakli kengaytma qora ro'yxatda bo'lsa ham, ixtiyoriy kengaytmani bajariladigan MIME turiga bog'lash mumkin.
Hatto eng to'liq qora ro'yxatlarni ham klassik yashirish usullari bilan chetlab o'tish mumkin:
exploit.php.jpg.exploit.php. (ba'zi komponentlar oxiridagi bo'shliq/nuqtani olib tashlaydi).exploit%2Ephp.exploit.asp;.jpg yoki exploit.asp%00.jpg.Boshqa himoyalar xavfli kengaytmani olib tashlaydi yoki almashtiradi. Agar bu rekursiv qo'llanmasa, taqiqlangan satrni shunday joylashtirishingiz mumkinki, uni olib tashlagach ham haqiqiy kengaytma qoladi, masalan exploit.p.phphp.
Xavfsizroq serverlar Content-Typega so'zsiz ishonish o'rniga fayl mazmuni kutilganga mos kelishini tekshiradi. Rasm yuklashda server rasmning o'ziga xos xususiyatlarini (masalan o'lchamlarini) tekshirishი mumkin. Shuningdek, ba'zi fayl turlari sarlavha yoki footerda doim ma'lum bayt ketma-ketligiga ega bo'ladi — masalan JPEG fayllar doim FF D8 FF baytlari bilan boshlanadi. Bu mustahkamroq usul, lekin ExifTool kabi vositalar bilan metama'lumot ichiga zararli kod joylangan polyglot JPEG yaratish arzimas ish.
Zamonaviy freymvorklar fayllarni to'g'ridan-to'g'ri manziliga yuklamaydi — avval vaqtinchalik, izolyatsiyalangan katalogga yuklab, nom beradi, tekshiradi va faqat xavfsiz deb topilgach ko'chiradi. Biroq dasturchilar ba'zan o'z qayta ishlashini joriy qiladilar — bu xavfli race conditionlarni keltirib chiqarishi mumkin. Masalan, ba'zi vebsaytlar faylni to'g'ridan-to'g'ri asosiy fayl tizimiga yuklab, keyin tekshiruvdan o'tmasa o'chiradi. Fayl serverda qisqa vaqt mavjud bo'lgan paytda hujumchi uni bajarishi mumkin.