From 4797422b101b338ce669203ae2dbb74027d290e7 Mon Sep 17 00:00:00 2001 From: mcoder Date: Tue, 14 Apr 2026 17:50:31 +0330 Subject: [PATCH] Add --- .env.example | 13 ++++---- docker-compose.yml | 24 +++++++++++++-- routes/web.php | 75 +++++++++++++++++++++++++++------------------- 3 files changed, 73 insertions(+), 39 deletions(-) diff --git a/.env.example b/.env.example index c0660ea..2a64449 100644 --- a/.env.example +++ b/.env.example @@ -20,14 +20,15 @@ LOG_STACK=single LOG_DEPRECATIONS_CHANNEL=null LOG_LEVEL=debug -DB_CONNECTION=sqlite -# DB_HOST=127.0.0.1 -# DB_PORT=3306 -# DB_DATABASE=laravel -# DB_USERNAME=root -# DB_PASSWORD= +DB_CONNECTION=mysql +DB_HOST=mariadb +DB_PORT=3306 +DB_DATABASE=sec_lab +DB_USERNAME=lab_user +DB_PASSWORD=lab_password SESSION_DRIVER=database + SESSION_LIFETIME=120 SESSION_ENCRYPT=false SESSION_PATH=/ diff --git a/docker-compose.yml b/docker-compose.yml index f25794f..3495bcf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,19 @@ services: + # دیتابیس MariaDB + mariadb: + image: mariadb:10.11 + container_name: sec_lab_db + environment: + MYSQL_ROOT_PASSWORD: root_password + MYSQL_DATABASE: sec_lab + MYSQL_USER: lab_user + MYSQL_PASSWORD: lab_password + volumes: + - db_data:/var/lib/mysql + networks: + - lab_net + restart: always + # وب‌سرور اپلیکیشن اصلی (Victim) victim-nginx: image: nginx:stable-alpine @@ -27,7 +42,9 @@ services: - NPM_REGISTRY=http://192.168.1.201:8081/repository/npm-group/ - NODE_REGISTRY=http://192.168.1.201:8081/repository/node-dist volumes: - - ./:/var/www/html:rw # ولوم اضافی nginx از اینجا حذف شد + - ./:/var/www/html:rw + depends_on: + - mariadb networks: - lab_net restart: always @@ -46,4 +63,7 @@ services: networks: lab_net: - driver: bridge \ No newline at end of file + driver: bridge + +volumes: + db_data: \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index c6ebad2..476ec11 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,46 +1,59 @@ 'victim@webapp.kr-rezvan.ir'], + [ + 'name' => 'کاربر قربانی', + 'password' => Hash::make('12345678') + ] + ); + return "آزمایشگاه آماده شد! کاربر هدف (victim@webapp.kr-rezvan.ir) در دیتابیس ساخته شد."; }); -// ۱. روت تست XSS -// پارامتر payload را می‌گیرد و در صفحه نمایش می‌دهد -Route::get('/xss', [VulnerabilityController::class, 'xss'])->name('vulnerability.xss'); - -// ۲. روت هدف برای تست حمله CSRF -// این روت را در فایل bootstrap/app.php از بررسی توکن استثنا کردیم -Route::post('/csrf-target', [VulnerabilityController::class, 'csrfTarget'])->name('vulnerability.csrf'); - -// ۳. روت تست کوکی‌ها (برای مرحله بعدی) -Route::get('/set-cookie', function () { - // ایجاد یک کوکی بدون HttpOnly برای تست سرقت با XSS - return response('Cookie set!') - ->cookie('secret_token', 'Bypass-12345', 60, null, null, false, false); -})->name('vulnerability.cookie'); - - -// روت دریافت اطلاعات سرقت شده (معمولاً در دنیای واقعی روی سرور مهاجم است) -Route::get('/stealer', [VulnerabilityController::class, 'logStolenData'])->name('vulnerability.stealer'); - -// پنل مشاهده لاگ‌های سرقت شده -Route::get('/hacker-panel', [VulnerabilityController::class, 'viewLogs'])->name('vulnerability.logs'); +// ۲. شبیه‌سازی ورود کاربر به سیستم +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) { - // در اینجا فرض می‌کنیم کاربر لاگین است و ایمیلش آپدیت می‌شود - $newEmail = $request->input('email'); + // اگر کوکی معتبر ارسال نشود، لاراول این کاربر را ناشناس می‌داند + 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' => "ایمیل شما با موفقیت به $newEmail تغییر یافت!", - 'user_session' => session()->getId() // برای تست اینکه آیا کوکی ارسال شده یا نه + 'message' => 'ایمیل در دیتابیس تغییر یافت!', + 'old' => $oldEmail, + 'new' => $user->email, + 'session_id' => session()->getId() ]); })->withoutMiddleware([VerifyCsrfToken::class]); \ No newline at end of file