محمد نصیری
بنیانگذار انجمن تخصصی فناوری اطلاعات ایران ، هکر کلاه خاکستری ، کارشناس امنیت اطلاعات و ارتباطات

حملات وب سایت (Web Application Attacks) چیست؟ بررسی انواع آن

یکی از علاقه مندی های هکر ها حمله به وب سایت ها (Web Application Attacks) می باشد. این حملات انواع مختلفی دارند که در این مطلب با آن ها آشنا خواهید شد. سالها پیش زمانیکه صحبت از یک نرم افزار کاربردی در یک شبکه می شد ، به سراغ استفاده از نرم افزارهایی می رفتیم که دارای دو قسمت بود ، یک قسمت بر روی سرور نصب می شدو قسمت دیگر بر روی کامپیوتری که قصد استفاده از آن سرویس را داشت نصب می شد ، با گذشت زمان و رواج یافتن نرم افزار های کاربردی تحت وب این تفکر رواج یافت که اینگونه نرم افزارهای تحت وب دارای امنیت و کاربرد ساده تری نسبت به نرم افزاهای گذشته هستند و به شدت شروع به رشد کردند ، به گونه ای که امروزه اکثر نرم افزارهایی که برای شبکه نوشته می شود در قالب نرم افزارهای کاربردی تحت وب می باشد.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

تحت وب بودن یک نرم افزار هم مزیت است و هم دارای عیب های زیادی می باشد، مزیت استفاده از این نرم افزارها این است که شما دیگر نیازی به استفاده از یک نرم افزار Agent برای متصل شدن به سرور اصلی خود ندارید و صرفا با وارد کردن آدرس URL سرور نرم افزار کاربردی تحت وب می توانید به آن وصل شده و از سرویس های آن استفاده کنید ، اما همین موضوع می تواند نقطه ضعف بزرگی برای اینگونه سیستم ها باشد .

یک هکر یا مهاجم نیز به همان سادگی که شما می توانید به نرم افزار خود متصل شوید می تواند به سیستم شما متصل شود ، در ساختار های قدیمی همین وجود Agent تا حدودی کار را برای هکرها سخت تر می کرد. یکی از مواردی که تحت وب بودن نرم افزارها خطر آفرین است این است که شما هر اندازه شبکه خود را امن کنید در نهایت به دلیل استفاده از نرم افزارهای تحت وب منتشر شده به بیرون از سازمان می توان به شبکه شما دسترسی و نفوذ کرد ، به شکل زیر دقت کنید.


انواع حملات به وب سایت ها

حملات نوع خاصی وجود دارند که به Web Application Attacks یا حملات به نرم افزارهای کاربردی مشهور هستند ، اینگونه حملات با توجه به گسترش روز افزون وب سایت ها و نرم افزارهای تحت وب بصورت فزاینده ای در حال زیاد شدن هستند. در بهترین شرایط ممکن اگر کسی بخواهد جلوی اینگونه حملات را بگیردمدت زمانی طول می کشد که در همین زمان می توان از نقاط ضعف بوجود آمده استفاده کرده و به هدف حمله کرد.

به نقاط ضعفی که هنوز شناسایی نشده اند و بروز رسانی امنیتی برای آنها ارائه نشده است در اصطلاح Zero Day گفته می شود ، در zero-day مدافع زمانی برای آماده شدن برای دفاع در مقابل حمله ندارد. معروف ترین حملات Web Application به عنوان Cross Site Scripting ، SQL Injection ، XML Injection ، Command Injection و Directory Traversal شناخته می شوند که در ادامه در خصوص هر یک از اینگونه حملات با هم صحبت خواهیم کرد.


SQL Injection چیست

حمله XSS Injection یا Cross Site Scripting

این نوع حمله که همانطور که از نامش پیداست از ساختار اسکریپت نویسی استفاده می کند ، به نرم افزارهای تحت وب از طریق اسکریپت نویسی حمله می کند. هدف اصلی این نوع حمله بدست آودن اطلاعات از کاربران و کلاینت هایی است که به سرور متصل می شود . اگر نرم افزار تحت وبی دارای مشکل باشد و هکر بتواند اسکریپت مخرب خود را در فرم های نرم افزار وارد کند.

