Yii2 GridView HTMLi

Yii2 GridView HTMLi

https://t.me/bug_bounty_notes
Введение

Хочу поделиться с вами историей о том, как небольшая ошибка разработчика привела к HTMLi, а также рассказать о том, как возникла эта уязвимость, и как её можно было избежать.

Все скриншоты в статье – лишь имитация реального сайта, на котором была обнаружена уязвимость. Это сделано с целью недопущения раскрытия реального домена веб приложения.


Дано

Атакуемое веб приложение написано с использованием PHP фреймворка Yii2.

Авторизированному пользователю сайт предоставляет простенькую CRUD, написанную с использованием стандартных виджетов GridView и DetailView.

Пробуем отредактировать разные поля – и в одном из полей обнаруживаем возможность инъекции HTML кода:

При этом все попытки осуществления XSS веб приложение успешно отсекало:

Однако Yii2 GridView по умолчанию экранирует вывод данных, полученных из БД, а, следовательно, HTMLi в этом месте не должно было быть.


Разбираемся в причине

Для того чтобы лучше понять, почему так произошло, взглянем на исходный код PHP скрипта, отвечающего за вывод данных:

Выясняется, что разработчик, желая вывести иконку перед текстом, установил атрибут format в значение html (33 строка).

Согласно документации Yii2, метод asHtml() фильтрует данные, очищая их от всех возможных векторов эксплуатации XSS уязвимости:

"The value will be purified using yii\helpers\HtmlPurifier to avoid XSS attacks. Use asRaw() if you do not want any purification of the value".

Но в то же время этот метод не защищает от HTML инъекций, на что программист явно не обратил внимание.


Решение проблемы

Если кому-то интересно моё мнение, я бы исправил эту уязвимость следующим образом: установил бы атрибут format в значение raw, которое никак не отфильтрует данные, вернув их как есть. А вывод данных, полученных из БД, обернул бы в Html::encode, получив следующий результат:


Report Page