- PVSM.RU - https://www.pvsm.ru -
Сначала разберем, что такое XSS и его виды.
XSS — Cross-Site Scripting — Одна из множества уязвимостей веб приложений, которая позволяет внедрить вредоносный код, на страницу.
Есть 2 типа XSS:
За несколько лет работы в сфере информационной безопасности, я смог набраться опыта и могу рассказать о некоторых нетипичных видах XSS. Данные типы уязвимостей довольно распространены на современных веб-сервисах, но к сожалению из-за своей необычности, они скрылись в тени.
Начнем с ошибочных представлений разработчиков:
Разработчик думает, что XSS — это инъекция только в HTML-сущность и только. Данное ошибочное мнение складывается изо дня в день. На самом же деле, XSS могут быть не только в HTML, они могут быть почти везде, к примеру даже в картинке.
А сейчас давайте разберем несколько типов атаки:
Представим у нас есть PHTML (PHP + HTML) код
<!DOCTYPE HTML>
<html>
<head>
<title>Привет!</title>
</head>
<body>
Привет, <?=(isset($_GET['name']) ? $_GET['name'] : "незнакомец")?>!
</body>
</html>
Данный код выводит "Привет, незнакомец!"
, если нету GET параметра с именем name, но если же параметр есть, то тогда выведет "Привет, {$_GET['name']}!"
. При помощи GET-запроса, делаем запрос на наш скрипт: index.php?name=Admin
. Выводит "Привет, Admin!"
.
Теперь попробуем вывести наш вредоносный код. Для этого делаем запрос: index.php?name=<script>document.write('Hacker')</script>
. Теперь нам выведет "Привет, Hacker!"
. Как видим, наш код document.write('Hacker')
выполнился.
Так-же можно внедрять вредоносный код при внедрении в атрибуты. Для примера возьмем PHTML (PHP + HTML) код:
<html>
<head>
<title>Привет!</title>
</head>
<body>
Ваше имя: <input value="<?=(isset($_GET['name']) ? $_GET['name'] : "незнакомец")?>">
</body>
</html>
Как видим, у нас выполнился код, где имя содержится в inpute (Текстовом поле). Теперь для внедрения нашего кода нужно всего лишь сделать запрос:
index.php?name=">. Как видим мы добавили
">`, тем самым закрыв атрибут и тэг:
Для защиты от данной уязвимости в PHP предусмотрена функция htmlspecialchars
. Использовать её довольно просто — для этого в отрезок PHP-кода просто добавим обработчик htmlspecialchars
Получается:
<?=(isset($_GET['name']) ? htmlspecialchars($_GET['name']) : "незнакомец")?>
И наши XSS уже не работают.
Представим, что у нас есть PHTML (PHP + HTML) код:
<!DOCTYPE HTML>
<html>
<head>
<title>Привет!</title>
<script>
function deleteNews(id) {
// Удаление новости
alert("Успешно удалено");
}
</script>
</head>
<body>
<a onclick="deleteNews('<?=(isset($_GET['id']) ? htmlspecialchars($_GET['id']) : "0")?>')">Удалить новость</a>
</body>
</html>
Данный код выводит ссылку "Удалить новость"
, где ID новости передается в GET параметре id
. При помощи GET-запроса делаем запрос на наш скрипт: index.php?name='); alert(1);//
. Теперь при нажатии на ссылку, выведет наш alert(1)
, несмотря на htmlspecialchars. Это происходит из-за того, что htmlspecialchars не фильтрует по умолчанию одинарные кавычки.
Есть несколько способов защиты:
Тот же htmlspecialchars
, но на этот раз с параметром ENT_QUOTES. Получается:
<?=(isset($_GET['id']) ? htmlspecialchars($_GET['id'], ENT_QUOTES) : "0")?>
В данном способе используется функция addslashes
. Она экранирует ковычки при помощи обратного слэша. Получается:
<?=(isset($_GET['id']) ? addslashes($_GET['id']) : "0")?>
Лично я не рекомендую данный способ защиты, но если кому-то надо передать апострофы в функцию, тогда дерзайте.
integer
. Получается:
<?=(isset($_GET['id']) ? (int)$_GET['id'] : "0")?>
Таким образом мы оставляем только числа.
Многие, сейчас задаются вопросом "Почему же изображения и при чем они тут вообще?". В наше время все используют аватарки, картинки и т.п. Но неправильная фильтрация может повлечь за собой последствия! Итак, уязвимость заключается в том, что если фильтровать по типу "Изображение" или нет, то можно разрешить загрузку таких файлов, как SVG. Что такое SVG (.svg или .svgz)?
SVG — Язык для построения векторной графики на XML
Mime-Type для SVG: image/svg+xml
SVG может отображаться в браузерах, но в чем же опасность? Как ни странно, но SVG может использовать JavaScript. Для этого просто нужно прописать в тэг svg атрибут onload. Пример:
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="480" height="360" onload="alert(document.cookie)">
<image xlink:href="http://my_sniffer/" x="0" y="0" height="50px" width="50px"/>
</svg>
Теперь, если загрузить данный файл на сервер (пусть будет путь http://site.ru/uploads/avatar.svg [1]) и перейти по нему, то выполнится код из onload.
Фильтровать файлы по расширения (.png, .jpg, .jpeg) и после чего проверять их валидность.
К примеру у нас есть скрипт для защиты от OpenRedirect`a на PHTML (PHP + HTML):
<!DOCTYPE HTML>
<html>
<head>
<title>Переход на небезопасный сайт!</title>
</head>
<body>
<a href="<?=(isset($_GET['url']) ? htmlspecialchars($_GET['url']) : "https://habrahabr.ru")?>">Перейти на небезопасный сайт!</a>
</body>
</html>
Уязвимость заключается в том, что мы можем использовать не только http || https-протоколы, а также javascript и data-протоколы. Для демонстрации перейдем по ссылке: script.php?url=javascript:alert(document.cookie);//
. Теперь при нажатии на странице на ссылку, у нас вылезут наши cookie`s.
Фильтровать URL по regexу
/^((http|https)://)[a-zA-Z0-9./?:@-=#]+.([a-zA-Z0-9&./?:@-=#])*$/is` и пропускать, только ссылки проходящие его
X-XSS-Protection
Content-Security-Policy
Ссылки на ресурсы:
https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B6%D1%81%D0%B0%D0%B9%D1%82%D0%BE%D0%B2%D1%8B%D0%B9_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3 [2]
https://www.owasp.org/index.php/Cross-site_Scripting_%28%58%53%53%29 [3]
http://php.net/manual/ru/function.htmlspecialchars.php [4]
http://php.net/manual/ru/function.addslashes.php [5]
https://habrahabr.ru/post/157087/ [6]
https://ru.wikipedia.org/wiki/SVG [7]
http://www.w3.org/Graphics/SVG/ [8]
https://habrahabr.ru/company/nixsolutions/blog/271575/ [9]
https://habrahabr.ru/post/168739/ [10]
Автор: PenGenKiddy
Источник [11]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/informatsionnaya-bezopasnost/201402
Ссылки в тексте:
[1] http://site.ru/uploads/avatar.svg: http://site.ru/uploads/avatar.svg
[2] https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B6%D1%81%D0%B0%D0%B9%D1%82%D0%BE%D0%B2%D1%8B%D0%B9_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3: https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B6%D1%81%D0%B0%D0%B9%D1%82%D0%BE%D0%B2%D1%8B%D0%B9_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3
[3] https://www.owasp.org/index.php/Cross-site_Scripting_%28%58%53%53%29: https://www.owasp.org/index.php/Cross-site_Scripting_%28%58%53%53%29
[4] http://php.net/manual/ru/function.htmlspecialchars.php: http://php.net/manual/ru/function.htmlspecialchars.php
[5] http://php.net/manual/ru/function.addslashes.php: http://php.net/manual/ru/function.addslashes.php
[6] https://habrahabr.ru/post/157087/: https://habrahabr.ru/post/157087/
[7] https://ru.wikipedia.org/wiki/SVG: https://ru.wikipedia.org/wiki/SVG
[8] http://www.w3.org/Graphics/SVG/: http://www.w3.org/Graphics/SVG/
[9] https://habrahabr.ru/company/nixsolutions/blog/271575/: https://habrahabr.ru/company/nixsolutions/blog/271575/
[10] https://habrahabr.ru/post/168739/: https://habrahabr.ru/post/168739/
[11] Источник: https://habrahabr.ru/post/313282/?utm_source=habrahabr&utm_medium=rss&utm_campaign=sandbox
Нажмите здесь для печати.