کاربر یا کلاینت ها به محض متصل شدن به سرور آلوده کد مخرب مورد نظر هکر را از طریق مرورگر اجرا کرده و سیستم خود را آلوده می کنند ، مرورگرها توانایی تشخیص این را ندارند که اسکریپتی که بر روی کامپیوتر آنها اجرا می شود آلوده است یا خیر ؟ بعد از اینکه اسکریپت مخرب بر روی کامپیوتر هدف اجرا شد ، مرورگر کلاینت آلوده تابع دستوراتی خواهد بود که هکر صادر می کند بنابراین هر دستوری که هکر بخواهد را می تواند به مرورگر آلوده ارسال و اطلاعات مورد نیاز خود را دریافت کند.


Cross-Site Scripting یا XSS Injection چیست

مخفف کلمه Cross-Site Scripting بصورت CSS می باشد اما این مخفف به دلیل اینکه با ساختاری به نام CSS که در طراحی وب وجود دارد شباهت دارد به XSS تغییر داده شد. اکثر کدهایی که توسط هکر ها در نرم افزارهای تحت وب وارد می شود که در سمت کلاینت اجرا شود معمولا به زبان جاوا اسکریپت نوشته می شود.

و سپس به سرور تزریق یا Inject می شود. اگر کمی با ساختار طراحی صفحات وب پویا یا داینامیک آشنایی داشته باشید متوجه می شوید که درخواست ها در سرور اجرا می شوند و نتیجه به سمت کلاینت ارسال می شود . همیشه در هر جا نامی از Inject کردن شنیدید ، به این معناست که حمله از طریق وارد کردن اطلاعات به درون یک فیلد اطلاعاتی انجام می شود. XSS که به نام XSS Injection نیز معروف است نیز از این مورد استثناء نیست .

در این نوع حمله هکر به دنبال فیلد های ورود اطلاعاتی می گردد که در وب سایت مورد نظر قرار دارد و در صورت عدم رعایت موارد امنیتی مناسب در وب سرور می تواند به آن وب سایت حمله کند. بیشتر اطلاعاتی که از طریق XSS بدست می آید از طریق Cookie هایی است که کلاینت بر روی مرورگر خود بر جای می گذارد.

در صورتیکه برنامه نویس وب سایت شما در فیلد های ورودی اطلاعات خود اعتبارسنجی یا Validation را انجام ندهد ، آن وب سایت مستعد بروز حملات XSS خواهد بود. حملات XSS خود به دو دسته بندی تقسیم می شوند که به عنوان انعکاس و ذخیره شناخته می شوند ، در حملات از نوع انعاکاس هکر یک حفره امنیتی و راهی برای استفاده از آن پیدا می نماید تا کاربر ناشناس را به یک برنامه وب دارای آسیب پذیری XSS هدایت کند.

در این هنگام حمله انجام شده است. این حمله به وسیله یک سری از پارامترهای URL که با URL ارسال می شوند، انجام می شود. هکر URL مخرب را با پارامترهای موجود در URL برای کاربر ارسال می کند. این URL معمولا از طریق ایمیل، وبلاگ ها یا انجمن ها و یا هر روش ممکن دیگری برای کاربر فرستاده می شود.


Input Validation یا اعتبارسنجی داده های وروردی

شاید تصور شود که کاربر بر روی لینک های ناشناس کلیک نمی کند، بنابراین مشکلی برای او پیش نمی آید. اما باید توجه نمود که با استفاده از JavaScript حتی با بازنمودن یک ایمیل و حتی مشاهده یک سایت، حمله XSS انجام می شود. به علاوه در این نوع حمله معمولا URL ها با متدهایی مثل Hex و یا هر متد کدگذاری دیگری که URL ها را بصورت معتبر نمایش می دهد، کدگذاری می شوند.

در حملات از نوع ذخیره ، هکر کدهای مخربی را که یک کاربر در آینده آنها را فراخوانی می کند ذخیره می نماید. در واقع یک کاربر ندانسته به کدهای مخرب برخورد می نماید و کدهای مخرب اجرا می شوند. مسئله اینجاست که هنگام ذخیره سازی کدها و همچنین هنگام واکشی آنها اعتبارسنجی ورودی ها و خروجی ها انجام نشده است.

نکته حائز اهمیت این است که حتی درصورت اعتبارسنجی یا Validation کدها در هنگام ذخیره نمودن آنها، چک نمودن خروجی ها و اعتبار سنجی آنها نیز لازم است. چراکه به این ترتیب کدهای مخرب ناشناخته در طی فرایند اعتبار سنجی ورودی، کشف خواهند شد. یک کاربر معمولا از راه های مختلفی مورد حملات XSS قرار می گیرد که از آن جمله می توانیم به باز کردن یک صفحه وب سایت ، کلیک کردن بر روی یک لینک و همچنین حتی باز کردن یک ایمیل ساده اشاره کنیم.

