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_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug LOG_LEVEL=debug
DB_CONNECTION=sqlite DB_CONNECTION=mysql
# DB_HOST=127.0.0.1 DB_HOST=mariadb
# DB_PORT=3306 DB_PORT=3306
# DB_DATABASE=laravel DB_DATABASE=sec_lab
# DB_USERNAME=root DB_USERNAME=lab_user
# DB_PASSWORD= DB_PASSWORD=lab_password
SESSION_DRIVER=database SESSION_DRIVER=database
SESSION_LIFETIME=120 SESSION_LIFETIME=120
SESSION_ENCRYPT=false SESSION_ENCRYPT=false
SESSION_PATH=/ SESSION_PATH=/

View File

@ -1,4 +1,19 @@
services: 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)
victim-nginx: victim-nginx:
image: nginx:stable-alpine image: nginx:stable-alpine
@ -27,7 +42,9 @@ services:
- NPM_REGISTRY=http://192.168.1.201:8081/repository/npm-group/ - NPM_REGISTRY=http://192.168.1.201:8081/repository/npm-group/
- NODE_REGISTRY=http://192.168.1.201:8081/repository/node-dist - NODE_REGISTRY=http://192.168.1.201:8081/repository/node-dist
volumes: volumes:
- ./:/var/www/html:rw # ولوم اضافی nginx از اینجا حذف شد - ./:/var/www/html:rw
depends_on:
- mariadb
networks: networks:
- lab_net - lab_net
restart: always restart: always
@ -47,3 +64,6 @@ services:
networks: networks:
lab_net: lab_net:
driver: bridge driver: bridge
volumes:
db_data:

View File

@ -1,46 +1,59 @@
<?php <?php
use App\Http\Controllers\VulnerabilityController;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
use Illuminate\Http\Request; 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 () { Route::get('/setup-lab', function () {
return view('welcome'); $user = User::firstOrCreate(
['email' => 'victim@webapp.kr-rezvan.ir'],
[
'name' => 'کاربر قربانی',
'password' => Hash::make('12345678')
]
);
return "آزمایشگاه آماده شد! کاربر هدف (victim@webapp.kr-rezvan.ir) در دیتابیس ساخته شد.";
}); });
// ۱. روت تست XSS // ۲. شبیه‌سازی ورود کاربر به سیستم
// پارامتر payload را می‌گیرد و در صفحه نمایش می‌دهد Route::get('/login-victim', function () {
Route::get('/xss', [VulnerabilityController::class, 'xss'])->name('vulnerability.xss'); if (Auth::attempt(['email' => 'victim@webapp.kr-rezvan.ir', 'password' => '12345678'])) {
return "هویت شما تایید شد. کوکی نشست صادر و در دیتابیس ثبت گردید.";
// ۲. روت هدف برای تست حمله CSRF }
// این روت را در فایل bootstrap/app.php از بررسی توکن استثنا کردیم return "خطا در ورود.";
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('/profile', function () {
if (Auth::check()) {
return "شما لاگین هستید. ایمیل فعلی شما: <b>" . Auth::user()->email . "</b>";
}
return "شما لاگین نیستید! (احتمالاً کوکی به درستی ارسال نشده است).";
});
// ۴. نقطه آسیب‌پذیر (هدف حمله CSRF)
Route::post('/update-email', function (Request $request) { 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([ return response()->json([
'status' => 'success', 'status' => 'success',
'message' => "ایمیل شما با موفقیت به $newEmail تغییر یافت!", 'message' => 'ایمیل در دیتابیس تغییر یافت!',
'user_session' => session()->getId() // برای تست اینکه آیا کوکی ارسال شده یا نه 'old' => $oldEmail,
'new' => $user->email,
'session_id' => session()->getId()
]); ]);
})->withoutMiddleware([VerifyCsrfToken::class]); })->withoutMiddleware([VerifyCsrfToken::class]);