Ushbu bo'limda quyidagilarni tushuntiramiz:
Path traversal, shuningdek, directory traversal (katalog bo'ylab o'tish) deb ham ataladi. Bu zaifliklar hujumchiga ilova ishlab turgan serverdagi ixtiyoriy fayllarni o'qish imkonini beradi. Bunga quyidagilar kirishi mumkin:
Ba'zi hollarda hujumchi serverdagi ixtiyoriy fayllarga yozishi ham mumkin — bu esa unga ilova ma'lumotlari yoki xatti-harakatini o'zgartirishga va, oxir-oqibat, server ustidan to'liq nazorat olishga imkon beradi.
Sotuvdagi mahsulotlar rasmlarini ko'rsatadigan onlayn-do'kon ilovasini tasavvur qiling. U rasmni quyidagi HTML orqali yuklashi mumkin:
<img src="/loadImage?filename=218.png">Bu yerdagi loadImage URL'i filename parametrini oladi va ko'rsatilgan faylning mazmunini qaytaradi. Rasm fayllari diskda /var/www/images/ joyida saqlanadi. Rasmni qaytarish uchun ilova so'ralgan fayl nomini shu asosiy katalogga qo'shadi va fayl tizimi API'sidan foydalanib faylni o'qiydi. Ya'ni ilova quyidagi fayl yo'lidan o'qiydi:
/var/www/images/218.pngBu ilovada path traversal hujumlariga qarshi hech qanday himoya yo'q. Natijada hujumchi serverning fayl tizimidan /etc/passwd faylini olish uchun quyidagi URL'ni so'rashi mumkin:
https://insecure-website.com/loadImage?filename=../../../etc/passwdBu ilovani quyidagi fayl yo'lidan o'qishga majbur qiladi:
/var/www/images/../../../etc/passwd../ ketma-ketligi fayl yo'lida haqiqiy (valid) hisoblanadi va katalog tuzilmasida bitta daraja yuqoriga ko'tarilishni bildiradi. Ketma-ket kelgan uchta ../ /var/www/images/ dan fayl tizimining ildiziga (root) ko'tariladi, shuning uchun aslida o'qiladigan fayl:
/etc/passwdUnix asosidagi operatsion tizimlarda bu serverda ro'yxatdan o'tgan foydalanuvchilar tafsilotlarini o'z ichiga olgan standart fayl, lekin hujumchi xuddi shu usul bilan boshqa ixtiyoriy fayllarni ham olishi mumkin.
Windows'da ../ ham, ..\ ham haqiqiy directory traversal ketma-ketliklaridir. Quyida Windows asosidagi serverga qarshi ekvivalent hujum misoli keltirilgan:
https://insecure-website.com/loadImage?filename=..\..\..\windows\win.iniFoydalanuvchi kiritmasini fayl yo'llariga joylaydigan ko'p ilovalar path traversal hujumlariga qarshi himoya joriy qiladi. Biroq bularni ko'pincha chetlab o'tish mumkin.
Agar ilova foydalanuvchi bergan fayl nomidan directory traversal ketma-ketliklarini olib tashlasa yoki bloklasa, bu himoyani turli usullar bilan chetlab o'tish mumkin bo'lishi mumkin.
Fayl tizimi ildizidan boshlanadigan absolute path (mutlaq yo'l) ishlatib, hech qanday traversal ketma-ketligisiz faylga to'g'ridan-to'g'ri murojaat qila olishingiz mumkin, masalan filename=/etc/passwd.
Ichma-ich (nested) traversal ketma-ketliklaridan, masalan ....// yoki ....\/ dan foydalana olishingiz mumkin. Ichki ketma-ketlik olib tashlanganda, bular oddiy traversal ketma-ketligiga qaytadi.
Ba'zi kontekstlarda, masalan URL yo'lida yoki multipart/form-data so'rovining filename parametrida, veb-serverlar kiritmangizni ilovaga uzatishdan oldin har qanday directory traversal ketma-ketligini olib tashlashi mumkin. Bunday sanitizatsiyani ba'zan ../ belgilarini URL-kodlash yoki hatto ikki marta URL-kodlash orqali chetlab o'tish mumkin. Bu mos ravishda %2e%2e%2f va %252e%252e%252f ni beradi. Turli nostandart kodlashlar, masalan ..%c0%af yoki ..%ef%bc%8f ham ishlashi mumkin.
Burp Suite Professional foydalanuvchilari uchun Burp Intruder oldindan tayyorlangan Fuzzing - path traversal payload ro'yxatini beradi. Unda siz sinab ko'rishingiz mumkin bo'lgan bir nechta kodlangan path traversal ketma-ketligi bor.
Ilova foydalanuvchi bergan fayl nomi kutilgan asosiy papkadan, masalan /var/www/images dan boshlanishini talab qilishi mumkin. Bunday holatda kerakli asosiy papkani, so'ng mos traversal ketma-ketliklarini kiritish mumkin bo'lishi mumkin. Masalan: filename=/var/www/images/../../../etc/passwd.
Ilova foydalanuvchi bergan fayl nomi kutilgan fayl kengaytmasi, masalan .png bilan tugashini talab qilishi mumkin. Bunday holatda null bayt yordamida kerakli kengaytmadan oldin fayl yo'lini samarali tarzda tugatish mumkin bo'lishi mumkin. Masalan: filename=../../../etc/passwd%00.png.
Path traversal zaifliklarining oldini olishning eng samarali yo'li — foydalanuvchi bergan kiritmani umuman fayl tizimi API'lariga uzatmaslikdir. Buni qiladigan ko'p ilova funksiyalarini xuddi shu xatti-harakatni xavfsizroq tarzda bajaradigan qilib qayta yozish mumkin.
Agar foydalanuvchi kiritmasini fayl tizimi API'lariga uzatishdan qochib bo'lmasa, hujumlarning oldini olish uchun ikki qatlamli himoyadan foydalanishni tavsiya qilamiz:
Quyida foydalanuvchi kiritmasi asosida faylning kanonik yo'lini tekshiradigan oddiy Java kodi misoli keltirilgan:
File file = new File(BASE_DIRECTORY, userInput);
if (file.getCanonicalPath().startsWith(BASE_DIRECTORY)) {
// faylni qayta ishlash
}