diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php new file mode 100644 index 0000000..5bea0a5 --- /dev/null +++ b/app/Http/Controllers/UserController.php @@ -0,0 +1,105 @@ +route('login'); + } + + // ========================================== + // راه‌اندازی آزمایشگاه + // ========================================== + public function setupLab() + { + User::firstOrCreate( + ['email' => 'victim@webapp.kr-rezvan.ir'], + [ + 'name' => 'کاربر قربانی', + 'password' => Hash::make('12345678') + ] + ); + + return "
+

آزمایشگاه آماده شد! 🧪

+

کاربر هدف (victim@webapp.kr-rezvan.ir) با رمز عبور (12345678) در دیتابیس ساخته شد.

+ رفتن به صفحه لاگین +
"; + } + + // ========================================== + // نمایش فرم ورود + // ========================================== + public function showLogin() + { + return view('user.login'); + } + + // ========================================== + // پردازش ورود کاربر + // ========================================== + public function login(Request $request) + { + $credentials = $request->only('email', 'password'); + + if (Auth::attempt($credentials)) { + return redirect()->route('user.profile'); + } + + return back()->withErrors(['message' => 'اطلاعات ورود صحیح نیست.']); + } + + // ========================================== + // خروج کاربر + // ========================================== + public function logout() + { + Auth::logout(); + return redirect()->route('login'); + } + + // ========================================== + // نمایش پروفایل کاربری + // ========================================== + public function profile() + { + return view('user.profile', ['user' => Auth::user()]); + } + + // ========================================== + // متد آسیب‌پذیر تغییر ایمیل (CSRF Target) + // ========================================== + public function updateEmail(Request $request) + { + // بررسی اعتبار کوکی نشست (آیا SameSite اجازه ارسال کوکی را داده است؟) + if (!Auth::check()) { + return response()->json([ + 'error' => 'شما لاگین نیستید. مرورگر کوکی نشست را بلاک کرده است! (محافظت SameSite عمل کرد)' + ], 401); + } + + $user = Auth::user(); + $oldEmail = $user->email; + + // اعمال تغییرات مخرب در دیتابیس + $user->email = $request->input('email'); + $user->save(); + + return response()->json([ + 'status' => 'success', + 'message' => 'حمله موفق! ایمیل کاربر در دیتابیس تغییر یافت.', + 'old_email' => $oldEmail, + 'new_email' => $user->email + ]); + } +} \ No newline at end of file diff --git a/resources/views/user/login.blade.php b/resources/views/user/login.blade.php new file mode 100644 index 0000000..9e7d2ac --- /dev/null +++ b/resources/views/user/login.blade.php @@ -0,0 +1,39 @@ + + + + + ورود به سیستم | آزمایشگاه امنیت + + + + +
+

ورود به حساب کاربری

+ + @if($errors->any()) +
{{ $errors->first() }}
+ @endif + +
+ + @csrf + + + + + +
+ +

برای تنظیم اولیه پایگاه داده اینجا کلیک کنید.

+
+ + + \ No newline at end of file diff --git a/resources/views/user/profile.blade.php b/resources/views/user/profile.blade.php new file mode 100644 index 0000000..f3f6ffa --- /dev/null +++ b/resources/views/user/profile.blade.php @@ -0,0 +1,7 @@ +
+

پنل کاربری (سایت قربانی)

+

سلام {{ $user->name }} خوش آمدید.

+

ایمیل فعلی شما: {{ $user->email }}

+
+ خروج از سیستم +
\ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 476ec11..fdcc7b9 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,59 +1,41 @@ 'victim@webapp.kr-rezvan.ir'], - [ - 'name' => 'کاربر قربانی', - 'password' => Hash::make('12345678') - ] - ); - return "آزمایشگاه آماده شد! کاربر هدف (victim@webapp.kr-rezvan.ir) در دیتابیس ساخته شد."; +// ========================================== +// صفحه اصلی +// ========================================== +Route::get('/', [UserController::class, 'home'])->name('home'); + + +// ========================================== +// ۱. راه‌اندازی سریع آزمایشگاه (مرحله اول) +// ========================================== +Route::get('/setup-lab', [UserController::class, 'setupLab'])->name('setup.lab'); + + +// ========================================== +// ۲. سیستم احراز هویت (Authentication) +// ========================================== +Route::get('/login', [UserController::class, 'showLogin'])->name('login'); +Route::post('/login', [UserController::class, 'login'])->name('login.submit'); +// نکته امنیتی: خروج در حالت استاندارد باید POST باشد اما برای راحتی تست در لابراتوار GET قرار دادیم +Route::get('/logout', [UserController::class, 'logout'])->name('logout'); + + +// ========================================== +// ۳. پنل کاربری (محافظت شده با نشست) +// ========================================== +Route::middleware(['web', 'auth'])->group(function () { + Route::get('/profile', [UserController::class, 'profile'])->name('user.profile'); }); -// ۲. شبیه‌سازی ورود کاربر به سیستم -Route::get('/login-victim', function () { - if (Auth::attempt(['email' => 'victim@webapp.kr-rezvan.ir', 'password' => '12345678'])) { - return "هویت شما تایید شد. کوکی نشست صادر و در دیتابیس ثبت گردید."; - } - return "خطا در ورود."; -}); -// ۳. بررسی وضعیت پروفایل (برای بررسی موفقیت‌آمیز بودن حمله) -Route::get('/profile', function () { - if (Auth::check()) { - return "شما لاگین هستید. ایمیل فعلی شما: " . Auth::user()->email . ""; - } - return "شما لاگین نیستید! (احتمالاً کوکی به درستی ارسال نشده است)."; -}); - -// ۴. نقطه آسیب‌پذیر (هدف حمله CSRF) -Route::post('/update-email', function (Request $request) { - // اگر کوکی معتبر ارسال نشود، لاراول این کاربر را ناشناس می‌داند - if (!Auth::check()) { - return response()->json(['error' => 'دسترسی غیرمجاز. مرورگر کوکی نشست را ارسال نکرد.'], 401); - } - - $user = Auth::user(); - $oldEmail = $user->email; - - // تغییر در دیتابیس واقعی - $user->email = $request->input('email'); - $user->save(); - - return response()->json([ - 'status' => 'success', - 'message' => 'ایمیل در دیتابیس تغییر یافت!', - 'old' => $oldEmail, - 'new' => $user->email, - 'session_id' => session()->getId() - ]); -})->withoutMiddleware([VerifyCsrfToken::class]); \ No newline at end of file +// ========================================== +// ۴. هدف حمله CSRF (آسیب‌پذیر) +// ========================================== +Route::post('/update-email', [UserController::class, 'updateEmail']) + ->withoutMiddleware([VerifyCsrfToken::class]) + ->name('vulnerable.update.email'); \ No newline at end of file