LFI — web application user ta’sir qila oladigan path yoki file nomini serverdagi local faylni include qilish uchun ishlatganda yuzaga keladigan zaiflik. To‘liq nomi Local File Inclusion. Zaiflik attackerga application serverining lokal filesystemidagi fayllarni o‘qish, ayrim sharoitlarda esa ularning mazmunini interpreter orqali bajarishga olib kelishi mumkin.
LFI ko‘pincha dinamik sahifa, template, til fayli, theme, plugin yoki document loader funksiyalarida uchraydi.
Zaif kod modeli
Application sahifa nomini requestdan olib, to‘g‘ridan-to‘g‘ri pathga qo‘shishi mumkin:
include(base_path + user_value)
Developer about yoki contact kabi qiymat kutadi. Attacker esa path traversal belgilaridan foydalanib boshqa local faylga murojaat qilishga urinadi.
Path Traversal bilan aloqa
Path Traversal serverdagi ruxsat etilmagan fayl yoki directoryga yo‘l topishni anglatadi.
LFI esa topilgan local faylni applicationning include yoki template mexanizmi orqali qayta ishlaydi.
Har LFI path traversalga tayanishi mumkin, ammo har path traversal code include qilmaydi; ba’zan faqat file download yuz beradi.
Local file disclosure
Zaiflik quyidagi turdagi fayllarni oshkor qilishi mumkin:
- application configuration;
- environment ma’lumoti;
- source code;
- log;
- credential file;
- OS account ma’lumoti;
- private key;
- container secret;
- session storage.
Process faqat o‘z permissioni yetgan fayllarni o‘qiy oladi.
Path normalization
Path ichidagi:
kabi holatlar noto‘g‘ri validationni chetlab o‘tishi mumkin.
Path bir marta ishonchli library bilan canonical ko‘rinishga keltiriladi va ruxsat etilgan root ichida qolishi tekshiriladi.
Allowlist
Userdan to‘liq file path olish o‘rniga logical key qabul qilinadi.
Masalan:
page=about
server ichida:
about → templates/about.html
mapping ishlatiladi.
User ixtiyoriy path, extension yoki directory tanlamaydi.
Extension qo‘shish
Ba’zi application user qiymatiga avtomatik extension qo‘shadi:
value + ".html"
Bu himoya sifatida yetarli emas.
Parser, null byte tarixiy xatolari, wrapper yoki normalization farqlari sabab bypasslar mavjud bo‘lishi mumkin.
Asosiy himoya allowlist.
Include va read farqi
Template engine faylni oddiy text sifatida o‘qishi yoki code sifatida execute qilishi mumkin.
Agar server-side script include qilinsa uning code’i bajarilishi ehtimoli bor.
Oddiy system file code bo‘lmasa ham response orqali oshkor qilinishi mumkin.
Log poisoning
Ayrim sharoitlarda attacker application logiga interpreter tushunadigan matn yozdirib, keyin LFI orqali shu logni include qilishga urinadi.
Bu LFI’ni code executionga aylantirishi mumkin.
Logning execute qilinmaydigan storage’da saqlanishi va user inputning structured yozilishi ta’sirni kamaytiradi.
Upload bilan birga
User upload qilgan fayl serverda saqlanadi va uning pathi taxmin qilinsa LFI orqali include qilinishi mumkin.
Upload validationning o‘zi yetarli emas.
Uploaded file:
- web rootdan tashqarida;
- executable bo‘lmagan storage’da;
- random nom bilan;
- alohida domain yoki object storage’da
saqlanadi.
Session fayli
Ayrim platformalarda session data local file’da saqlanishi mumkin.
Attacker sessionga nazorat qilinadigan qiymat yozib, keyin session faylini include qilishga urinishi mumkin.
Session storage va include root bir-biridan ajratiladi.
Symbolic link
Ruxsat etilgan directory ichidagi symbolic link tashqi sensitive pathga olib borishi mumkin.
Faqat string prefix tekshiruvi yetarli emas.
Resolved real path ruxsat etilgan base directory ichida ekanini tekshirish kerak.
Container muhiti
Container filesystemi hostdan ajratilgan bo‘lsa ham unda:
- application source;
- service token;
- mounted secret;
- config;
- internal certificate
mavjud bo‘lishi mumkin.
LFI container ichidagi bu ma’lumotlarni oshkor qilishi ehtimoli bor.
Error message
Include xatosi serverning to‘liq pathi, framework versiyasi va stack trace’ni ko‘rsatishi mumkin.
Production response’da umumiy xato qaytariladi.
Batafsil error faqat himoyalangan logda saqlanadi.
Himoya
Asosiy choralar:
- file pathni userdan to‘liq olmaslik;
- logical ID va allowlist;
- canonical path tekshiruvi;
- minimal filesystem permission;
- uploaded file’ni ajratish;
- include funksiyasini cheklash;
- template’larni package ichida saqlash;
- errorlarni yashirish.
Test
Security test quyidagilarni tekshiradi:
- traversal;
- encoded separator;
- absolute path;
- symbolic link;
- null va unusual character;
- upload path;
- log file;
- nested directory;
- platformlar orasidagi separator.
Testlar izolyatsiyalangan muhitda bajariladi va real secretlar ishlatilmaydi.
Incident
LFI orqali secret oshkor bo‘lgan bo‘lsa credential va keylar rotation qilinadi. Access loglar qaysi fayllar so‘ralganini aniqlash uchun tekshiriladi. Faqat path validationni tuzatish oldin olingan tokenlarni bekor qilmaydi.
Framework route
Static file yoki template helper framework tomonidan xavfsiz ko‘rinsa ham user pathini qanday normalize qilishi tekshiriladi. Alias, route parameter va locale fallback birgalikda kutilmagan directoryga olib borishi mumkin. Framework update’lari path security tuzatishlarini ham o‘z ichiga oladi.
Windows va Unix
Path separator, drive letter, UNC path va case sensitivity operatsion tizimga qarab farq qiladi. Faqat / belgisi bo‘yicha validation Windowsda yetarli emas. Cross-platform application har supported platformda test qilinadi.
File descriptor
Yuqori xavfli service oldindan ochilgan aniq file descriptor yoki resource package’dan o‘qishi mumkin. Runtime’da arbitrary path ochish imkoniyati berilmaydi. Bu file selection attack surface’ini keskin kamaytiradi.
Bog‘liq tushunchalar
Local File Inclusion, Path Traversal, File disclosure, Template engine, Log poisoning, File upload, Canonical path, Allowlist, RCE, Web security