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

چگونه توانستم در هدف راورو، آسیب‌پذیری 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 انجام بدم؟

چگونه توانستم با پارامتر refurl بر روی وب‌سایت ‌Digikala.com آسیب‌پذیری‌های XSS Stored و XSS Reflected را کشف کنم؟

حمله‌ی HTTP Flooding در تایید ایمیل برای سوءاستفاده بدون دخالت کاربر

سایر رایتاپ‌های منتشرشده:

چگونه توانستم آسیب‌پذیری CRLF Injection را بر روی PayPal کشف کنم؟