چگونه توانستم در هدف راورو، آسیبپذیری IDOR را کشف کنم؟
آنچه میخوانید، رایتاپ رامین فرجپور، برنامهنویس و محقّق امنیتی، از فرآیند کشف آسیبپذیری IDOR بر روی سامانهی راورو است.
داخل پرانتز:
رامین گزارش مربوط به این رایتاپ را پیش از این در پلتفرم راورو و برای میدان راورو ثبت کرده و آسیبپذیری نیز به طور کامل رفع شده است.
تعریف آسیبپذیری IDOR :
حملات ارجاع مستقیم و ناامن به آبجکت داخلی یا Insecure Direct Object Reference در برنامههای کاربردی وب، یک آسیبپذیری از نوع کنترل دسترسی است که در آن میتوان با ورودی نامعتبر از سمت کاربر، برای دسترسی غیرمجاز به منابع یا عملیاتها استفاده کرد.
شرح آسیبپذیری :
با استفاده از این آسیبپذیری، من قادر بودم با استفاده از session شکارچی در تنظیمات پروفایل میدان، هدف تعریف کنم، هدف را ویرایش کنم و یا حتی هدف را حذف کنم. سامانه را بررسی کردم و متوجه شدم که معماری سامانه از نوع GraphQL است.
GraphQL چیست؟
یک زبان کوئری اوپنسورس است که از سوی فیسبوک توسعه یافته است. این زبان روشی کارآمد برای طراحی، ایجاد و استفاده از APIها در اختیار ما قرار میدهد. GraphQL در اصل یک جایگزین برای REST محسوب میشود.
بررسی سورس کد جاوا اسکریبت و کوئری GraphQL :
خوب برای شروع من ابتدا میبایست تمام سورس کدهایی که سمت میدان در فایل .js وجود دارد را پیدا می کردم. یکی از مهمترین قسمتها این فایل بود:
https://www.ravro.ir/static/targets.js
سپس، با بررسی بیشتر، تمام کوئری های مربوط را پیدا کردم.
حالا از اینجا به بعد نیاز به این داشتم که متغیرهایی که برای درخواست ارسال میشد، را شناسایی کنم.
حذف هدف در کوئری GraphQL:
1 2mutation removeTarget($id: ID!) { 3 4removeTarget(id: $id) { 5 6id 7 8 _deleted_ 9 10} 11 12} 13
مثلا برای این درخواست، ورودی id را دریافت میکنند و طبیعتا میبایستی این ID را از سایت در میآوردم. برای نمونه:
https://www.ravro.ir/target/29
اینجا ID برای میدان راورو 29 است.
افزودن هدف به میدان و ویرایش میدان در کوئری GraphQL :
1 2mutation addTarget( 3 4 $title: String!, 5 6 $type: Int!, 7 8$description: String!, 9 10$allowedScopes: String!, 11 12$allowedCategories: String, 13 14$disallowedScopes: String!, 15 16$paymentConditions: String!, 17 18$acceptable: String!, 19 20$unacceptable: String!, 21 22$accessLevel: Int!, 23 24$active: Int!, 25 26$minReward: Int!, 27 28$maxReward: Int!, 29 30$from: String!, 31 32$to: String!, 33 34$url: String, 35 36$users: String, 37 38$update: ID, 39 40$requiredPoints: Int 41 42) { 43 44addTarget(input: { 45 46 update: $update, 47 48title: $title, 49 50description: $description, 51 52allowedCategories: $allowedCategories, 53 54allowedScopes: $allowedScopes, 55 56disallowedScopes: $disallowedScopes, 57 58paymentConditions: $paymentConditions, 59 60acceptable: $acceptable, 61 62unacceptable: $unacceptable, 63 64accessLevel: $accessLevel, 65 66active: $active, 67 68requiredPoints: $requiredPoints, 69 70minReward: $minReward, 71 72maxReward: $maxReward, 73 74from: $from, 75 76users: $users, 77 78to: $to, 79 80url: $url, 81 82type: $type 83 84}){ 85 86id 87 88title 89 90type 91 92reward { 93 94max 95 96min 97 98} 99 100accessLevel 101 102version 103 104active 105 106to 107 108from 109 110accepted 111 112} 113 114} 115 116
در کوئری بالا تمام فیلدهای ارسالی مشخصشده هستند. به عنوان مثال؛ مشخص است که عنوان هدف و توضیح هدف در چه محدودهای مورد قبولاند، چه کاربرانی میتوانند دعوت شوند، میدان فعال باشد یا نه و ...
درخواست ارسالی و پاسخ دریافتشده:
ویدیوی این آسیب پذیری در یوتیوب
ویدیوی این آسیب پذیری در آپارات
سایر رایتاپهای منتشرشده از رامین فرجپور:
چگونه توانستم آسیبپذیری PII را در هدفهای مربوط به سه میدان مختلف کشف کنم؟
چگونه توانستم با تغییر آدرس action در فرم، Form Action Hijacking انجام بدم؟
حملهی HTTP Flooding در تایید ایمیل برای سوءاستفاده بدون دخالت کاربر
سایر رایتاپهای منتشرشده:
چگونه توانستم آسیبپذیری CRLF Injection را بر روی PayPal کشف کنم؟