قبل از اینکه وارد تست عملی یک برنامهی وب بشوید — چه با Burp Suite، چه با sqlmap، چه با هر ابزار دیگری — باید دقیقاً بدانید دنبال چه چیزی میگردید. OWASP (Open Worldwide Application Security Project) یک سازمان غیرانتفاعی است که هر چند سال یکبار، بر اساس دادههای واقعی از هزاران برنامهی وب در سراسر دنیا، فهرستی از ده دستهی آسیبپذیری منتشر میکند که بیشترین ریسک را برای برنامههای وب دارند. این فهرست، که به OWASP Top 10 معروف است، امروز به یکی از مرجعترین استانداردهای صنعت امنیت وب تبدیل شده و پایهی بسیاری از چارچوبهای ارزیابی امنیتی، از جمله آزمونهای گواهینامه و قراردادهای تست نفوذ رسمی، است.
این مقاله برخلاف بیشتر آموزشهای این بخش، حول یک ابزار خاص نیست — بلکه یک نقشهی راه مفهومی است. هدف این است که با خواندن آن، بفهمید هر آسیبپذیری از کجا میآید، چرا خطرناک است، و مهمتر از همه، چطور از وقوعش در کدی که خودتان مینویسید یا مدیریت میکنید جلوگیری کنید.
۱. Broken Access Control (کنترل دسترسی ناقص)
زمانی رخ میدهد که یک کاربر بتواند به منابع یا عملیاتی دسترسی پیدا کند که اجازهی آن را ندارد — مثلاً با تغییر یک عدد ساده در آدرس (/user/1001 به /user/1002) به اطلاعات حساب کاربر دیگری برسد. رایجترین و در عین حال سادهترین آسیبپذیری برای سوءاستفاده است، چون نیازی به دانش فنی پیچیده ندارد.
۲. Cryptographic Failures (نواقص رمزنگاری)
شامل ذخیرهی رمز عبور بهصورت متن ساده، استفاده از الگوریتمهای رمزنگاری قدیمی و شکستهشده (مثل MD5 برای هش رمز عبور)، یا انتقال اطلاعات حساس روی HTTP بهجای HTTPS. نتیجهاش این است که حتی اگر مهاجم به دیتابیس یا ترافیک شبکه دسترسی پیدا کند، اطلاعات هنوز قابل استفاده باقی میمانند.
۳. Injection (تزریق کد)
شامل خانوادهی بزرگی از آسیبپذیریهاست: SQL Injection، Command Injection، و مشابه آن — زمانی رخ میدهند که ورودی کاربر بدون اعتبارسنجی یا Sanitize مستقیماً وارد یک کوئری یا دستور سیستمی میشود. مقالهی آموزش sqlmap در همین بخش، دقیقاً روی این دسته تمرکز دارد.
۴. Insecure Design (طراحی ناامن)
برخلاف باگهای کد، این مورد به تصمیمات معماری اشتباه از همان ابتدا اشاره دارد — مثلاً سیستمی که هیچ محدودیتی روی تعداد تلاش برای ورود رمز عبور ندارد، فارغ از اینکه کد چقدر تمیز نوشته شده باشد، ذاتاً ناامن طراحی شده است.
۵. Security Misconfiguration (پیکربندی نادرست امنیتی)
از پیامهای خطای بیشازحد جزئی که اطلاعات داخلی سرور را لو میدهند، تا پنلهای مدیریتی که با رمز پیشفرض کارخانه باقی ماندهاند. این دسته اغلب رایجترین یافته در تستهای نفوذ واقعی است، چون معمولاً ناشی از فراموشی است، نه ضعف فنی.
۶. Vulnerable and Outdated Components (اجزای آسیبپذیر و قدیمی)
استفاده از یک کتابخانهی جاوااسکریپت، یک پلاگین وردپرس، یا حتی یک نسخهی قدیمی PHP که یک آسیبپذیری شناختهشده و عمومی دارد. مهاجمان اغلب دنبال نسخههای قدیمی نرمافزارهای شناختهشده میگردند، چون اکسپلویت آنها از قبل عمومی و آماده است.
۷. Identification and Authentication Failures (نواقص احراز هویت)
شامل رمزهای عبور ضعیف مجاز، عدم وجود قفل حساب بعد از تلاشهای ناموفق مکرر، و مدیریت ضعیف نشست (Session) — مثل عدم باطلشدن توکن ورود بعد از خروج کاربر.
۸. Software and Data Integrity Failures (نواقص یکپارچگی نرمافزار و داده)
زمانی که یک برنامه بدون بررسی صحت (مثلاً امضای دیجیتال) به کتابخانهها، بروزرسانیها، یا دادههای خارجی اعتماد میکند — دری است که میتواند به حملات زنجیرهی تأمین (Supply Chain) منجر شود.
۹. Security Logging and Monitoring Failures (نواقص ثبت رخداد و پایش)
اگر یک نفوذ رخ بدهد ولی هیچ لاگی از آن ثبت نشود، تیم امنیتی هیچوقت متوجه نمیشود که حمله اتفاق افتاده — همین موضوع باعث میشود بسیاری از نفوذها ماهها قبل از کشف شدن، ادامه پیدا کنند.
۱۰. Server-Side Request Forgery – SSRF (جعل درخواست سمت سرور)
زمانی که یک برنامهی وب، بدون اعتبارسنجی کافی، درخواستی را از سمت کاربر به یک آدرس دلخواه (که خود کاربر تعیین میکند) ارسال میکند — و مهاجم از این ویژگی برای رسیدن به منابع داخلی شبکه که نباید از بیرون در دسترس باشند، استفاده میکند.
چرا این فهرست را حفظ نکنیم، بلکه بفهمیم؟
نکتهی مهم این است که این فهرست هر چند سال (آخرینبار در ۲۰۲۱) بازبینی میشود و ترتیب و حتی عناوین تغییر میکنند. آنچه ثابت میماند، طرز فکر پشت آن است: همیشه از دید مهاجم به ورودیهای برنامه نگاه کنید، و همیشه فرض کنید هر دادهای که از کاربر میآید، تا وقتی خلافش ثابت نشود، نامعتبر است. دقیقاً همین طرز فکر، ستون فقرات دورههای امنیت و تست نفوذ من است — قبل از یاد گرفتن هر ابزار، باید این مدل ذهنی جا بیفتد.
وبلاگ