Для защиты следует использовать CSRF-токены — механизм «подписывания» форм по алгоритму, неизвестному злоумышленнику .При создании защиты от csrf распространенная ошибка — генерация предсказуемых security-токенов. Токены должны всегда создаваться на основе недоступной злоумышленнику информации (зашифровать имя пользователя в md5 — плохая идея!).

XSS (cross-site scripting)

Одна из наиболее часто используемых атак веб-приложений. Основывается на факте, что злоумышленник может вставлять свой код в ответ от веб-сервера пользователю. Основная задача атаки — обойти Same Origin Policy и получить доступ к данным и функционалу клиентской части веб-приложения в рамках пользовательской сессии и с правами ее пользователя.

Существует несколько основных подходов к осуществлению XSS — атак.

Reflected XSS -злоумышленник создает ссылку, которая использует найденную уязвимость, передает ее пользователю. Пользователь переходит на целевой веб-сервер и получает ответ, подконтрольный злоумышленнику. Таким образом браузер пользователя можно заставить выполнять какие-либо действия. 

Выполняемый код может быть в составе ссылки, отправленной пользователю:

www.target.com/script.php?lang=en<script>alert(1)</script>

Чтобы пользователю не был виден активный элемент — ссылка может быть закодирована механизмом кодирования узлов (goo.gl и т.п.), шифровка параметров в base64 и т.п. Такие ссылки уже вызовут меньше подозрений у пользователя.

Stored XSS — способ реализации атаки, когда код размещается на ресурсе (например, пост с неотфильтрованным js-кодом в гостевой книге), после чего каждый пользователь, зашедший на страницу невольно выполняет этот код.

DOM-based XSS — не требует никаких обращений на сервер со стороны пользователя. Все предпосылки для создания XSS находится в самом браузере. Основывается на том, что в контексте самого браузера есть код, обрабатывающий параметры и содержащий ошибку. К примеру, если участок JS- кода имеет доступ к параметру url и на его основе формирует некий html-код на странице.

Стоит проверить наличие в коде страницы таких конструкций, как:

document.write()
document.writeln()
eval()
.innerHTML

Еще один важный момент — если на странице есть flash (.swf),  то все, что приходит от swf также подлежит строгой валидации, о чем часто забывают

Основной способ защиты — правильная обработка всех входных и выходных данных. Множество векторов атаки описано здесь: http://html5sec.org/, стоит об этом помнить. Много полезного про XSS и то, как правильно строить защиту от него также описано в годной статье на хабре.

Инъекция заголовков (header injection)

В рамках HTTP-протокола заголовки разделяются друг от друга символом перевода каретки (%0d%0a). Если на сайте есть метод, позволяющий сгенерировать заголовок, содержащий символ перевода каретки, после этих символов можно поставить новый header.

Например, если есть некая страница: http://target.com?jump=<user input> при переходе на нее, генерирующая в ответе заголовок

...
Location: <user input>

то передав запрос вида:
http://target.com?jump=hell%0d%0aSet-Cookie: gotohell%3d1 получим в ответе:

...
Location: hell
Set-Cookie: gotohell = 1
...

Таким образом можно будет внедряя заголовки / куки осуществлять XSS-атаку в любом месте страницы.

Фиксация сессии (Session Fixation)

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

Злоумышленник в таком сценарии создает сессию (просто зайдя на сайт и получив sessionid). Далее он передает в рамках какого-то запроса передает сессионный идентификатор пользователю. Пользователь заходит по этой ссылке, вводит свой логин и пароль, сессия при этом остается той же самой. Теперь злоумышленник, используя тот же sessionid имеет права доступа, как у пользователя.

На практике сессии обычно хранятся в cookies-переменных. Таким образом злоумышленнику надо найти  уязвимость, которая позволит пользователю добавить некое cookies-значение, например описанную выше header injection. Как вариант можно попробовать передать значение сессии через GET / POST параметр в надежде, что код на стороне сервера не анализирует источник, а работает с неким глобальным массивом, содержащим GET, POST, COOKIE параметры.

Пост-эксплуатация

Пост-эксплуатация — это то, что можно сделать с целевой системой после того, как удалось найти уязвимость и выполнить какой-то участок кода на целевой системе.

Основные паттерны, по которым работают злоумышленники предполагают:

  • получить доступ на выполнение (желательно в реальном времени)
  • изучение данных, хранящихся на сервере
  • перехват данных, которых нет на системе сейчас, но они могут появиться в будущем
  • организация перманентного доступа к целевой системе

Злоумышленник может получать информацию о скомпрометированной системе, анализируя:

  • конфигурацию системы (логин и пароль к БД в исходных кодах)
  • конфигурацию веб-сервера (например httpd.conf, .htaccess)
  • исходные коды приложения (ищем уязвимости, анализируя логику приложения)
  • доступы к окружению (находясь внутри сети может быть проще попасть на соседние сервера)
  • базы данных (и аутентификационная информация,к другим системам, хранящаяся в них)

Получение паролей из хеша

Чаще всего пароли хранят в виде хешей. Но есть способы получить пароль, имея его хеш.

Один из самых известных онлайн-брутфорсеров паролей: John the Ripper.

Может быть использован, например, так:

john <passwd file>
john --wordlist=<dictionary pass> <passwd file>
john --format=<formatname> passfile    (список форматов: john --list=formats)

Организация перманентного доступа

Самый простой способ — создать своего пользователя (желательно замаскировав его под системного).

Другой вариант — бинарные бекдоры, которые кладутся на систему и организуется их периодическое выпролнение (через cron или при каждом вызове любой частой команды, например ls).

Если удалось получить доступ под пользователем веб-сервера, можно сделать веб-бекдор, например положив куда-либо на вебсервере скрипт, позволяющий выполнять произвольные действия.

Самый жесткий вариант — патч ядра операционной системы, включение бекдора туда.

Полезные ссылки

Классификация угроз от Web App Security Consorcium

Cheatsheet по угрозам безопасности HTML и не только

SQL Injeciton от А до Я в pdf от Positive Technologies

База раскрытых уязвимостей Exploit DB

Поисковик по уязвимостям vulners.com ( и еще есть статья о нем на хабре)

Лекции от того же автора на YouTube (во многом похожи, но есть часть тем, не раскрытых в курсе, например раздел про CMS)

Обзор инструментов для вскрытия хеша (статья на хабре)