سلام من نیما افشاریان هستم و امروز میخوام براتون از خودم و مسیری که طی این چند سال گذروندم بگم و در ادامه صحبت بریم سراغ مطالب فنی رایتاپ . من به تازگی ۱۸ سالم شده و حدود سه سالی هست که وارد کامیونیتی امنیت ایران شدم، حدود یک سال اول فقط و فقط روی برنامه نویسی (بیشتر بکند) کار میکردم و البته در کنارش مطالعههایی هم در مورد گیم هکینگ و باینری و یا رمزنگاری داشتم. دقیقا یک سال و ۷ ماه پیش پنتست وب را شروع کردم و سعی کردم کلی راجب آسیبپذیریهای پیشرفته و مختلف تحقیق کنم و یا روی زیرودیها کار کنم و سعی میکردم همه جا کانکشن بگیرم. خلاصه گذشت و استعدادیابی کلاس یاشار شروع شد چالش Zodd را حل کردم و بورسیه شدم. در حین کلاس چون مطالب رو بلد بودم سعی کردم با روش های مختلف هانت رو هم بصورت جدی و حرفه ای شروع کنم؛ در اون بین یه مدت هم پنتست انجام دادم تو شرکت اما زیاد طول نکشید که در آنجا هم قطع همکاری کردم تا تمام تمرکزم روی هانت باشه، در اواخر کارم با شرکت از طریق یک توییت با صفا (Safa safari) تیم شدم و کلی باهاش صمیمی شدم. بعد یکی دو هفته، صفا من را به تیم هانت و یاشار معرفی کرد و به من گفت که استعداد دارم و همین جمله یه جرقه تو زندگیم و ذهنم زد که باعث شد کلی انگیزه بگیرم و هدف اصلی خودم را بهتر بشناسم. بعد از اینکه صفا منو معرفی کرد، باهام مصاحبه شد و سوابقم در باگ بانتی و پنتست را بررسی کردن و خوشبختانه تونستم وارد قسمت پذیرش تیم هانت Voorivex بشم و تحت کوچینگ محمد نیکوئی قرار بگیرم، هرچند که هنوز بصورت رسمی وارد تیم هانت نشدم و راه زیادی در پیش دارم، اما با این حال این یکی از افتخارات منه که درکنار این دوستان باشم و از تجربیات و علمشون استفاده کنم و یاد بگیرم. قرار شد دوره آزمایشی رو بگذرونم و در آخر اگه نتایجه قابل قبول گرفتم، وارد تیم هانت بشم، که البته توی این مدت تیم هانت هم منو به صورت محدود کوچ کردن.
اول کار وارد دیسکورد تیم هانت شدم (البته به همه قسمتاش دسترسی نداشتم). بعدش یه برنامه انتخاب کردیم و شروع کردم بکار کردن، گزارش کارم رو روزانه توی اکسل مینوشتم و برای محمد میفرستادم. پیدا کردن این دو آسیبپذیری و گزارش کردن و دریافت بانتی برای من کمتر از یک ماه طول کشید که در این مدت من حدودا روزانه 6 ساعت مفید وقت میگذاشتم، اکسل من توی این مدت:
شروع
قبل از هرچیز ما توی مسیری که طی میکنیم به یک عدد محمد نیاز داریم (اشاره به محمد نیکوئی) برای اینکه کلی توی پیدا کردن SQLi ها به ما کمک کنه و اولین SQLi در ردیت را خودش پیدا کنه. خب حالا که محمد را داریم میریم سراغ مسیر شروع تا لحظه کشف آسیبپذیری.
کمی در مورد ریکان و نحوه رسیدن به اندپوینت
اول از هرچیز باید بر روی تارگت مورد نظر ریکان و جمع آوری اطلاعات انجام بدیم، من برای ریکان کردن یک بش اسکریپت دارم که کلی از مسیر ریکان را برای من بصورت اتوماتیک انجام میده. بش اسکریپت من برای پیدا کردن ساب دامین، علاوه بر روش های معمول، دو کار طلایی انجام میده که معمولا همون دو نکته باعث میشه مکان های طلایی برای باگ را پیدا کنیم.
نکته اول: گیتهاب سرچ
نکته دوم: DNS بروت فورس
بعد از اینکه بش اسکریپت ریکانش را انجام داد، من رفتم سراغ ساب دامینها، از بین سابدامینها به یکیشون خیلی مشکوک شدم چون متوجه شدم در اون قسمت، Reddit داره یک فیچر و یک ارائه جدید را به کاربراش نشون میده… در اون قسمت به صورت دستی وارد عمل شدم و سعی کردم تمام اندپوینت ها را بررسی کنم و باشون کار کنم.
موقع کار کردن به دو اندپوینت مشکوک شدم، اندپوینت اول getscore.php?team=name بود که بر اساس مقدار پارامتر team برای ما سرچ می کرد و امتیازات ثبت شده را به ما نشان میداد.
دومین اندپوینت، postscore.php بود که با متد Post کار میکرد و دیتاهایی مانند uid=data و team=name را باید به آن میدادم تا برای ما، داده هایمان را در همان جدول امتیازات getscore.php ثبت کند.
در این دو اندپوینت آسیبپذیری Time-based SQL Injection پیدا شد و اما بریم سراغ نحوه اکسپلویت و شناسایی کردن.
شرح آسیبپذیری
خب قبل از هرچیز ما باید درک درستی از این آسیبپذیری داشته باشیم. آسیبپذیری SQL Injection در کدهای بکند زمانی رخ میدهد که برنامه نویس ورودی سمت کاربر را در کوئری قرار دهد و ما بتوانیم از شرط اصلی خارج شویم و SQL مورد نظر را Inject و اجرا کنیم. خب اما ما چجوری تشخیص بدیم که برنامه داره با دیتابیس تعامل پیدا میکنه؟
اولین شرط تشخیص، درک پیدا کردن از اعمال و شناخت تارگت هست، به عنوان مثال ما در دیتابیس ۴ عمل اصلی CRUD را داریم و اگر در برنامه متوجه بشیم که یکی از این ۴ عمل داره سمت بکند اجرا میشه و بر روی دیتا ها اثر میذاره، میتوانیم شک کنیم که در آنجا با دیتابیس تعامل داریم و تست های SQL Injection و یا NO SQL Injection را در آن قسمت تست کنیم.
خب حالا که من بر اساس کارکرد وبسایت متوجه شده بودم در اندپوینتهایی که پیدا کردم با دیتابیس تعامل دارم، شروع کردم به تست برای درک بهتر از کد های بکند سایت.
در ابتدا با اضافه کردن Single Quite و Double Quotes دیدم که هیچ تغییری در ریسپانس برای من ایجاد نمیشد.
domain.tld/xxx/getscore.php?team=name"
در اینجا من بیخیال نشدم چرا که احتمالات زیادی وجود داشت و میشد حدس زد که در کدهای بکند وبسایت از Try Catch استفاده می شد و ارور هندلینگ انجام میشه. اما این امر فقط باعث میشه من سراغ اکسپلویتهای مرتبط با ریسپانس نرم اما نمیتونه جلوی منو بگیره که تست های Blind رو انجام ندم. من شروع کردم به تست Time-based SQL Injection، چرا که اگر تارگت من نسبت به پیلودها حساس نباشد، تستهای Time-based همه چیز را میتواند برای من روشن کند که آن قسمت آسیبپذیر است یا نه 🙂
من در آنجا با یکدونه ‘ از شرط اصلی برنامه خارج میشدم و بعدش کد های خودم را تزریق میکردم و اما در ادامه بعد از کد های خودم را با دستور – کامنت کنم تا دستور SQL به خوبی اجرا شود و یا در انتهای دستورم دوباره یک ‘ بگذارم تا باقی دستورات نیز بدون اشکال اجرا شود.
نمونه ای از پیلود اجرا شده:
neema'XOR(if(now()=sysdate(),SLEEP(6),0))XOR'Z
در ابتدا کلمه neema به عنوان یک رشته داده می شد و سپس با ‘ از شرط خارج میشیم و بعدش هم با دستور XOR مقادیر بولین را باهم ترکیب میکنیم و در ادامه با دستور (if(now()=sysdate(),SLEEP(6),0) میبینیم که اگر شرط ما درست باشد تابع sleep اجرا میشود و ۶ ثانیه تاخیر میفتد و در غیر این صورت مقدار ۰ برگردانده میشود و XOR بعدی هم برای مخفی کردن بخش های بعدی دستور است و در اخر ‘Z با ‘ به دستورات تزریق شده پایان میدهد و در ادامه یک رشته میدهد تا به باقی کد های sql بکند اضافه شود.
آخرین نکته: این آسیبپذیری را ابزار Sqlmap نمیتوانست شناسایی کند پس از تست های دستی غافل نشید 🙂
روز و روزگارتون امن ❤️
عالی بود رفیق.
کارت خیلی درسته🥰🥰🥰🥰
جالب بود
Great article, I wish you the best Nima
خیلی عالی بود بانتی دادند