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()
}