Как создать XSS-уязвимость на своем сайте (пошаговое руководство)
Значит, решил я написать игру, позволяющую обучиться искусству взлома сайтов. Чтобы свой скилл поднять да другим польза была. А по незнанию своему решил одним из первых уровней сделать возможность проведения на сайте XSS-атаки.
Кто не знает, что это, в двух словах объясню. XSS-атака (или межсайтовый скриптинг) - это атака, направленная на выполнение произвольного сценария в браузере жертвы. Обычно, используется для того, чтобы увести куки. А куки нужны для того, чтобы не авторизовываться каждый раз на каком-либо сайте.
Дисклеймер
Автор настоятельно не рекомендует использовать описанные ниже действия, а также не несет никакой ответственности за возможный ущерб
Боюсь, дальнейшее повествование будет интересно никому людям, далеким от веба. Но я все-таки попробую.
Создаем страницу, размещаем на ней форму с текстовым полем.
При отправке формы на сервер обязательно никак не обрабатываем введенные пользователем данные (иначе не будет магии). Нужно сохранить данные в базе данных (а как иначе можно передать другим ссылку на страницу и своровать куку?), а также вывести их на сайт (чтобы скрипт мог запуститься). Проверим, всё ли у нас получилось, введя простейший JavaScript-код:
Ура! Хотя нет, постойте: если использовать одинарные кавычки, в базе данных ничего не сохраняется! А вдруг хакер забудет заэкранировать их? Нельзя этого допустить! Добавим к запросу функцию, экранирующую специальные символы addslashes().
Вот теперь все хорошо сохраняется. Давайте усложним запрос и вставим код, который бы воровал куку пользователя и отправлял к нам на сервер.
Ничего не происходит. Почему это? Давайте откроем консоль (F12 обычно).
Хм, браузер запретил исполнять скрипт и просит указать какие-то заголовки. Еще чего! Я лучше сохраню введенный пользователем текст в базу данных, перезагружу страницу и буду выводить текст не из POST-массива, а из базы данных, тогда браузер ругаться не будет.
Ура, мы это сделали! Еще никогда провести XSS-атаку не было так просто!