package infosecmodules import ( "rubric/utils" ) var WebModule = Module{ Key: "web", Aliases: []string{"w", "owasp", "webapp"}, Title: "Безопасность веб-приложений", Description: "OWASP Top 10, XSS, SQLi, CSRF, SSRF, XXE, инъекции и защита", Run: showWeb, } func showWeb() { utils.Header("InfoSec — Безопасность веб-приложений") utils.Section("OWASP Top 10 (2021)") utils.Code(`A01 Broken Access Control — нарушение контроля доступа (IDOR, privilege escalation) A02 Cryptographic Failures — слабая/отсутствующая криптография A03 Injection — инъекции (SQL, NoSQL, команды, LDAP) A04 Insecure Design — небезопасный дизайн A05 Security Misconfiguration — неправильная конфигурация A06 Vulnerable Components — уязвимые зависимости A07 Auth Failures — ошибки аутентификации и сессий A08 Software & Data Integrity — нарушение целостности ПО и данных A09 Logging & Monitoring Failures — недостаточное логирование A10 SSRF — Server-Side Request Forgery`) utils.Section("A03 Injection — SQL Injection") utils.Code(`SQL Injection — внедрение SQL-кода через пользовательский ввод. Уязвимый код: query = "SELECT * FROM users WHERE name='" + name + "'" # Ввод: ' OR '1'='1 # Результат: SELECT * FROM users WHERE name='' OR '1'='1' Типы SQLi: In-band — ответ видно в ответе приложения Error-based — ошибки раскрывают структуру БД Union-based — UNION SELECT для получения данных Blind — нет прямого ответа, только true/false или задержки Boolean-based — условие true/false Time-based — SLEEP() для подтверждения Out-of-band — данные через DNS/HTTP запросы Примеры атак: ' OR '1'='1' -- # обход авторизации ' UNION SELECT 1,user(),3 -- # получить имя БД-пользователя '; DROP TABLE users; -- # разрушительная (редко работает) ' AND 1=2 UNION SELECT table_name FROM information_schema.tables -- Защита: 1. Параметризованные запросы (Prepared Statements) — ГЛАВНЫЙ метод 2. ORM (SQLAlchemy, Hibernate, GORM) 3. Хранимые процедуры 4. Экранирование (последний выбор!) 5. WAF 6. Принцип минимальных привилегий для БД-пользователя # Безопасный код (Python): cursor.execute("SELECT * FROM users WHERE name = %s", (name,)) # Безопасный код (Go): db.Query("SELECT * FROM users WHERE name = ?", name)`) utils.Section("A03 Injection — другие типы") utils.Code(`NoSQL Injection (MongoDB): Уязвимо: db.users.find({username: req.body.username}) Атака: {"username": {"$gt": ""}} # всегда true Защита: валидация типов, mongoose.sanitize() Command Injection (OS Injection): Уязвимо: os.system("ping " + host) Атака: "127.0.0.1; rm -rf /" Защита: subprocess.run(["ping", host], shell=False) # НЕ shell=True! LDAP Injection: Атака на LDAP-запросы (AD аутентификация) Защита: экранирование спецсимволов LDAP XPath Injection: Как SQL, но для XML/XPath Защита: параметризованные XPath запросы Template Injection (SSTI): Уязвимо: render_template_string("Hello " + name) Атака: name = "{{7*7}}" → 49 (Jinja2 выполняет код) Опасность: RCE (Remote Code Execution) Защита: никогда не рендерить пользовательский ввод как шаблон`) utils.Section("XSS — Cross-Site Scripting") utils.Code(`XSS — внедрение скриптов в страницы, просматриваемые другими пользователями. Выполняется в браузере жертвы. Типы: Reflected XSS — в параметре запроса, не сохраняется URL: /search?q= Stored (Persistent) XSS — сохраняется в БД/файлах Комментарий: Опаснее: видят все пользователи DOM-based XSS — через DOM, не проходит через сервер document.write(location.hash) Что может сделать XSS: - Украсть cookies (document.cookie) - Кейлоггинг (capture input) - Перенаправление (window.location) - Изменить страницу (phishing) - CSRF от имени жертвы Атака (кража cookies): Защита: 1. Content Security Policy (CSP) — главная защита 2. Экранирование вывода (output encoding) HTML: < > & " 3. HttpOnly cookies (нельзя читать через JS) 4. X-XSS-Protection заголовок (устарел) 5. Sanitize библиотеки (DOMPurify для JS) # CSP заголовок: Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-random123'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; connect-src 'self' https://api.example.com; frame-ancestors 'none'`) utils.Section("CSRF — Cross-Site Request Forgery") utils.Code(`CSRF — выполнение действий от имени аутентифицированного пользователя. Браузер автоматически отправляет cookies с любым запросом. Атака: 1. Alice вошла в bank.com (cookies в браузере) 2. Alice открывает attacker.com 3. Страница attacker.com: 4. Браузер отправляет запрос с cookies Alice! 5. Перевод выполнен. Защита: 1. CSRF-токен — уникальный токен в форме/заголовке Сервер проверяет токен при каждом POST 2. SameSite Cookie: Set-Cookie: session=abc; SameSite=Strict # только same-site Set-Cookie: session=abc; SameSite=Lax # кросс-сайт только GET Set-Cookie: session=abc; SameSite=None; Secure # везде (CSRF-уязвимо) 3. Проверка Origin/Referer заголовка 4. Double Submit Cookie 5. Custom request header (X-Requested-With: XMLHttpRequest) Браузеры не добавляют кастомные заголовки кросс-оригин без CORS`) utils.Section("SSRF — Server-Side Request Forgery") utils.Code(`SSRF — сервер делает запрос к произвольному URL, указанному атакующим. Атака: # Уязвимое API: POST /fetch {"url": "..."} # Доступ к внутренним сервисам: {"url": "http://192.168.1.1/admin"} {"url": "http://localhost:8080/actuator"} # AWS metadata (получить credentials): {"url": "http://169.254.169.254/latest/meta-data/iam/security-credentials/"} # Сканирование внутренней сети: {"url": "http://10.0.0.1:3306"} Защита: 1. Whitelist разрешённых URL/доменов 2. Блокировать приватные IP диапазоны 3. DNS rebinding защита 4. Ограничить исходящие соединения (egress firewall) 5. AWS IMDSv2 (требует токен для metadata)`) utils.Section("A01 Broken Access Control — IDOR") utils.Code(`IDOR (Insecure Direct Object Reference) — прямые ссылки на объекты без проверки прав. Атака: GET /api/users/1001/profile # твой профиль GET /api/users/1002/profile # чужой профиль (просто меняем ID!) GET /api/orders/5678/invoice # чужой счёт Защита: 1. Всегда проверять авторизацию к конкретному объекту 2. Использовать GUID/UUID вместо последовательных ID 3. Indirect Reference Map (пользователь видит только свои ID) 4. Тестировать с разными пользователями! Privilege Escalation: Горизонтальная — доступ к данным другого пользователя Вертикальная — получение прав admin # Пример правильной проверки (Python): order = Order.get(order_id) if order.user_id != current_user.id: return 403 # Forbidden`) utils.Section("Другие важные уязвимости") utils.Code(`XXE (XML External Entity): Уязвимо: парсер обрабатывает внешние сущности Атака: ]> &xxe; Защита: отключить XXE в парсере, использовать JSON Path Traversal: Атака: GET /download?file=../../../../etc/passwd Защита: realpath + проверка что путь внутри разрешённой директории Insecure Deserialization: Атака: подделать сериализованный объект → RCE Защита: не десериализовать непроверенные данные, подписывать объекты Open Redirect: Атака: /redirect?to=https://evil.com Защита: whitelist разрешённых доменов для редиректа Security Headers (важные HTTP заголовки): Strict-Transport-Security: max-age=31536000; includeSubDomains Content-Security-Policy: default-src 'self' X-Frame-Options: DENY X-Content-Type-Options: nosniff Referrer-Policy: strict-origin-when-cross-origin Permissions-Policy: camera=(), microphone=()`) utils.Footer() }