حمله SQL Injection

همانطور که می دانید واژه SQL مخفف کلمه Structured Query Language می باشد که زبانی برای برقرار ارتباط با پایگاه های داده می باشد ، این زبان می تواند برای انجام پرسش و پاسخ یا Query گرفتن از پایگاه های داده ای مانند MSSQL یا MySQL یا Oracle یا هر پایگاه داده مشابهی مورد استفاده قرار بگیرد.

همانطور که قبلا هم اشاره کردیم هرگاه نامی از Injection یا تزریق به گوشمان خورد بلافاصله باید به این فکر بیوفتیم که می توانیم دستورات تعریف نشده ای را به سمت سرور مقصد ارسال و پاسخ دلخواه خود را بدست بیاوریم. ساختار کاری حملات SQL Injection به این صورت است که هرگاه فیلد ورود و خروج اطلاعاتی وجود داشته باشد که در پس زمینه آن یک پایگاه داده باشد .

می توانیم با وارد کردن دستورات غیرمعمول زبان SQL در این فیلد ها پاسخ هایی از سرور مورد نظر دریافت کنیم که حاوی اطلاعات حساس می باشند. در خصوص حملات SQL Injection در مقاله ای بصورت جداگانه و مفصل بحث خواهیم کرد و هدف در اینجا صرفا شناسایی این نوع حمله است.

یکی از فیلدهایی که در وب سایت ها بسیار مورد حملات SQL Injection قرار می گیرد ، فیلد Forgot Password یا فراموشی رمز عبور است. از این فیلد زمانی استفاده می شود که کاربر رمز عبور خود را فراموش کرده است و می خواهد با وارد کردن ایمیل خود ، رمز عبور را بازیابی کند تا بتواند مجددا وارد وب سایت بشود. فرض را بر این بگیرید که یک هکر در این فیلد یک ایمیل با قالب نادرست را وارد می کند .

پاسخی که از پایگاه داده یا سرور بازگردانده می شود ممکن است حاوی اطلاعاتی باشد که چگونگی اعتبارسنجی درخواست داده شده را بررسی می کند ، در این لحظه هکر فیلد ایمیل را با دستورات SQL ای که بر اساس داده های بدست آمده است پر می کند و برای سرور ارسال می کند ، سرور این دستورات را پردازش کرده و خروجی را اعلام می کند ، فرص کنید که دستور زیر در یک پایگاه داده دارای نقطه ضعف امنیتی وارد شده باشد :

SELECT fieldlist FROM table WHERE field = ‘whatever’ or ‘a’=‘a’

در این حالت و با وارد کردن دستور بالا توسط هکر ، کلیه ایمیل هایی که در پایگاه داده وجود دارد به نمایش در می آیند. برای انجام چنین حملاتی هکر می بایست دارای دانش فنی نسبتا خوبی در خصوص پایگاه های داده و به ویژه زبان SQL داشته باشد ، این نوع حمله از خطرناکترین نوع حملاتی است که امروزه به وب سایت ها و نرم افزارهای تحت وب انجام می شود. برای جلوگیری از انجام شدن چنین حملاتی نیز می توان از روش های اعتبارسنجی یا Input Validation در فرم ها استفاده کرد. در خصوص دستور بالا می توانید اطلاعاتی را در جدول زیر پیدا کنید هر چند این بحث بسیار فراتر از مبحث این مقاله می باشد.

whatever’ AND email IS NULL;-	شناسایی فیلدهای مختلف موجود در دیتابیس
whatever’ AND 1=(SELECT COUNT(*) FROM tabname);-	شناسایی نام جدول های دیتابیس
whatever’ OR full_name LIKE ‘%tosinso.com%’	پیدا کردن کاربرانی با مشخصات تعیین شده
whatever’; DROP TABLE members;-	تمامی اطلاعات موجود در جدول حذف می شوند

حمله XML Injection یا XPath Injection

قبل از اینکه در خصوص این نوع حملات صحبت کنیم بهتر است بدانیم که منظور از Markup Language چیست ؟ کلماتی مثل XML مخفف Extensible Markup Language و HTML مخفف Hypertext Markup Language می باشند. Markup Language زبانی است که شیوه نمایش اطلاعات در صفحات وب را نشان می دهد . به این معنی که شما با استفاده از این زبان می توانید به متن های خود یادداشت یا حاشیه اضافه کنید.

