This commit is contained in:
mcoder 2026-04-14 17:50:31 +03:30
parent 9661689e48
commit 4797422b10
3 changed files with 73 additions and 39 deletions

View File

@ -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=/

View File

@ -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
@ -47,3 +64,6 @@ services:
networks:
lab_net:
driver: bridge
volumes:
db_data:

View File

@ -1,46 +1,59 @@
<?php
use App\Http\Controllers\VulnerabilityController;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken;
use Illuminate\Support\Facades\Route;
use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken;
// صفحه اصلی برای دسترسی سریع به بخش‌های مختلف
Route::get('/', function () {
return view('welcome');
// ۱. مرحله اول: مقداردهی اولیه پایگاه داده (ساخت کاربر قربانی)
Route::get('/setup-lab', function () {
$user = User::firstOrCreate(
['email' => '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 "شما لاگین هستید. ایمیل فعلی شما: <b>" . Auth::user()->email . "</b>";
}
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]);