Слепой межсайтовый скриптинг – это подтип сохраненного/постоянного 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). Обычные сканеры веб-уязвимостей, которые анализируют только прямые ответы от программы, не способны обнаруживать такие недостатки.
Если вы хотите протестировать это решение бесплатно, оставьте ваши контактные данные в форме ниже и мы к вам обратимся:







