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, получив следующий результат:
