Сліпий міжсайтовий скриптинг (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 = new 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

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