خب حالا ديگه بريم سر مبحث پيمايش دايرکتوري فقط به مطلب زير توجه کنيد که خيالم راحت بشه ! ما شانس نداريم يکي مياد خر ما رو ميچسبه !
» مسئوليت استفاده نا صحيح از مطالب اين قسمت به عهده ي خود کاربر هست «مطالب فقط براي اين گفته ميشه که دوستان از اشکالات موجود در برنامه هاشون مطلع بشن ! چون هر روز تعداد زيادي از سايت هاي ايراني توسط چيني ها هک ميشه و در zone h ثبت ميشه !
حالا بريم سر اصل مطلب :
اصل مطلب از اينجا شروع ميشه که يکي از خفن ترين آسيب پذيري ها همون آسيب پذيري پيمايش دايرکتوري هست که نفوذگر با استفاده از اين آسيب پذيري ميتونه فايل هاي مهمي که اجازه ي خوندن و نوشتن اونها رو نداره , با استفاده از اين آسيب پذيري بهشون دست پيدا کنه و کنترل کامل سرور رو در اختيار بگيره !
از جمله فايل Passwd در لينوکس يا فراخواني cmd در ويندوز !
خوب حالا اين آسيب پذيري چجوري به وجود مياد ؟
حتما" همه از اين تابع ها در برنامه هامون استفاده ميکنيم :
کد:
• Require()
• Require_once()
• Include_once()
• Include()
• Fopen()
• File_get_contents()
• More …
اين تابع ها همون تابع هايي هستن که با مقدار دهي نامناسب ميتونه بستري مناسب براي اين نوع حملات ايجاد کنه !
چطور ؟ براي اينکه به جواب چطور برسيد باقي مطلب رو بخونيد :
اين توابع يک آرگومان به عنوان ورودي دريافت ميکنن و مقدار مشخص شده در آرگومان رو فرا خواني ميکنن
به عنوان مثال همه براي اينکه دستورات sql رو هر دفه توي برنامه هامون ننويسيم اونها رو توي يه فايل config مينويسيم و توي برنامه هامون include ميکنيم
فکر کنم کاملا" واضح باشه اگه جايي نياز به توضيح بيشتر داره تذکر بديد تا بگم
حالا نحوه ي عملکرد آسيب پذيري رو براتون ميگم
اين نوع آسيب پذيري ها بيشتر در مقادير کوکي ها ديده ميشن !
به عنوان مثال قالبي که کاربر بعد از ورود به سايت براي خود انتخاب ميکند و يا نوع زبان کاربر ! همه ي اينها توي کوکي ها ذخيره ميشن تا دفعات بعد که کاربر وارد شد بتونه از خصوصي سازي قبليش استفاده کنه
به مثال زير نگاه کنيد :
کد:
<?
$template = 'yourtempl.php’;
if (is_set($_COOKIE['TEMPLATE']))
$template = $_COOKIE['TEMPLATE'];
include ( "/home/templates/" . $template );
?>
خوب کاربر بعد از ورود به سايت و انتخاب قالب دلخواه نام قالب درون متغير $template قرار ميگيره و باعث ميشه که نام قالب درون کوکي ذخيره بشه تا دفعه ي بعدي که وارد سايت شد بدون نياز به انتخاب مجدد قالب سايت رو با قالب دلخواه خودش ببينه !
و براي زبان هم ميشه به اين صورت نوشت دقت کنيد :
کد:
<?
if($_COOKIE["language"]) {
$llang = $_COOKIE["language"];
}
else
{
$l_array = explode("-",$lang_array[0]);
$llang = $l_array[0];
setcookie("language",$llang,time()+1209600,"","","");
}
include("/home/lang/".$llang.".php");
?>
حالا بگم چطور از اين طور مقدار دهي ها ميشه سو استفاده کرد !
در مثال انتخاب زبان , بعد از بررسي کوکي ها متوجه ميشيم که کوکي ها به اين صورت ذخيره ميشن
کد:
language
en
to
language
En
با برسي کوکي ها و دقت روي کد هاي نوشته شده در مثال انتخاب زبان متوجه ميشيم که صفحه با برسي کوکي ها و اضافه کردن پسوند php به مقدار ذخيره شده به عنوان کوکي , صفحه مربوط به زبان کاربر رو فراخواني ميکنه ! مثلا" با بررسي و گرفتن en و اضافه کردن پسوند Php صفحه ي en.php رو به عنوان زبان سايت با استفاده از تابع include فراخواني ميکنه حالا اگه ما مقدار کوکي رو به fa تغيير بديم اونوقت صفحه ي fa.php رو به عنوان زبان سايت فراخواني ميکنه !
خوب با استفاده از اين حفره ما ميتونيم ساير فايل هاي موجود در دايركتوري كه بهشون دسترسي نداريم رو بخونيم ! فرض كنيد فايل هاي زبان در دايرکتوري /home/lang/ قرار گرفته و فايل index در دايرکتوري /home/ باشه ! ما براحتي با استفاده از کد هاي (..) و ( ../ ) به دايرکتوري هاي بالا تر و يا قبل تر بريم ! به طور مثال با تغيير کوکي ها به ين صورت :
کد:
language
en
to
language
../main
مقداري که فراخواني ميشه به اين صورت در مياد :
کد:
include("/home/lang/../main.php");
و برنامه با برگشتن به دايرکتوري پيشين ( /home/ ) فايل main.php رو فراخواني ميکنه و در بالاي صفحه نشون ميده ! البته همون طور که انتظار ميره ما با خطا هايي هم روبرو ميشيم ! که اگه کمي خلاقيت داشته باشيد ميبينيد که ما ميتونيم فايل passwd در لينوکس و يا فايل cmd رو در ويندوز فراخواني کنيم و کنترل کامل سرور رو در اختيار بگيريم ! به اين صورت که کوکي ها رو اين شکلي تغيير بديم :
کد:
language
en
to
language
../../../../../../../../../etc/passwd
حالا بعد از تغيير کد و اجراي صفحه ما چيزي بجز خطا هاي رايج رو نميبينيم !
پس مشکل کجاست ! ما که مسير رو درست وارد کرديم ؟ !
براي اينکه مشکل رو پيدا کنيم ناچارا" به فايل language بر گشته و کد ها رو تحليل ميکنيم !
کد:
<?
if($_COOKIE["language"]) {
$llang = $_COOKIE["language"];
}
else
{
$l_array = explode("-",$lang_array[0]);
$llang = $l_array[0];
setcookie("language",$llang,time()+1209600,"","","");
}
include("/home/lang/".$llang.".php");
?>
خب اگه به خط آخر دقت کنيد ميبينيد که فايل به اين صورت فراخواني شده :
کد:
include("/home/lang/".$llang.".php");
خب اين يعني اينکه ما فقط ميتونيم فايل هايي که پسوند php دارن رو فراخوني کنيم !
هه هه هه چه security جالبي !
ولي نه اينجوري نيست اونايي که زبون برنامه نويسي c بلدن و با exploit نويسي آشنايي دارند و کمي باهوشن ميدونن که با يک کد کوچيک هگز ميشه هر فايلي رو که دوست داشته باشن رو فرخواني کنن ! اسم اين کد کوچيک نال بايت ه و در هگز به اين صورته : ( 00% ) که براي درک بهتر اين کد بياين نگاهي به نحوه ي تعريف يک متغير از نوع رشته اي در زبان C بندازيم :
کد:
char name="asadhacker"
اين اسم در حافظه به اين صورت تعبير ميشه :
کد:
a s a d h a c k e r \0
مقدار نال بايت در آخر رشته به معني پايان رشته است يعني اينکه هر کاراکتري بعد از اون قرار بگيره مورد قبول نيست به بيان ديگه پردازش گر بعد از رسيدن به نال بايت پردازش رو پايان ميده و از اونجايي که php بر پايه ي زبون c نوشته شده اين قابليت رو از C به ارث برده و ما ميتونيم فايل مورد نظر خودمون رو به اين صورت فراخوني کنيم :
کد:
language
en
to
language
../../../../../../../../../etc/passwd%00
مقدار مورد نظر ما به اين صورت فراخواني ميشه :
کد:
include("/home/lang../../../../../../../../../etc/passwd%00.php");
بعد از رسيدن به نال بايت پردازش رشته تموم ميشه و فايل passwd که به اين صورت :
کد:
passwd%00.php
فراخواني شده به اين صورت تعبير ميشه :
کد:
passwd
چون همون طور که گفتم بعد از نال بايت عملا" هيچ کاراکتري پردازش نميشه و با استفاده از اين تکنيک ميشه هر فايلي و با هر پسوندي رو فراخواني کرد !
ديگه خسته شدم از بس تايپ کردم ! هنوز اين مبحث تموم نشده و ادامه داره .....
فعلا" باي
