🛡️ HackLab

Тренировочный полигон для будущих специалистов по кибербезопасности

Доступные челленджи

" }, { id: 3, title: "Path Traversal - File Read", category: "Path Traversal", difficulty: "Medium", points: 20, flag: "path_traversal_success", description: `Используйте параметр file для чтения системных файлов. Цель: Прочитать файл flag.txt. Подсказка: Используйте ../ для подъема по директориям.`, hint1: "Используйте ../ для подъема по директориям", hint2: "Попробуйте ../../../ для достижения корня", hint3: "Пример: ../../../../flag.txt" }, { id: 4, title: "IDOR - Insecure Direct Object Reference", category: "IDOR", difficulty: "Easy", points: 10, flag: "idor_admin_found", description: `Найдите ID администратора через параметр id. Цель: Найти ID пользователя admin и получить его данные. Подсказка: Изменяйте значение параметра id на разные числа.`, hint1: "Изменяйте значение параметра id на разные числа", hint2: "Попробуйте id=2, id=3, id=100", hint3: "ID администратора обычно равен 1 или 0" }, { id: 5, title: "Command Injection - RCE", category: "Command Injection", difficulty: "Hard", points: 30, flag: "command_injection_success", description: `Используйте поле ввода IP для выполнения команд. Цель: Получить содержимое flag.txt через выполнение команды. Подсказка: Используйте ; или && для выполнения дополнительных команд.`, hint1: "Используйте ; или && для выполнения дополнительных команд", hint2: "Попробуйте: 127.0.0.1; cat flag.txt", hint3: "Команды: whoami, ls, cat flag.txt" }, { id: 6, title: "NoSQL Injection", category: "NoSQL Injection", difficulty: "Hard", points: 35, flag: "nosql_injection_success", description: `Используйте NoSQL-инъекцию в MongoDB. Цель: Получить данные всех пользователей. Подсказка: Используйте операторы $ne, $gt в JSON.`, hint1: "Используйте операторы $ne, $gt в JSON", hint2: "Попробуйте: {\"username\": {\"$ne\": null}}", hint3: "Пример: {\"username\": \"admin\", \"password\": {\"$ne\": \"\"}}" }, { id: 7, title: "CSRF - Change Password", category: "CSRF", difficulty: "Hard", points: 25, flag: "csrf_password_changed", description: `Измените пароль другого пользователя. Цель: Успешно изменить пароль пользователя admin. Подсказка: Отсутствуют CSRF-токены в форме.`, hint1: "Обратите внимание на отсутствие CSRF-токенов", hint2: "Можно создать автоматическую отправку формы через JS", hint3: "Используйте img с src или form с автозаполнением" }, { id: 8, title: "LDAP Injection", category: "LDAP Injection", difficulty: "Hard", points: 35, flag: "ldap_injection_success", description: `Выполните LDAP-инъекцию на странице поиска. Цель: Получить доступ к данным всех пользователей. Подсказка: Используйте * для поиска всех записей.`, hint1: "Используйте * для поиска всех записей", hint2: "Попробуйте: *)(uid=*)", hint3: "Пример: admin)(|(uid=*" } ]; // ===== СОСТОЯНИЕ ===== let state = { currentUser: null, currentPage: 'home', currentChallengeId: null, users: JSON.parse(localStorage.getItem('hacklab_users')) || [], solved: JSON.parse(localStorage.getItem('hacklab_solved')) || {}, hintTimers: {}, startTimes: {} }; // ===== СОХРАНЕНИЕ ===== function saveState() { localStorage.setItem('hacklab_users', JSON.stringify(state.users)); localStorage.setItem('hacklab_solved', JSON.stringify(state.solved)); } // ===== ФУНКЦИИ АВТОРИЗАЦИИ ===== function register(e) { e.preventDefault(); const username = document.getElementById('registerUsername').value.trim(); const password = document.getElementById('registerPassword').value; const errorDiv = document.getElementById('registerError'); if (!username || !password) { errorDiv.textContent = 'Заполните все поля!'; errorDiv.classList.remove('hidden'); return; } if (state.users.find(u => u.username === username)) { errorDiv.textContent = 'Пользователь уже существует!'; errorDiv.classList.remove('hidden'); return; } state.users.push({ username, password }); saveState(); errorDiv.classList.add('hidden'); alert('✅ Регистрация успешна! Теперь войдите.'); showPage('login'); document.getElementById('loginUsername').value = username; } function login(e) { e.preventDefault(); const username = document.getElementById('loginUsername').value.trim(); const password = document.getElementById('loginPassword').value; const errorDiv = document.getElementById('loginError'); const user = state.users.find(u => u.username === username && u.password === password); if (!user) { errorDiv.textContent = '❌ Неверные учетные данные!'; errorDiv.classList.remove('hidden'); return; } state.currentUser = username; errorDiv.classList.add('hidden'); document.getElementById('authLink').classList.add('hidden'); document.getElementById('logoutLink').classList.remove('hidden'); showPage('dashboard'); updateDashboard(); } function logout() { state.currentUser = null; document.getElementById('authLink').classList.remove('hidden'); document.getElementById('logoutLink').classList.add('hidden'); showPage('home'); } // ===== СТРАНИЦЫ ===== function showPage(page) { state.currentPage = page; document.querySelectorAll('.page').forEach(p => p.classList.add('hidden')); document.getElementById(`page-${page}`).classList.remove('hidden'); if (page === 'home') renderChallenges(); if (page === 'dashboard' && state.currentUser) updateDashboard(); } // ===== ОТОБРАЖЕНИЕ ЧЕЛЛЕНДЖЕЙ ===== function renderChallenges() { const grid = document.getElementById('challengeGrid'); grid.innerHTML = ''; CHALLENGES.forEach(c => { const isSolved = state.currentUser && state.solved[state.currentUser]?.includes(c.id); const card = document.createElement('div'); card.className = 'card'; card.innerHTML = ` ${c.difficulty}

${c.title}

${c.category}

+${c.points} очков ${isSolved ? '
✅ Решено
' : ''} `; card.onclick = () => openChallenge(c.id); grid.appendChild(card); }); } // ===== ОТКРЫТИЕ ЧЕЛЛЕНДЖА ===== function openChallenge(id) { if (!state.currentUser) { alert('⚠️ Сначала войдите в аккаунт!'); showPage('login'); return; } state.currentChallengeId = id; state.startTimes[id] = Date.now(); showPage('challenge'); const c = CHALLENGES.find(ch => ch.id === id); const container = document.getElementById('challengeContent'); const isSolved = state.solved[state.currentUser]?.includes(id); container.innerHTML = `

${c.title}

${c.difficulty} +${c.points} очков ${isSolved ? '✅ Решено' : ''}

${c.description}

🎯 Попробуй взломать:

${renderVulnerableDemo(c)}

🏴 Введи найденный флаг:

💡 Подсказки

`; // Автоматическая активация подсказок через время setTimeout(() => enableHint(1), 120000); // 2 минуты setTimeout(() => enableHint(2), 300000); // 5 минут setTimeout(() => enableHint(3), 600000); // 10 минут } function renderVulnerableDemo(challenge) { const demos = { 'SQL Injection': `

📝 Форма входа (уязвима для SQL-инъекции):

💡 Подсказка: попробуй ввести ' OR '1'='1' -- в поле пароля
`, 'XSS': `

🔍 Поиск (уязвим для XSS):

💡 Подсказ