چگونه توانستم در هدف راورو، آسیبپذیری IDOR را کشف کنم؟

آنچه میخوانید، رایتاپ رامین فرجپور، برنامهنویس و محقّق امنیتی، از فرآیند کشف آسیبپذیری IDOR بر روی سامانهی راورو است.
داخل پرانتز:
رامین گزارش مربوط به این رایتاپ را پیش از این در پلتفرم راورو و برای میدان راورو ثبت کرده و آسیبپذیری نیز به طور کامل رفع شده است.
تعریف آسیبپذیری IDOR :
حملات ارجاع مستقیم و ناامن به آبجکت داخلی یا Insecure Direct Object Reference در برنامههای کاربردی وب، یک آسیبپذیری از نوع کنترل دسترسی است که در آن میتوان با ورودی نامعتبر از سمت کاربر، برای دسترسی غیرمجاز به منابع یا عملیاتها استفاده کرد.
شرح آسیبپذیری :
با استفاده از این آسیبپذیری، من قادر بودم با استفاده از session شکارچی در تنظیمات پروفایل میدان، هدف تعریف کنم، هدف را ویرایش کنم و یا حتی هدف را حذف کنم. سامانه را بررسی کردم و متوجه شدم که معماری سامانه از نوع GraphQL است.
GraphQL چیست؟
یک زبان کوئری اوپنسورس است که از سوی فیسبوک توسعه یافته است. این زبان روشی کارآمد برای طراحی، ایجاد و استفاده از APIها در اختیار ما قرار میدهد. GraphQL در اصل یک جایگزین برای REST محسوب میشود.
بررسی سورس کد جاوا اسکریبت و کوئری GraphQL :
خوب برای شروع من ابتدا میبایست تمام سورس کدهایی که سمت میدان در فایل .js وجود دارد را پیدا می کردم. یکی از مهمترین قسمتها این فایل بود:
https://www.ravro.ir/static/targets.js
سپس، با بررسی بیشتر، تمام کوئری های مربوط را پیدا کردم.
حالا از اینجا به بعد نیاز به این داشتم که متغیرهایی که برای درخواست ارسال میشد، را شناسایی کنم.
حذف هدف در کوئری GraphQL:
```javascript
mutation removeTarget($id: ID!) {
removeTarget(id: $id) {
id
_deleted_
}
}
```
مثلا برای این درخواست، ورودی id را دریافت میکنند و طبیعتا میبایستی این ID را از سایت در میآوردم. برای نمونه:
https://www.ravro.ir/target/29
اینجا ID برای میدان راورو 29 است.
افزودن هدف به میدان و ویرایش میدان در کوئری GraphQL :
```javascript
mutation addTarget(
$title: String!,
$type: Int!,
$description: String!,
$allowedScopes: String!,
$allowedCategories: String,
$disallowedScopes: String!,
$paymentConditions: String!,
$acceptable: String!,
$unacceptable: String!,
$accessLevel: Int!,
$active: Int!,
$minReward: Int!,
$maxReward: Int!,
$from: String!,
$to: String!,
$url: String,
$users: String,
$update: ID,
$requiredPoints: Int
) {
addTarget(input: {
update: $update,
title: $title,
description: $description,
allowedCategories: $allowedCategories,
allowedScopes: $allowedScopes,
disallowedScopes: $disallowedScopes,
paymentConditions: $paymentConditions,
acceptable: $acceptable,
unacceptable: $unacceptable,
accessLevel: $accessLevel,
active: $active,
requiredPoints: $requiredPoints,
minReward: $minReward,
maxReward: $maxReward,
from: $from,
users: $users,
to: $to,
url: $url,
type: $type
}){
id
title
type
reward {
max
min
}
accessLevel
version
active
to
from
accepted
}
}
```
در کوئری بالا تمام فیلدهای ارسالی مشخصشده هستند. به عنوان مثال؛ مشخص است که عنوان هدف و توضیح هدف در چه محدودهای مورد قبولاند، چه کاربرانی میتوانند دعوت شوند، میدان فعال باشد یا نه و ...
درخواست ارسالی و پاسخ دریافتشده:
ویدیوی این آسیب پذیری در یوتیوب
ویدیوی این آسیب پذیری در آپارات
سایر رایتاپهای منتشرشده از رامین فرجپور:
چگونه توانستم آسیبپذیری PII را در هدفهای مربوط به سه میدان مختلف کشف کنم؟
چگونه توانستم با تغییر آدرس action در فرم، Form Action Hijacking انجام بدم؟
حملهی HTTP Flooding در تایید ایمیل برای سوءاستفاده بدون دخالت کاربر
سایر رایتاپهای منتشرشده:
چگونه توانستم آسیبپذیری CRLF Injection را بر روی PayPal کشف کنم؟