در این میان معروف ترین زبان های Markup به نام HTML و XML شناخته می شوند. اکثر وب سایت ها و نرم افزارهای تحت وبی که امروزه مشاهده می کنید با استفاده از یک روش داده های خود را ذخیره می کنند ، معمولترین روش استفاده از یک پایگاه داده مانند SQL سرور می باشد.

شما در HTML در قالب برچسب ها یا Tag ها صرفا به صفحه وب می گویید که متون را چگونه نمایش دهد ، اما در XML شما داده ها را می توانید نگهداری کنید و قالب بندی چندان مد نظر نیست . برخی از وب سایت ها از XML برای ذخیره سازی داده ها استفاده می کنند ، توجه کنید که زمانیکه نام ذخیره داده در ذهن شما آمد باید به این نتیجه برسید که می توان از این داده Query گرفت ، بنابراین می توان به آن حمله از نوع Injection انجام داد.

یکی از معروف ترین روش های حمله به دیتاهای ذخیره شده در XML به نام Xpath می باشد یا XPath Injection . زمانیکه یک وب سایت از پایگاه داده SQL استفاده می کند قطعا باید به فکر حملات SQL Injection ای که به این پایگاه داده می شود نیز باشد ، وب سایت هایی که از XML استفاده می کنند نیز بایستی انتظار این را داشته باشند که مورد حمله حملات XML Injection یا XPath Injection قرار بگیرند.

همیشه توجه کنید که اگر از XML به عنوان دیتابیس استفاد می کنید در طراحی فرم های ورودی و خروجی اطلاعات و پاسخ هایی که به Query ها داده می شود دفت کنید. هرگاه وب سایتی که داده های خود را که در قالب XML ذخیره شده اند را به درستی در مقابل ورودی اطلاعات کاربران فیلتر نکرده باشد ، آن وب سایت مستعد حملات XML Injection می باشد. فرض کنید که یک وب سایت دارید که از کدهای XML برای ذخیره سازی داده های خود استفاده می کند و قالب XML مورد استفاده در آن به شکل زیر می باشد :

	
		Admin
		MyPassw0rd
		admin
	

به کد وارد شده در بالا توجه کنید ، زمانیکه کاربر با استفاده از کد بالا می خواهد اطلاعاتی برای ورود به وب سایت را وارد کند ، بعد از اینکه کاربر نام کاربری و رمز عبور خود را در فرم وارد کرد یک XPath Query در PHP بصورت خودکار ایجاد می شود که حاوی نام کاربری و رمز عبور کاربر است ، این Query شبیه چیزی است که در پایین مشاهده می کنید :

xpath("//User[username/test()='".$_POST['user']." AND password/text()='".$_POST['pass']."'";
?>


مشکل اصلی در قسمت بالا این است که داده هایی که از کاربر دریافت شده اند اعتبارسنجی نشده اند ، متغیر POST به گونه ای نوشته شده است که می تواند داده ها را مستقیما از جانب کادر ورود یا Login دریافت کند و آن را در XPath Query ایجاد شده قرار دهد ، در اینجا هکر می تواند کد یا Query مخربی که خود مد نظر دارد را وارد کرده و به جای رشته های نام کاربردی و رمز عبور ، رشته یا نام کاربری مورد نظر خود را وارد می کند. به Query وارد شده در زیر دقت کنید :

' or 1=1 or '

با استفاده از این Query هکر می تواند نام اولین کاربر و رمز آن را بدست بیاورد ، با توجه به اینکه اولین کاربر در اینجا Administrator می باشد ، اکنون هکر می تواند با کاربر Administrator وارد وب سایت شود. نکته اخلاقی : همیشه برای فیلدهای ورودی اطلاعات خود Validation ایجاد کنید.

حمله تزریق کد (Code Injection) و Directory Traversal

وب سرورها نیز مانند ساختار فایلی که در سیستم عامل وجود دارد دارای سلسله مراتب می باشند ، وب سرورها معمولا دسترسی به ریشه یا root دایرکتوری های خود را محدود می کنند ، کاربران در این حالت می توانند به دایرکتوری های زیر مجموعه دسترسی پیدا کنند اما نمی توانند به مرحله بالاتر که ریشه است دسترسی پیدا کنند ، همچنین نمی توانند بصورت موازی از پوشه های کنار دستی نیز استفاده کنند و صرفا به محلی ارجاع داده می شوند که به آن دسترسی دارند.

برخی اوقات به علل مختلف که بارزترین آنها سهل انگاری مدیر وب سرور است ، دسترسی های مناسب برای پوشه ریشه در نظر گرفته نمی شود و همین امر می تواند باعث شود مهاجم به دایرکتوری ریشه وب سرور دسترسی پیدا کند. Directory Traversal یا Path Traversal سوء استفاده از همین نقاط ضعفی است که در سطوح دسترسی یا عدم اعتبارسنجی داده های ورودی کاربر به ویژه نام فایل ها در وب سرور است که در نهاید می تواند باعث شود مهاجم با وارد کردن کاراکترهای مشخصی به Parent Directory یا پوشه بالاسری دسترسی پیدا کند.

هدف اینگونه حملات دسترسی پیدا کردن به فایل هایی است که نبایستی بصورت عمومی در دسترس قرار بگیرند ، در این حمله در نهایت هکر می تواند فایل های موجود در قسمت محدود شده یا Restricted را دستکاری کند و نتیجه لازم را بگیرد. حملات نوع Directory Traversal به حملات /.. یا dot dot slash ، Directory Climbing و Backtracking نیز معروف می باشند. برخی از انواع این نوع حملات به نام canonicalization attacks نیز معروف می باشند.


Directory Traversal چیست



امنیت اطلاعات قسمت ششم – انواع حملات به وب سایت ها و نرم افزارهای تحت وب



تزریق دستورات یا Command Injection که به Shell Injection و Code Injection نیز معروف است یکی دیگر از حملاتی است که می توان به وب سرورها و نرم افزارهای کاربردی تحت وب انجام داد. هدف اصلی Command Injection وارد کردن و اجرا کردن کدها و دستورات مد نظر مهاجم در نرم افزار دارای نقطه ضعف امنیتی است .

در چنین مواقعی نرم افزاری که کدها و دستورات وارد شده ناخواسته را اجرا می کند درکی از این ندارد که کد وارد شده مخرب است یا نیست و هر دستور ورودی از Shell را به عنوان یک دستور مجاز از طرف کاربر سیستم برداشت می کند. دستورات در محیطی وارد می شوند که سطح دسترسی برابر سطح دسترسی نرم افزار کاربردی دارد .

این نوع حمله در مواقعی که شما اعتبارسنجی ورود اطلاعات را در برنامه نویسی خود ندیده اید که در اصطلاح به آن Input Validation می گویند انجام می شود و می تواند از پارامترهایی مثل فرمهای ورود و خروج اطلاعات ، کوکی ها ، Http Header ها و غیره استفاده کند.در اصطلاح هک به دسترسی پیدا کردن به خط فرمان سیستم قربانی Shell گرفتن نیز می گویند.


Command Injection یا Shell Injection چیست


در Command Injection مهاجم دستورات مورد نظر خود را در خط فرمان سیستم قربانی اجرا می کند ، اما در Code Injection مهاجم کدهای مد نظر خود را در نرم افزار کاربردی که وجود دارد قرار می دهد که به جای کد اصلی نرم افزار اجرا شود ، در این حالت بدون نیاز به اجرا دستور خاصی با اجرا شدن اصل نرم افزار کدهای مخرب مورد نظر هکر اجرا خواهند شد ، سطح دسترسی کدهای اجرایی در اینجا برابر سطح دسترسی نرم افزار کاربردی خواهد بود. اکثر کرم های اینترنتی از این حالت برای انتشار و اجرا شدن استفاده می کنند . آنها از نقاط ضعف سیستم عامل استفاده می کنند و خود را به نرم افزارهای مختلف می چسبانند


محمد نصیری
محمد نصیری

بنیانگذار انجمن تخصصی فناوری اطلاعات ایران ، هکر کلاه خاکستری ، کارشناس امنیت اطلاعات و ارتباطات

محمد نصیری هستم ، هکر قانونمند و کارشناس امنیت سایبری ، سابقه همکاری با بیش از 50 سازمان دولتی ، خصوصی ، نظامی و انتظامی در قالب مشاور ، مدرس و مدیر پروژه ، مدرس دوره های تخصص شبکه ، امنیت ، هک و نفوذ ، در حال حاضر در ایران دیگه رسما فعالیتی غیر از مشاوره انجام نمیدم و مقیم کشور ترکیه هستم ، عاشق آموزش و تدریس هستم و به همین دلیل دوره های آموزشی که ضبط می کنم در دنیا بی نظیر هستند.

نظرات