سلام دوستان عزیز، امیدوارم حالتون عالی باشه!
باربد هستم، ۱۹ سالمه، و حدود ۳ ساله که در زمینه هانت و یادگیری مفاهیم امنیت سایبری فعالیت میکنم. امروز قصد دارم در این رایتاپ، شما رو با دو آسیبپذیری جالب که بهتازگی در یکی از سامانههای بانکی کشف کردم، آشنا کنم. امیدوارم این تجربه برای شما مفید و الهامبخش باشه.
برداشت مستقیم چیست؟
برداشت مستقیم یا Direct Debit یکی از روشهای پرداخت الکترونیکی است که به کاربر این امکان را میدهد تا به یک شرکت یا سازمان اجازه دهد مبلغ مشخص یا متغیری را در بازههای زمانی معین مستقیماً از حساب بانکی او برداشت کند. این روش معمولاً برای پرداختهای دورهای مانند قبوض، اقساط وام یا اشتراکهای خدماتی مورد استفاده قرار میگیرد.
ویژگیهای اصلی برداشت مستقیم:
- خودکار بودن فرآیند: پس از تنظیم مجوز، پرداختها به صورت خودکار انجام میشوند.
- انعطافپذیری در مبلغ: پرداختها میتوانند ثابت یا متغیر باشند.
- امنیت بالا: تمامی تراکنشها تحت نظارت بانکها و با استفاده از سیستمهای امن انجام میشود.
مزایا:
- صرفهجویی در زمان: دیگر نیازی به یادآوری یا انجام دستی پرداختها نیست.
- کاهش خطاهای انسانی: پرداختها به صورت دقیق و منظم انجام میشود.
- مدیریت بهتر مالی: پرداختهای خودکار مانع از جریمههای ناشی از تأخیر میشوند.
معایب:
- کنترل کمتر بر پرداختها: ممکن است برداشتها در زمانهایی انجام شود که کاربر به بودجه بیشتری نیاز داشته باشد.
- نیاز به هماهنگی اولیه: راهاندازی این سیستم نیازمند تنظیم مجوز و هماهنگی با بانک یا شرکت مربوطه است.
برداشت مستقیم راهکاری ساده و مؤثر برای مدیریت پرداختهای منظم است که هم به کاهش استرسهای مالی کمک میکند و هم باعث صرفهجویی در زمان میشود.
ماجرا از کجا شروع شد؟
متأسفانه به دلیل مسائل امنیتی، نمیتونم اسم سامانه رو بگم. اما داستان از اینجا شروع شد که مشغول تست یکی از سامانههای دیجیتال بانکی بودم. این سامانه امکانات متنوع و جالبی داشت، اما یکی از قابلیتهاش توجه من رو جلب کرد:
قابلیتی که به کاربر اجازه میداد حساب بانکی دیجیتالش رو به حساب بانکی اصلی خودش متصل کنه. (Direct Debit)
این قابلیت چه کاربردی داشت؟
در مواقعی که حساب بانکی دیجیتال کاربر موجودی کافی نداشت، میشد در خریدهای حضوری (صرفاً از طریق دستگاه کارتخوان) مبلغ موردنظر رو از حساب بانکی اصلی برداشت کرد. ایده جالبی به نظر میرسید، اما همین ویژگی، نقطهضعفی داشت که باعث شد مسیر تحقیقات من تغییر کنه.
تست، تست، و باز هم تست!
وقتی شروع به بررسی این قابلیت کردم، دقیقاً نمیدونستم دنبال چی هستم. در ابتدا، صرفاً تستهای معمولی انجام دادم تا به یک پارامتر جالب رسیدم که اسمش redirectUri redirectUri
بود. همونطور که از اسمش پیداست، این پارامتر معمولاً برای انجام ریدایرکت استفاده میشه. بنابراین، تست اولیه من روی Open-Redirect متمرکز شد، و نتیجه؟ موفقیتآمیز بود! بدون هیچ محدودیتی، میشد آدرس رو تغییر داد و ریدایرکت دلخواه انجام داد.
اما این تازه اول ماجرا بود.
هر وقت از یک صفحه، یک آسیبپذیری پیدا میکنم، پیش خودم میگم: “این تنها باگ این صفحه نیست! حتماً چیزای بیشتری داره.” همین موضوع باعث شد عمیقتر روی این قسمت متمرکز بشم.
داستان اصلی…
بعد از بررسی دقیقتر، به یک ریکوئست رسیدم که حاوی دو پارامتر مهم بود:

depositNumber
depositSheba
اینجا بود که نقطهضعف اصلی مشخص شد. اگر مهاجم، شمارهحساب و شبا قربانی رو بهجای شمارهحساب و شبای خودش وارد میکرد، چه اتفاقی میافتاد؟
خب، مهاجم میتونست بهراحتی شمارهحساب و شبا قربانی رو از طریق سامانه اینترنت بانک تبدیل و جایگزین کنه. در نتیجه، حساب بانکی اصلی قربانی به کارت بانکی دیجیتال مهاجم متصل میشد!
نتیجه:
حالا هر زمان که مهاجم با کارت بانکی دیجیتال خودش خریدی انجام میداد، مبلغ از حساب بانکی اصلی قربانی برداشت میشد. البته، سامانه یک محدودیت روزانه داشت: بیش از ۱ میلیون تومان نمیشد از حساب قربانی برداشت کرد.
فرایند بهرهبرداری از باگ
این آسیبپذیری شامل سه سامانه مختلف از بانک X بود که بهصورت زیر با هم تعامل داشتند:
- مهاجم باید تیک فعالسازی قابلیت رو در سامانه دیجیتال بانکی میزد.
- ریدایرکت میشد به سامانه SSO (Single Sign-On).
- پس از احراز هویت، ریدایرکت به سامانه اینترنت بانک برای وارد کردن شمارهحساب و شبا قربانی انجام میشد.
- در مرحله آخر، مهاجم به سامانه اصلی بازمیگشت و مبلغ برداشت روزانه و شمارهحساب دلخواه رو انتخاب میکرد.
تصاویر و ریکوئستها:
در عکس اول، ریکوئستی که کاربر برای تأیید نهایی ارسال کرده و در حال انتقال به بانک دیجیتال هست مشخص شده.
اولین تست حضوری: نتیجهگیری
وقتی حساب بانکی دوستم رو به کارت بانک دیجیتال خودم متصل کردم، برای تست عملکرد، تصمیم گرفتم یک خرید کوچک انجام بدم. اولین بار از طریق اپلیکیشن MyIrancell خواستم شارژ بخرم، اما جواب نداد. واقعاً ناامید شده بودم، چون فکر میکردم کل فرآیند موفق نبوده.
اما ایده جدیدی به ذهنم رسید:
تصمیم گرفتم بهصورت حضوری تست کنم. به یک کافه رفتیم و کارت بانکی دیجیتال خودم (که موجودیش فقط هزار تومان بود) رو برای پرداخت کشیدم. نتیجه شگفتانگیز بود: مبلغ موردنظر با موفقیت از حساب بانکی دوستم برداشت شد!
نتیجهگیری نهایی
این تجربه یکی از جالبترین آسیبپذیریهایی بود که تا به حال کشف کردم. نکته مهمی که اینجا میخوام بهش اشاره کنم اینه که هیچوقت نباید از بررسی عمیق یک باگ ناامید بشید. همیشه ممکنه باگهای دیگهای هم پشت سرش باشن.
ممنون از وقتی که برای مطالعه این رایتاپ گذاشتید. امیدوارم این تجربه برای شما الهامبخش باشه!