انواع آسیبپذیریهای رایج وب (Web Vulnerabilities) کدامند؟
مهمترین آسیبپذیریهای رایج وب کدامند و هرکدام چه مکانیزمی دارند و چگونه میتوان از آنها جلوگیری کرد؟
چرا شناخت آسیبپذیریها مهمتر از فهرست کردن آنهاست؟
در سالهای اخیر، گزارشهای امنیتی متعددی را روی سایتهای مشتریان بررسی کردهام. الگوی مشترک بیشتر آنها این بود که صاحبان سایت اسم آسیبپذیری را شنیده بودند، اما نمیدانستند مکانیزمش چطور کار میکند. این شناخت ناقص، معمولاً به دفاع ناقص منجر میشود. در این مقاله، نه فقط فهرستی از آسیبپذیریهای رایج ارائه میکنم، بلکه برای هرکدام مکانیزم حمله، نمونهٔ واقعی و راهکار عملی دفاعی را با هم مرور میکنیم. اگر تازه با مفهوم آسیبپذیری آشنا میشوید، پیشنهاد میکنم ابتدا آسیبپذیری وب چیست و چگونه شناسایی میشود را بخوانید.
دستهبندی کلی آسیبپذیریهای وب
در ادبیات امنیت، آسیبپذیریها را معمولاً در چند دستهبندی اصلی قرار میدهند: آسیبپذیریهای ورودی (مثل XSS و SQLi)، آسیبپذیریهای منطقی (مثل IDOR و CSRF)، آسیبپذیریهای پیکربندی (مثل خطاهای سرور)، و آسیبپذیریهای وابستگیها (مثل افزونههای قدیمی). این دستهبندی به شما کمک میکند هنگام ممیزی امنیتی، تمرکز خود را روی نقاط پرخطر بگذارید.
آسیبپذیری اول: Cross-Site Scripting (XSS)
XSS یکی از رایجترین آسیبپذیریهاست که در آن مهاجم کد جاوااسکریپت خودش را در صفحه تزریق میکند. این کد میتواند کوکیها، اطلاعات فرمها یا حتی کل سشن کاربر را بدزدد. سه نوع اصلی XSS وجود دارد: ذخیرهشده، بازتابی و مبتنی بر DOM. حمله XSS در بخشهای ورودی کاربر مثل دیدگاهها یا فرمها رخ میدهد.
راهکار دفاع: پاکسازی ورودی و خروجیگیری امن با توابعی مثل esc_html و wp_kses در وردپرس. توضیح کامل مکانیزم و راهکار دفاعی در حملات XSS چیست و چگونه دفع میشود آمده است.
آسیبپذیری دوم: SQL Injection
SQL Injection یا SQLi حملهای است که در آن مهاجم با تزریق کوئریهای SQL در ورودیهای سایت، به دیتابیس دسترسی پیدا میکند. این نوع حمله میتواند تمام دادههای کاربران را افشا یا حتی پاک کند. علت اصلی، نداشتن Prepared Statements و پاکسازی نکردن ورودیهاست.
راهکار دفاع: همیشه از Prepared Statements استفاده کنید و ورودیها را با توابع مناسب پاکسازی کنید. راهنمای کامل در SQL Injection چیست و چگونه جلوگیری کنیم نوشته شده است.
آسیبپذیری سوم: Cross-Site Request Forgery (CSRF)
CSRF حملهای است که در آن مهاجم کاربر لاگینکرده را فریب میدهد تا بدون اطلاع خودش، عملی روی سایت انجام دهد. این عمل میتواند تغییر رمز عبور، انتقال وجه یا ثبت سفارش باشد. علت اصلی، اعتماد بیجای سایت به کوکیهای مرورگر است.
راهکار دفاع: استفاده از توکن CSRF در فرمها و بررسی هدر Referer. توضیح عمیقتر در CSRF چیست و چگونه از آن جلوگیری کنیم آمده است.
آسیبپذیری چهارم: Insecure Direct Object Reference (IDOR)
IDOR یک آسیبپذیری منطقی است که در آن کاربر میتواند با تغییر پارامتر URL یا فرم، به منابع دیگران دسترسی پیدا کند. مثلاً اگر آدرس پروفایل شما example.com/user/123 باشد و شما بتوانید 124 را بزنید و پروفایل کاربر دیگر را ببینید، سایت دچار IDOR است.
راهکار دفاع: در هر درخواست، بررسی کنید که کاربر واقعاً به منبع درخواستی دسترسی دارد یا نه. توضیح کامل در آسیبپذیری IDOR چیست و چگونه رفع میشود آمده است.
آسیبپذیری پنجم: Remote File Inclusion (RFI) و Local File Inclusion (LFI)
در این نوع آسیبپذیری، مهاجم میتواند فایلهای خارجی را در سرور شما بارگذاری و اجرا کند. RFI با فایلهای ریموت کار میکند و LFI با فایلهای لوکال. هر دو میتوانند به اجرای کد یا افشای اطلاعات منجر شوند.
راهکار دفاع: هرگز فایلهای ورودی را بر اساس ورودی کاربر بارگذاری نکنید و در صورت نیاز، فهرست سفید فایلهای مجاز داشته باشید. تفاوت این دو در آسیبپذیری RFI و LFI چه تفاوتی دارند توضیح داده شده است.
آسیبپذیری ششم: آسیبپذیری افزونهها و قالبها
یکی از شایعترین منابع آسیبپذیری در وردپرس، افزونههای ثالث هستند. افزونههای قدیمی یا ناشناخته میتوانند کد مخرب داشته باشند یا نقاط ورود ناامن ایجاد کنند. این نوع آسیبپذیری بهویژه در سایتهایی که از افزونههای کرکشده استفاده میکنند، رایج است.
راهکار دفاع: از مخزن رسمی نصب کنید، بهروزرسانی منظم را جدی بگیرید و افزونههای بیاستفاده را حذف کنید. جزئیات این آسیبپذیری در آسیبپذیری افزونههای وردپرس چه خطراتی دارد آمده است.
آسیبپذیری هفتم: Broken Authentication
این دسته شامل ضعفهای احراز هویت مثل رمز عبور ضعیف، نبود احراز هویت دوعاملی، و مدیریت نامناسب سشنهاست. نتیجه این ضعفها، دسترسی مهاجم به حسابهای کاربری و در موارد شدیدتر، به پیشخوان مدیریت است.
راهکار دفاع: استفاده از احراز هویت دوعاملی، رمز عبور قوی، و مدیریت منظم سشنها. راهنمای جامع در چگونه امنیت وبسایت را افزایش دهیم ارائه شده است.
آسیبپذیری هشتم: Security Misconfiguration
پیکربندی نادرست سرور، فایلها و سرویسها یکی از شایعترین آسیبپذیریهاست. مثالهایی از این نوع شامل نمایش خطاهای PHP در محیط تولید، فعال بودن لیست فایلهای دایرکتوری، و باز بودن پورتهای غیرضروری است.
راهکار دفاع: ممیزی منظم پیکربندی سرور و استفاده از چکلیستهای امنیتی. توصیه میکنم هدرهای امنیتی HTTP چه کاربردی دارند را بخوانید تا بخشی از این پیکربندیها را پوشش دهید.
آسیبپذیری نهم: Sensitive Data Exposure
افشای دادههای حساس به دلایل مختلفی رخ میدهد: نبود رمزنگاری روی دادههای در حال انتقال، نبود رمزنگاری روی دادههای ذخیرهشده، و ارسال دادههای حساس در URL یا لاگها. در تجربهٔ خودم، یکی از پروندههای جدی که بررسی کردم، افشای اطلاعات کاربران از طریق یک فایل بکاپ در دسترس عموم بود.
راهکار دفاع: رمزنگاری دادههای حساس در حال انتقال و ذخیره، و بررسی منظم دسترسیهای فایلها.
آسیبپذیری دهم: Zero Day
آسیبپذیری Zero Day به آسیبپذیریهایی گفته میشود که هنوز برای آنها پچ امنیتی منتشر نشده است. این نوع آسیبپذیریها بهدلیل نبود پچ، خطرناکتر از سایر آسیبپذیریها هستند و دفاع در برابرشان نیازمند رویکردهای پیشگیرانهتر است.
راهکار دفاع: کاهش سطح حمله، پایش مستمر، و آمادگی برای واکنش سریع. جزئیات این موضوع در آسیبپذیری Zero Day چیست آمده است.
آسیبپذیری یازدهم: Server-Side Request Forgery (SSRF)
در SSRF، مهاجم سایت را وادار میکند که درخواستی به یک منبع داخلی یا خارجی بفرستد. این نوع حمله میتواند به افشای دادههای حساس در شبکه داخلی منجر شود. این آسیبپذیری بهویژه در اپلیکیشنهایی که با URLهای کاربر کار میکنند، رایج است.
آسیبپذیری دوازدهم: XML External Entity (XXE)
XXE یک آسیبپذیری است که در پردازش فایلهای XML رخ میدهد. مهاجم میتواند با تعریف یک موجودیت خارجی، فایلهای سرور را بخواند یا درخواستهای شبکهای ارسال کند. این نوع آسیبپذیری بهویژه در سیستمهایی که XML از کاربر دریافت میکنند، خطرناک است.
آسیبپذیری سیزدهم: Insecure Deserialization
وقتی دادههای سریالایزشده بدون اعتبارسنجی در سرور بازسازی میشوند، مهاجم میتواند کد دلخواه خود را اجرا کند. این نوع آسیبپذیری در اپلیکیشنهایی که دادههای سریالایزشده را از کاربر دریافت میکنند، رخ میدهد.
آسیبپذیری چهاردهم: استفاده از کامپوننتهای آسیبپذیر
استفاده از کتابخانهها و کامپوننتهای آسیبپذیر یکی از منابع رایج نفوذ است. در محیط Node.js، کتابخانههای قدیمی میتوانند حفرههای امنیتی شناختهشده داشته باشند. در وردپرس، این مسئله به شکل افزونههای قدیمی بروز میکند. برای شناسایی این نوع آسیبپذیریها، ابزارهایی مثل اسکنرهای آسیبپذیری وب مفید هستند.
آسیبپذیری پانزدهم: Insufficient Logging and Monitoring
نبود لاگبرداری و پایش مناسب، باعث میشود که حملهها مدتها بدون کشف باقی بمانند. این آسیبپذیری نهبهخودیخود یک حمله است، بلکه بستر مناسبی برای سایر حملات فراهم میکند. راهکارهای پایش در چگونه آسیبپذیری سایت را پیدا کنیم آمده است.
روش اولویتبندی آسیبپذیریها
وقتی چند آسیبپذیری در سایت شناسایی میشود، اولین سؤال این است که کدامیک اولویت دارد؟ روش من این است که هر آسیبپذیری را بر اساس سه معیار ارزیابی کنم: امکان بهرهبرداری، میزان خسارت و احتمال کشف. آسیبپذیریهایی که امکان بهرهبرداری بالایی دارند و خسارت زیادی وارد میکنند، اولویت اول را دارند. توضیح دقیقتر در چگونه آسیبپذیریها را رتبهبندی و رفع کنیم آمده است.
یک نکتهٔ مهم که در تجربهام بارها دیدهام: خیلی از تیمها روی آسیبپذیریهایی تمرکز میکنند که فقط از لحاظ تئوری جذاب هستند، در حالی که آسیبپذیریهای بهظاهر ساده مثل رمز عبور ضعیف، در عمل بیشترین خسارت را وارد میکنند. مستندات ویکیپدیا در مورد Vulnerability هم بر اهمیت اولویتبندی بر اساس ریسک واقعی تأکید دارد.
پرسشهای پرتکرار دربارهٔ آسیبپذیریهای وب
آیا تمام آسیبپذیریها به یک اندازه خطرناک هستند؟ خیر. برخی مثل Zero Day و SQL Injection میتوانند در کوتاهمدت خسارت جدی وارد کنند، در حالی که برخی مثل Broken Authentication به مرور خطرناک میشوند.
آیا اسکنرهای خودکار میتوانند همه آسیبپذیریها را پیدا کنند؟ نه. اسکنرها میتوانند آسیبپذیریهای رایج را شناسایی کنند، اما آسیبپذیریهای منطقی مثل IDOR نیازمند بررسی دستی هستند.
آیا پس از رفع آسیبپذیری، سایت کاملاً امن میشود؟ خیر. امنیت یک فرآیند مداوم است. آسیبپذیریهای جدید بهطور مداوم کشف میشوند و سایت شما باید بهطور مداوم بهروزرسانی شود.
آیا آسیبپذیریها به اندازهٔ سایت بستگی دارند؟ خیر. حملات وردپرسی و وب بهطور خودکار انجام میشوند، پس اندازهٔ سایت تفاوت چندانی ندارد.
آیا استفاده از CMS محبوب مثل وردپرس خطرناکتر است؟ محبوبیت وردپرس باعث میشود که هدف رایجی باشد، اما خودِ پلتفرم هم تیم امنیتی قوی دارد. تفاوت اصلی در نحوۀ مدیریت آن است.
سخن پایانی: شناخت، اولین گام دفاع است
شناخت انواع آسیبپذیریها، اولین و مهمترین گام دفاع است. وقتی بدانید هر آسیبپذیری چگونه کار میکند، میتوانید با دید بازتری برای جلوگیری از آنها تصمیم بگیرید. سایت شما، هر چقدر هم کوچک باشد، در معرض این آسیبپذیریها قرار دارد. پیشنهاد میکنم امروز فقط یکی از این موارد را در سایت خود بررسی کنید و اگر آسیبپذیری پیدا کردید، آن را در اولویت رفع قرار دهید. تجربهتان از مواجهه با هر یک از این آسیبپذیریها را در دیدگاهها بنویسید؛ این تجربهها به خوانندگان دیگر کمک میکند تا سریعتر بیاموزند.