Слепой межсайтовый скриптинг (XSS)

Слепой межсайтовый скриптинг – это подтип сохраненного/постоянного XSS, когда веб-приложение сохраняет полезную нагрузку, отправленную злоумышленником, и выполняет ее позже – в другое время или в другом месте, возможно даже в другой веб-программе.

Пример слепого XSS

В этом примере разработчик позволяет пользователю зарегистрироваться в веб-приложении, указав свой юзернейм. Страница register.php программы содержит следующую форму:

<form action="/registered.php" method="post" id="comment">
  <label for="username">Choose a username:</label>
  <input type="text" id="username" name="username">
  <label for "password">Choose a password:</label>
  <input type="password" id="password" name="password">
  <button type="submit" form="register" value="register">Register</button>
</form>

Файл registered.php содержит следующий код:

// Добавление нового пользователя в базу данных с помощью PDO во избежание SQL-инъекций
(...)
$username=$_POST["username"];
$password=password_hash($_POST["password"], PASSWORD_DEFAULT);
$sql = "INSERT INTO users (username, password) VALUES (?,?)";
$statement = $pdo->prepare($sql);
$statement->execute([$username, $password]);
(...)

Как видно, приложение добавляет имя пользователя в базу данных без какой-либо проверки или очистки.

Ниже приведен пример другой программы, которая позволяет новому аутентифицированному администратору отображать список 50 новейших пользователей. Страница newusers.php отображает их в таблице:

(...)
$sql = "SELECT * FROM users ORDER BY id DESC LIMIT 50";
$statement = $pdo->query($sql);
while ($row = $statement->fetch()) {
    echo "<tr><td>".$row['id']."</td><td>".$row['username']."</td></tr>";
}
(...)

Это приложение предполагает, что содержание базы данных безопасно, и не выполняет никакой проверки или очистки перед его отображением.

Атака слепого XSS

Важно: информация предоставляется исключительно в образовательных целях для инженеров по безопасности для понимания специфики таких атак и защиты от них, и никоим образом не призывает к противоправным действиям.

Злоумышленник вводит следующее имя пользователя в форму:

<script>alert("ВАШ АДМИНИСТРАТИВНЫЙ ИНТЕРФЕЙС ВЗЛОМАН!");</script>

Далее полезная нагрузка атаки сохраняется в базе данных как новое имя пользователя.

Позже администратор вызывает функцию (страница newusers.php), что содержит список последних 50 пользователей. Если среди них есть злоумышленник, браузер получает и интерпретирует следующий код, когда встречает вредоносный юзернейм:

<td><script>alert("ВАШ АДМИНИСТРАТИВНЫЙ ИНТЕРФЕЙС ВЗЛОМАН!");</script></td>

Браузер находит тег <script> и выполняет код JavaScript в нем. В результате он отображает всплывающее окно.

Исправление

Разработчик решает использовать фильтрацию HTMLPurifier для защиты кода и дополнительно экранирования символов HTML.

Он импортирует библиотеку HTMLPurifier и меняет файл registered.php следующим образом:

// Добавление нового комментария в базу данных с помощью PDO во избежание SQL-инъекции
// и HTMLPurifier с экранированием HTML для предотвращения XSS
(...)
$username=$_POST["username"];
$password=password_hash($_POST["password"], PASSWORD_DEFAULT);
// Очистка данных пользователя с помощью HTMLPurifier
(...)
$purifier = новый HTMLPurifier($config);
$purified_username = $purifier->purify($username);
// Добавление специальных символов HTML-экранирования
$safe_username = htmlspecialchars($purified_username, ENT_QUOTES);
// Сохранение безопасных данных в базе данных
$sql = "INSERT INTO users (имя пользователя, пароль) VALUES (?,?)";
$statement = $pdo->prepare($sql);
$statement->execute([$safe_username, $password]);
(...)

Последствия слепого XSS

Вот некоторые действия, которые могут выполнить злонамеренные хакеры:

  • Они могут перенаправить администратора на вредоносную страницу, имитирующую оригинальную программу, и попросить его войти, таким образом получить его учетные данные.
  • Злоумышленники могут украсть файлы cookie сессии администратора, чтобы выдать себя за привилегированного пользователя.
  • Они могут обманом заставить администратора загрузить и установить на компьютер вредоносное ПО.

Это может позволить злоумышленникам эскалировать атаку и, возможно, получить доступ к другим компьютерным системам в организации.

Как обнаружить слепой XSS

Чтобы обнаружить эту уязвимость, следует использовать инструмент для тестирования безопасности (сканер), который может находить слепые/out-of-band уязвимости с помощью специального внешнего сервиса.

Примером является решение Invicti (на основе Acunetix и Netsparker). Обычные сканеры веб-уязвимостей, которые анализируют только прямые ответы от программы, не способны обнаруживать такие недостатки.

Если вы хотите протестировать это решение бесплатно, оставьте ваши контактные данные в форме ниже и мы к вам обратимся:

Запрос на бесплатное тестирование Invicti

Подписаться на новости