سلامی دوباره به شما امنیت دوستان عزیز! 😊 در ایستگاه پایانی دوره آموزشی LFI همراه شما هستیم تا نحوه دور زدن پاک سازی انجام شده در ورودی را با هم بررسی کنیم و آخرین قطعه پازل LFI را تکمیل کنیم! 😉
همانطور که در اپیزودهای قبلی دوره تا حدودی مشاهده کردید ورودی که به یک وبسایت میدهیم همیشه به صورت خام مورد استفاده قرار نمیگیرد و ممکن است خود وبسایت چیزی به آن اضافه یا کم کند. به عنوان مثالی از اضافه کردن میتوان به اضافه کردن پسوند .php، در نمونه کد موجود در قسمت 4 ام این دوره اشاره کرد. درباره کم کردن، مثالهای متنوعی میتوان اشاره کرد اما مهمترین نوع از تغییر کم کردن را، میتوان پاک سازی ورودی یا Sanitization در نظر گرفت. در این نوع از عملیات عبارت ها یا کاراکترهای خطرناک از ورودی خام حذف شده و سپس ورودی پردازش شده مورد استفاده قرار میگیرد. برای مثال اگر زمانی در یک وبسایت آسیب پذیر به LFI در متغیر ورودی عبارت ../ را وارد کردید و پس از بارگذاری صفحه مشاهده کردید که عبارت ../ حذف شده یا کارایی نداشته است ممکن است شما با یک Sanitizer در کد نرمافزار مواجه باشید که این عبارت را حذف میکند. بسته به نوع پیاده سازی پاک سازی ورودی میتوان روش های مختلفی را برای دور زدن آن کشف کرد. اگر علاقه مند به دانستن روش های دور زدن این نوع محدودیت هستید در ادامه با ما همراه باشید تا چندین نمونه از این روش ها را با هم بررسی کنیم! 😉
تکنیک های عمومی
1. فرض کنید که فایل آسیب پذیر به LFI به /.. حساس باشد و آن را حذف کند در این صورت برای دور زدن این روش میتوانیم از عبارت //.... استفاده کنیم که با حذف شدن عبارت /.. از وسط آن، باقی مانده برابر با /.. است که خواسته ما را برآورده میکند.
2. روش دوم برای دور زدن حذف شدن عبارت /.. ، استفاده از عبارت /./... است که با حذف عبارت /.. از وسط آن دوباره عبارت /.. ایجاد میشود.
3. برای سیستمهای ویندوزی روش های بالا همانگونه که گفته شد قابل انجام هستند با این تفاوت که به جای / باید \ بگذاریم.
4. در برخی موارد استفاده از url encoding هم جواب میدهد.
تکنیک دور زدن پاک سازی ورودی در nodejs
فرض کنید که کدی مانند زیر داشته باشیم که در حال فیلتر کردن .. است و نسخه nodejs مورد استفاده پایین تر از 10 باشد.
if(path.indexOf("..") == -1 ){
//Somthing Cool
}else{
res.writeHead(403);
res.end("WHOA THATS BANNED!!!!");
}
}
در این صورت به جای نقطه میتوانیم از کاراکتر N لاتین استفاده کنیم. کد unicode این کاراکتر برابر با \xFF\x2E است. دلیل به وجود آمدن این روش، یک ایراد در URL Parser خود Nodejs بوده است که باعث میشده وقتی از کاراکتر N لاتین استفاده میکردیم بخش اول آن یعنی \xFF حذف شود و بقیه آن یعنی \x2E که معادل کد نقطه است باقی بماند که برای ما امکان گذاشتن دو نقطه پشت سر هم را با قرار دادن دو کاراکتر N لاتین فراهم کند. نام کاراکتر N لاتین FULLWIDTH LATIN CAPITAL LETTERاست که با جستجو در گوگل میتوانید جزئیات بیشتری راجع به این کاراکتر پیدا کنید. نمونهای از کاراکتر:
N
خلاصه ای از مشخصات کاراکتر ذکر شده را در تصویر زیر میتوانید مشاهده کنید.
دلیل ذکر کردن نسخه پایین تر از 10 در مورد این آسیب پذیری، رفع شدن مشکل بخش URL Parser در نسخههای بالای 10 است.
در این نقطه از این قسمت دوره، خط پایان از رگ گردن به شما نزدیکتر است! 😊 در این قسمت آموختیم که ممکن است اجزایی در کد یک نرمافزار تحت وب وجود داشته باشد که کار پاک سازی و حذف عبارت های خطرناک از ورودی را انجام دهد و همینطور آموختیم که چگونه میتوان این محدودیت ها را دور زد. البته توجه داشته باشید که این مدل دور زدن بسته به نوع کد نوشته شده ممکن است کارامد نباشد! بهترین راه برای یافتن روش دور زدن این محدودیت در مورد یک کد خاص، داشتن دسترسی مشاهده کد منبع یا تست رفتار آن و یافتن نقطه کور در پیاده سازی است! 😉
اگر شما هم راه حل جدید و بهتری برای دور زدن این نوع محدودیت ها دارید حتما در قسمت نظرات با ما در میان بگذارید! تا دورهای دیگر بدرود! 😊