فهرست مطالب
- آشنایی با OAuth 2.0: چارچوبی برای تفویض اختیار
- آسیبپذیریهای رایج OAuth 2.0 و نکات کلیدی برای تسترهای امنیتی
- ورود به دنیای OpenID Connect (OIDC): لایه احراز هویت بر بستر OAuth 2.0
- آسیبپذیریهای رایج OpenID Connect و نکات تست
- استراتژیهای تست امنیت API برای OAuth 2.0 و OIDC
- بهترین شیوهها برای پیادهسازی امن OAuth 2.0 و OIDC (برای ارجاع تسترها)
- نتیجهگیری
- سوالات متداول
در دنیای امروز که نرمافزارها و سرویسهای آنلاین به سرعت در حال گسترش هستند، رابطهای برنامهنویسی کاربردی (API) نقشی حیاتی در تبادل اطلاعات و ارائه خدمات ایفا میکنند. با افزایش اهمیت APIها، تامین امنیت آنها نیز به یکی از دغدغههای اصلی توسعهدهندگان و متخصصان امنیت تبدیل شده است. پروتکلهای OAuth 2.0 و OpenID Connect به عنوان استانداردهایی قدرتمند برای مدیریت دسترسی و احراز هویت در APIها مطرح شدهاند. درک عمیق این پروتکلها و آسیبپذیریهای بالقوه آنها برای تسترهای امنیت API ضروری است تا بتوانند به طور موثر نقاط ضعف امنیتی را شناسایی و گزارش کنند.
این مقاله با هدف ارائه یک راهنمای جامع و کاربردی برای تسترهای امنیت API، به بررسی دقیق پروتکلهای OAuth 2.0 و OpenID Connect، جریانهای مختلف آنها، آسیبپذیریهای رایج و استراتژیهای تست نفوذ مرتبط میپردازد.
آشنایی با OAuth 2.0: چارچوبی برای تفویض اختیار
OAuth 2.0 یک چارچوب تفویض اختیار (Authorization Framework) است که به برنامههای کاربردی ثالث اجازه میدهد به منابع محافظتشده یک کاربر در یک سرویس وب دسترسی پیدا کنند، بدون اینکه نیاز به دانستن نام کاربری و رمز عبور کاربر باشد. این پروتکل بر اساس مفهوم “توکن دسترسی” (Access Token) عمل میکند که مجوزی محدود و موقت برای دسترسی به منابع خاص است.
نقشهای کلیدی در OAuth 2.0:
- صاحب منبع (Resource Owner): معمولاً کاربر نهایی است که مالک دادهها و منابع محافظتشده است و به کلاینت اجازه دسترسی به این منابع را میدهد.
- کلاینت (Client): برنامه کاربردی (مانند یک اپلیکیشن موبایل یا وبسایت) که قصد دارد به نمایندگی از صاحب منبع، به منابع محافظتشده او دسترسی پیدا کند.
- سرور مجوزدهی (Authorization Server): سروری که هویت صاحب منبع را تأیید کرده و در صورت موفقیت، توکن دسترسی را برای کلاینت صادر میکند. این سرور قلب تپنده OAuth 2.0 است.
- سرور منابع (Resource Server): سروری که منابع محافظتشده را میزبانی میکند و درخواستهای دارای توکن دسترسی معتبر از سوی کلاینت را میپذیرد و به آنها پاسخ میدهد.
جریانهای اعطای مجوز (Grant Types) در OAuth 2.0:
OAuth 2.0 چندین جریان یا “Grant Type” برای دریافت توکن دسترسی تعریف میکند که هر کدام برای سناریوهای مختلفی مناسب هستند. انتخاب جریان صحیح، تأثیر مستقیمی بر امنیت و تجربه کاربری دارد.
- جریان کد مجوزدهی (Authorization Code Grant): امنترین و پرکاربردترین جریان، خصوصاً برای برنامههای کاربردی تحت وب (Server-Side Web Apps) و برنامههای موبایل. در این جریان، سرور مجوزدهی یک “کد مجوزدهی” موقت به کلاینت میدهد که سپس کلاینت این کد را با شناسه و راز کلاینت (Client ID & Client Secret) به سرور مجوزدهی ارسال کرده و توکن دسترسی را دریافت میکند. استفاده از PKCE (Proof Key for Code Exchange) در این جریان برای برنامههای عمومی (Public Clients) مانند اپلیکیشنهای موبایل به شدت توصیه میشود تا از حملات سرقت کد مجوزدهی جلوگیری شود.
- جریان ضمنی (Implicit Grant): این جریان سادهتر برای برنامههای کاربردی سمت کاربر (Client-Side Applications) مانند برنامههای تکصفحهای (SPA) طراحی شده بود، اما به دلیل مسائل امنیتی (مانند قرار گرفتن توکن در URL و تاریخچه مرورگر) کمتر توصیه میشود. در این جریان، توکن دسترسی مستقیماً به کلاینت بازگردانده میشود.
- جریان اعتبارنامه کلاینت (Client Credentials Grant): زمانی استفاده میشود که کلاینت به نمایندگی از خودش (و نه یک کاربر خاص) به منابع دسترسی پیدا میکند. این جریان برای ارتباطات ماشین به ماشین (M2M) مناسب است.
- جریان اعتبارنامه صاحب منبع (Resource Owner Password Credentials Grant – ROPC): در این جریان، کلاینت مستقیماً نام کاربری و رمز عبور کاربر را دریافت کرده و به سرور مجوزدهی ارسال میکند. به دلیل ریسکهای امنیتی بالا و نقض اصل عدم اشتراکگذاری مستقیم اعتبارنامه، استفاده از این جریان به شدت محدود شده و تنها در موارد خاص و با اعتماد کامل به کلاینت مجاز است.
- جریان توکن تازهسازی (Refresh Token Grant): برای دریافت توکن دسترسی جدید پس از منقضی شدن توکن دسترسی فعلی، بدون نیاز به احراز هویت مجدد کاربر، از توکن تازهسازی (Refresh Token) استفاده میشود.
توکنهای دسترسی و توکنهای تازهسازی:
- توکن دسترسی (Access Token): رشتهای است که توسط سرور مجوزدهی صادر شده و به کلاینت اجازه میدهد به منابع خاصی از طرف صاحب منبع دسترسی پیدا کند. این توکنها معمولاً عمر کوتاهی دارند.
- توکن تازهسازی (Refresh Token): رشتهای است که همراه با توکن دسترسی (معمولاً در جریان کد مجوزدهی) صادر میشود و برای دریافت توکن دسترسی جدید پس از انقضای توکن فعلی به کار میرود. توکنهای تازهسازی عمر طولانیتری دارند و باید به دقت محافظت شوند.
آسیبپذیریهای رایج OAuth 2.0 و نکات کلیدی برای تسترهای امنیتی
تسترهای امنیت API باید با دقت جریانهای OAuth 2.0 را بررسی کرده و به دنبال آسیبپذیریهای رایج باشند:
- پیکربندی ضعیف URI بازگشتی (Redirect URI):
- آسیبپذیری: اگر URI بازگشتی به درستی اعتبارسنجی نشود (مثلاً استفاده از الگوهای ضعیف یا عدم تطابق دقیق)، مهاجم میتواند کد مجوزدهی یا توکن دسترسی را به یک دامنه تحت کنترل خود هدایت کند (Open Redirector).
- نکات تست: بررسی کنید که آیا سرور مجوزدهی فقط URIهای بازگشتی از پیش ثبتشده و با تطابق دقیق را میپذیرد یا خیر. تلاش برای استفاده از زیردامنههای غیرمجاز، پارامترهای اضافی در URI یا تغییر پروتکل (HTTP به جای HTTPS) را امتحان کنید.
- جعل درخواست بین سایتی (CSRF) در جریان مجوزدهی:
- آسیبپذیری: اگر پارامتر
state
به درستی استفاده و اعتبارسنجی نشود، مهاجم میتواند یک درخواست مجوزدهی جعلی را از طرف کاربر قربانی آغاز کند. - نکات تست: بررسی کنید که پارامتر
state
در درخواست اولیه به سرور مجوزدهی ارسال شده و در پاسخ به URI بازگشتی، مقدار آن با مقدار اولیه مطابقت دارد. مقدارstate
باید غیرقابل پیشبینی و منحصر به هر جلسه باشد.
- آسیبپذیری: اگر پارامتر
- نشت توکن دسترسی:
- آسیبپذیری: توکنهای دسترسی ممکن است از طریق تاریخچه مرورگر (در جریان ضمنی)، لاگهای سرور، هدر Referer یا از طریق اسکریپتهای مخرب در سمت کلاینت نشت کنند.
- نکات تست: بررسی کنید که توکنها از طریق HTTPS منتقل میشوند. در جریان ضمنی، بررسی کنید آیا توکن در URL fragment قرار دارد و آیا امکان دسترسی به آن از طریق اسکریپتها محدود شده است. به دنبال نشت توکن در لاگها و هدرهای HTTP باشید.
- عدم اعتبارسنجی صحیح دامنه (Scope):
- آسیبپذیری: اگر سرور منابع یا کلاینت به درستی دامنههای درخواستی و اعطا شده را بررسی نکنند، ممکن است کلاینت به منابعی فراتر از مجوز خود دسترسی پیدا کند.
- نکات تست: بررسی کنید که کلاینت فقط دامنههای مورد نیاز خود را درخواست میکند و سرور مجوزدهی فقط دامنههای مجاز را اعطا میکند. همچنین، سرور منابع باید دامنه توکن دسترسی را قبل از ارائه سرویس بررسی کند.
- افشای راز کلاینت (Client Secret Leakage):
- آسیبپذیری: راز کلاینت در کلاینتهای عمومی (مانند SPAها یا اپلیکیشنهای موبایل) نباید ذخیره شود، زیرا به راحتی قابل استخراج است. افشای راز کلاینت در کلاینتهای محرمانه (Confidential Clients) نیز یک ریسک بزرگ است.
- نکات تست: در کلاینتهای عمومی، بررسی کنید که آیا از PKCE استفاده میشود و راز کلاینت در کد برنامه جاسازی نشده است. در کلاینتهای محرمانه، به دنبال راههایی برای دسترسی به راز کلاینت (مانند پیکربندیهای نادرست سرور) باشید.
- رهگیری یا سرقت کد مجوزدهی:
- آسیبپذیری: در صورت عدم استفاده از PKCE، مهاجمی که بتواند ترافیک بین کلاینت و سرور مجوزدهی را شنود کند (مثلاً از طریق بدافزار یا شبکههای ناامن)، میتواند کد مجوزدهی را سرقت کرده و با آن توکن دسترسی دریافت کند.
- نکات تست: بررسی کنید آیا جریان کد مجوزدهی، به خصوص برای کلاینتهای عمومی، از PKCE استفاده میکند. پارامترهای
code_challenge
وcode_verifier
باید به درستی پیادهسازی شده باشند.
- حملات مربوط به توکن تازهسازی:
- آسیبپذیری: سرقت توکن تازهسازی میتواند به مهاجم اجازه دهد به طور مداوم توکنهای دسترسی جدید دریافت کند. همچنین، عدم ابطال توکنهای تازهسازی پس از شناسایی نشت یا در زمان خروج کاربر، یک ضعف امنیتی است.
- نکات تست: بررسی کنید که توکنهای تازهسازی چگونه ذخیره و محافظت میشوند. آیا مکانیزمی برای تشخیص سرقت توکن تازهسازی (مانند Refresh Token Rotation) وجود دارد؟ آیا توکنهای تازهسازی پس از استفاده یا در شرایط خاص باطل میشوند؟
- حملات بازپخش (Replay Attacks):
- آسیبپذیری: اگر کد مجوزدهی یا توکن دسترسی پس از یک بار استفاده، مجدداً قابل استفاده باشند، مهاجم میتواند درخواستهای معتبر قبلی را بازپخش کند.
- نکات تست: بررسی کنید که آیا کدهای مجوزدهی پس از اولین استفاده باطل میشوند. عمر توکنهای دسترسی باید محدود باشد.
- عدم محافظت کافی از پارامتر
state
:- آسیبپذیری: علاوه بر CSRF، اگر پارامتر
state
قابل پیشبینی باشد یا به درستی به جلسه کاربر متصل نشود، میتواند منجر به سایر حملات مرتبط با جلسه شود. - نکات تست: اطمینان حاصل کنید که مقدار
state
به صورت تصادفی و برای هر درخواست منحصر به فرد تولید میشود و به جلسه کاربر در سمت کلاینت گره خورده است.
- آسیبپذیری: علاوه بر CSRF، اگر پارامتر
ورود به دنیای OpenID Connect (OIDC): لایه احراز هویت بر بستر OAuth 2.0
OpenID Connect (OIDC) یک لایه ساده هویتی بر روی پروتکل OAuth 2.0 است. OIDC به کلاینتها اجازه میدهد هویت کاربر نهایی را بر اساس احراز هویت انجام شده توسط یک سرور مجوزدهی تأیید کنند، و همچنین اطلاعات اولیه پروفایل کاربر را به روشی قابل تعامل و شبیه به REST دریافت کنند.
تفاوت اصلی OIDC با OAuth 2.0:
- OAuth 2.0: برای مجوزدهی (Authorization) طراحی شده است (یعنی چه کارهایی را یک برنامه میتواند انجام دهد).
- OIDC: برای احراز هویت (Authentication) طراحی شده است (یعنی کاربر کیست).
OIDC با افزودن یک توکن شناسایی (ID Token) و یک نقطه پایانی اطلاعات کاربر (UserInfo Endpoint)، قابلیتهای احراز هویت را به OAuth 2.0 اضافه میکند.
مفاهیم کلیدی در OIDC:
- توکن شناسایی (ID Token): یک توکن وب JSON (JWT) است که حاوی اطلاعاتی (Claims) درباره نتیجه احراز هویت کاربر و خود کاربر است (مانند شناسه کاربر، زمان احراز هویت، صادرکننده توکن و …). این توکن توسط سرور مجوزدهی امضا میشود و کلاینت میتواند امضای آن را برای تأیید اصالت بررسی کند.
- نقطه پایانی اطلاعات کاربر (UserInfo Endpoint): یک منبع محافظتشده با OAuth 2.0 است که اطلاعات بیشتری درباره کاربر (مانند نام، ایمیل، عکس پروفایل و …) را در صورت درخواست و با داشتن توکن دسترسی معتبر، به کلاینت ارائه میدهد.
- دامنههای (Scopes) استاندارد OIDC: علاوه بر دامنههای OAuth 2.0، OIDC دامنههایی مانند
openid
(برای درخواست احراز هویت و دریافت ID Token)،profile
،email
،address
وphone
را برای درخواست اطلاعات خاص کاربر تعریف میکند.
جریانهای OIDC:
جریانهای OIDC مشابه جریانهای OAuth 2.0 هستند (مانند Authorization Code Flow، Implicit Flow، Hybrid Flow) اما با این تفاوت که در پاسخ، علاوه بر توکن دسترسی، یک ID Token نیز ممکن است بازگردانده شود.
آسیبپذیریهای رایج OpenID Connect و نکات تست
بسیاری از آسیبپذیریهای OAuth 2.0 در OIDC نیز کاربرد دارند. علاوه بر آنها، تسترهای امنیتی باید به موارد زیر نیز توجه کنند:
- مشکلات اعتبارسنجی ID Token:
- آسیبپذیری: اگر کلاینت به درستی امضا، تاریخ انقضا، صادرکننده (iss)، مخاطب (aud) و سایر Claims مهم ID Token را اعتبارسنجی نکند، مهاجم میتواند ID Tokenهای جعلی یا دستکاریشده ارسال کند.
- نکات تست: بررسی کنید که آیا الگوریتم امضا (alg) به درستی بررسی میشود (به خصوص حمله
alg=none
). آیا سایر Claims حیاتی مانندiss
،aud
،exp
،iat
،nonce
(در صورت استفاده) به درستی اعتبارسنجی میشوند؟
- مدیریت ناامن
jwks_uri
:- آسیبپذیری: اگر کلاینت کلید عمومی را برای اعتبارسنجی امضای ID Token از یک
jwks_uri
(JSON Web Key Set URI) ناامن دریافت کند یا آن را به درستی اعتبارسنجی نکند، مهاجم میتواند کلید جعلی ارائه دهد. - نکات تست: بررسی کنید که
jwks_uri
از طریق HTTPS بارگذاری میشود و از یک منبع معتبر است.
- آسیبپذیری: اگر کلاینت کلید عمومی را برای اعتبارسنجی امضای ID Token از یک
- پیکربندی نادرست ثبت کلاینت:
- آسیبپذیری: محدودیتهای ضعیف در ثبت کلاینت (مانند اجازه استفاده از URIهای بازگشتی بسیار گسترده) میتواند منجر به سوءاستفاده شود.
- نکات تست: فرآیند ثبت کلاینت و پارامترهای مجاز برای کلاینتها را بررسی کنید.
- نشت اطلاعات از طریق ID Token:
- آسیبپذیری: اگر ID Token حاوی اطلاعات حساس بیش از حدی باشد و به طور ناامن منتقل یا ذخیره شود، میتواند منجر به نشت اطلاعات شود.
- نکات تست: محتویات ID Token را بررسی کرده و از ضرورت وجود هر Claim اطمینان حاصل کنید.
- حملات علیه UserInfo Endpoint:
- آسیبپذیری: این نقطه پایانی باید به درستی با توکن دسترسی محافظت شود و فقط اطلاعات مجاز بر اساس دامنههای اعطا شده را بازگرداند.
- نکات تست: تلاش برای دسترسی به UserInfo Endpoint بدون توکن معتبر یا با توکنی که دارای دامنههای لازم نیست. بررسی کنید که آیا محدودیت نرخ (Rate Limiting) برای جلوگیری از استخراج اطلاعات وجود دارد.
استراتژیهای تست امنیت API برای OAuth 2.0 و OIDC
یک تستر امنیت API باید رویکردی چندلایه برای ارزیابی امنیت پیادهسازیهای OAuth 2.0 و OIDC داشته باشد:
- شناسایی و جمعآوری اطلاعات (Reconnaissance):
- شناسایی نقاط پایانی OAuth/OIDC (مانند
/authorize
,/token
,/userinfo
,/jwks_uri
). - شناسایی Client IDها (گاهی در کد جاوااسکریپت کلاینت قابل مشاهده است).
- شناسایی Redirect URIهای ثبتشده (با آزمون و خطا یا از طریق مستندات).
- بررسی مستندات API و سرور مجوزدهی.
- شناسایی نقاط پایانی OAuth/OIDC (مانند
- تحلیل درخواستها و پاسخها:
- استفاده از ابزارهای پروکسی مانند Burp Suite یا OWASP ZAP برای رهگیری و تحلیل تمام ترافیک مربوط به جریانهای OAuth/OIDC.
- توجه ویژه به پارامترهایی مانند
response_type
,client_id
,redirect_uri
,scope
,state
,code
,grant_type
,access_token
,refresh_token
,id_token
.
- تست اعتبارسنجی Redirect URI:
- تلاش برای تزریق URIهای بازگشتی با دامنهها، پورتها یا مسیرهای متفاوت.
- استفاده از کاراکترهای خاص یا الگوهای wildcard در URI.
- تست حفاظت در برابر CSRF (پارامتر
state
):- حذف یا تغییر پارامتر
state
. - استفاده مجدد از یک مقدار
state
معتبر.
- حذف یا تغییر پارامتر
- تست مدیریت و ذخیرهسازی توکن:
- بررسی نحوه انتقال توکنها (باید همیشه از طریق HTTPS باشد).
- بررسی نحوه ذخیرهسازی توکنها در سمت کلاینت (localStorage, sessionStorage, cookies) و ریسکهای مرتبط (XSS).
- بررسی عمر توکنهای دسترسی و تازهسازی.
- تست اعتبارسنجی Scope:
- درخواست دامنههایی که کلاینت مجاز به استفاده از آنها نیست.
- تلاش برای دسترسی به منابع با توکنی که دارای Scope لازم نیست.
- تست آسیبپذیریهای JWT (برای ID Token و گاهی Access Token):
- تست حمله
alg=none
. - تست تغییر الگوریتم امضا (مثلاً از RS256 به HS256 با کلید عمومی به عنوان راز).
- بررسی اعتبار امضا، تاریخ انقضا، صادرکننده و سایر Claims.
- جستجو برای کلیدهای ضعیف یا افشاشده.
- تست حمله
- تست پیادهسازی توکن تازهسازی:
- تلاش برای استفاده مجدد از توکن تازهسازی پس از دریافت توکن دسترسی جدید.
- بررسی اینکه آیا توکنهای تازهسازی پس از یک دوره زمانی مشخص یا پس از رویدادهای امنیتی باطل میشوند.
- تست PKCE (Proof Key for Code Exchange):
- در صورت استفاده، بررسی کنید که آیا
code_challenge
وcode_verifier
به درستی تولید و اعتبارسنجی میشوند. - تلاش برای تکمیل جریان کد مجوزدهی بدون پارامترهای PKCE (برای کلاینتهایی که باید از آن استفاده کنند).
- در صورت استفاده، بررسی کنید که آیا
- فازینگ (Fuzzing) پارامترهای OAuth/OIDC:
- ارسال مقادیر غیرمنتظره، طولانی یا با فرمت نادرست به پارامترهای مختلف برای شناسایی خطاهای پردازشی یا آسیبپذیریهای احتمالی.
- بررسی مستندات و پیکربندیها:
- مقایسه پیادهسازی واقعی با مستندات ارائه شده و بهترین شیوههای امنیتی.
- جستجو برای پیکربندیهای پیشفرض ناامن در سرور مجوزدهی.
بهترین شیوهها برای پیادهسازی امن OAuth 2.0 و OIDC (برای ارجاع تسترها)
دانستن بهترین شیوهها به تسترها کمک میکند تا انحرافات از آنها را به عنوان نقاط ضعف بالقوه شناسایی کنند:
- استفاده از جریان کد مجوزدهی (Authorization Code Grant) به همراه PKCE: این امنترین جریان برای اکثر برنامههای کاربردی است.
- اعتبارسنجی دقیق و کامل Redirect URI: فقط URIهای از پیش ثبتشده و با تطابق دقیق باید پذیرفته شوند.
- استفاده صحیح و اعتبارسنجی پارامتر
state
: برای جلوگیری از حملات CSRF. - کوتاه نگه داشتن عمر توکنهای دسترسی: و استفاده از توکنهای تازهسازی برای تمدید دسترسی.
- محافظت دقیق از راز کلاینت (Client Secret) و توکنها: به خصوص توکنهای تازهسازی. راز کلاینت هرگز نباید در کلاینتهای عمومی (مانند اپلیکیشنهای موبایل یا SPA) ذخیره شود.
- پیادهسازی دقیق و محدود دامنه (Scope): اصل حداقل دسترسی (Principle of Least Privilege) باید رعایت شود.
- اعتبارسنجی کامل ID Token در OIDC: شامل امضا، صادرکننده، مخاطب، تاریخ انقضا و
nonce
. - استفاده از HTTPS برای تمام ارتباطات.
- آموزش کاربران در مورد ریسکهای فیشینگ و اعطای مجوز به برنامههای نامعتبر.
- انجام بازبینیهای امنیتی منظم و تست نفوذ.
نتیجهگیری
OAuth 2.0 و OpenID Connect چارچوبهای قدرتمندی هستند که ستون فقرات بسیاری از سیستمهای مجوزدهی و احراز هویت مدرن را تشکیل میدهند. با این حال، پیچیدگی ذاتی و تنوع جریانها و پیکربندیهای آنها میتواند منجر به پیادهسازیهای ناامن شود. برای تسترهای امنیت API، درک عمیق این پروتکلها، شناسایی نقاط ضعف رایج و به کارگیری استراتژیهای تست موثر، امری حیاتی است. با رویکردی دقیق و هوشمندانه، متخصصان امنیت میتوانند به سازمانها در جهت ایمنسازی APIها و محافظت از دادههای کاربران یاری رسانند و از بروز حملات مخرب جلوگیری کنند. این حوزه به طور مداوم در حال تحول است و یادگیری مستمر برای همگام شدن با جدیدترین تهدیدات و تکنیکهای دفاعی ضروری است.
سوالات متداول
OAuth 2.0 یک چارچوب مجوزدهی است که به برنامهها اجازه میدهد به منابع کاربر در یک سرویس دیگر دسترسی پیدا کنند (مثلاً یک برنامه ویرایش عکس به عکسهای شما در گوگل فوتو دسترسی پیدا کند). OpenID Connect یک لایه احراز هویت بر روی OAuth 2.0 است که به برنامهها امکان میدهد هویت کاربر را تأیید کنند (مثلاً با استفاده از حساب گوگل خود وارد یک سایت دیگر شوید) و اطلاعات پروفایل او را دریافت کنند. OIDC از یک ID Token (JWT) برای انتقال اطلاعات احراز هویت استفاده میکند.
state
در OAuth 2.0 اهمیت دارد و چگونه باید تست شود؟ پارامتر state
برای جلوگیری از حملات جعل درخواست بین سایتی (CSRF) در جریان مجوزدهی OAuth 2.0 حیاتی است. کلاینت باید یک مقدار تصادفی و غیرقابل پیشبینی برای state
تولید کرده و در درخواست به سرور مجوزدهی ارسال کند. سرور مجوزدهی باید این مقدار را بدون تغییر به Redirect URI بازگرداند. کلاینت سپس باید مقدار state
دریافتی را با مقدار اولیه ارسال شده مقایسه کند.
برای تست: سعی کنید پارامتر state
را حذف کنید، مقدار آن را تغییر دهید، یا از یک مقدار state
که قبلاً استفاده شده، مجدداً استفاده کنید. بررسی کنید که آیا سرور مجوزدهی یا کلاینت این تغییرات را تشخیص داده و خطا برمیگردانند یا خیر
PKCE یک افزونه امنیتی برای جریان کد مجوزدهی (Authorization Code Grant) در OAuth 2.0 است. این مکانیزم برای جلوگیری از حملات سرقت کد مجوزدهی (Authorization Code Interception) طراحی شده است، به خصوص برای کلاینتهای عمومی (Public Clients) مانند اپلیکیشنهای موبایل و برنامههای تکصفحهای (SPA) که نمیتوانند به طور امن راز کلاینت (Client Secret) را ذخیره کنند.
نحوه کار: کلاینت یک رشته تصادفی به نام code_verifier
ایجاد میکند. سپس یک نسخه هششده و رمزنگاری شده از آن به نام code_challenge
به همراه متد رمزنگاری (code_challenge_method
) را در درخواست اولیه به سرور مجوزدهی ارسال میکند. پس از دریافت کد مجوزدهی، کلاینت هنگام درخواست توکن دسترسی، code_verifier
اصلی را ارسال میکند. سرور مجوزدهی code_verifier
را با code_challenge
دریافتی در مرحله اول مقایسه میکند تا مطمئن شود درخواست از همان کلاینت معتبر است.
اهمیت: بدون PKCE، اگر یک برنامه مخرب روی دستگاه کاربر بتواند کد مجوزدهی را (مثلاً از طریق URI سفارشی در موبایل) رهگیری کند، میتواند با آن توکن دسترسی دریافت کند. PKCE تضمین میکند که فقط کلاینتی که code_verifier
را دارد میتواند کد مجوزدهی را با توکن مبادله کند.
یکی از رایجترین و در عین حال خطرناکترین آسیبپذیریها، پیکربندی نادرست URI بازگشتی (Redirect URI) است. اگر سرور مجوزدهی اعتبارسنجی دقیقی روی Redirect URI انجام ندهد (مثلاً اجازه دهد دامنههای فرعی دلخواه یا مسیرهای باز استفاده شوند)، مهاجمان میتوانند کاربران را به یک سایت مخرب هدایت کرده و کد مجوزدهی یا حتی توکن دسترسی را سرقت کنند. این میتواند منجر به دسترسی غیرمجاز کامل به حساب کاربری قربانی در سرویس مورد نظر شود.
امنیت ID Token که معمولاً یک JWT (JSON Web Token) است، بسیار حیاتی است. برای تست آن:
اعتبارسنجی امضا: بررسی کنید که آیا امضای توکن به درستی توسط کلاینت اعتبارسنجی میشود. تست کنید که آیا الگوریتم alg
در هدر JWT بررسی میشود (مثلاً تلاش برای حمله alg=none
یا تغییر الگوریتم به HS256 با استفاده از کلید عمومی به عنوان راز).
اعتبارسنجی Claims: بررسی کنید که Claims استاندارد مانند iss
(صادرکننده)، aud
(مخاطب)، exp
(تاریخ انقضا)، iat
(زمان صدور) و nonce
(در صورت استفاده برای جلوگیری از حملات بازپخش) به درستی توسط کلاینت اعتبارسنجی میشوند.
انتقال امن: مطمئن شوید ID Token همیشه از طریق HTTPS منتقل میشود.
حساسیت اطلاعات: بررسی کنید که ID Token حاوی اطلاعات حساس بیش از حد ضروری نباشد.
بیشتر بخوانید: