Статьи

Запобігання міжсайтових атак з впровадженням сценарію шляхом кодування HTML-відповідей

  1. Міжсайтовий атаки з впровадженням сценарію
  2. Малюнок 1. Малюнок 1. Типова XSS-атака
  3. наслідки XSS
  4. Запобігання XSS-атак
  5. Таблиця 1. Імена об'єктів для символів HTML
  6. Додавання HTML-коду в додаток Java на стороні сервера
  7. Лістинг 1. Перетворення символів в імена об'єктів HTML
  8. Таблиця 2. Десяткові значення об'єктів HTML
  9. Ресурси для скачування

Міжсайтовий атаки з впровадженням сценарію

Під час межсайтовой атаки з впровадженням сценарію (XSS) атакуюча сторона впроваджує в легальну Web-сторінку шкідливий код, який потім запускає шкідливий сценарій на стороні клієнта. При відвідуванні користувачем зараженої сторінки сценарій завантажується в браузер користувача і там запускається. Ця схема має безліч різновидів. Шкідливий сценарій може отримувати доступ до cookie-файлів браузера, сеансовим маркерами або інша вразлива інформація, що зберігається в браузері. Проте все атаки діють за схемою, показаної на малюнку 1.

Малюнок 1. Малюнок 1. Типова XSS-атака

уразливості XSS

В ході типовою XSS-атаки атакуюча сторона знаходить спосіб впровадження рядки на Web-сторінку сервера. Припустимо, атакуючий впровадив на Web-сторінку наступний рядок: <script> alert ( "ви атаковані") </ script>. При кожному відвідуванні користувачем цієї сторінки його браузер завантажує цей сценарій і запускає його разом з рештою вмісту сторінки. В даному випадку в результаті запуску сценарію користувач побачить спливаюче вікно з текстом "ви атаковані".

наслідки XSS

Якщо атакуючому вдалося скористатися XSS-вразливістю Web-додатки, він може впровадити в сторінку сценарій, який надасть доступ до даних облікового запису користувача. При цьому зловмисники можуть виконувати безліч шкідливих дій, наприклад:

  • викрасти обліковий запис;
  • поширити віруси;
  • отримати доступ до історії відвідування сторінок і вмісту буфера обміну;
  • отримати можливість дистанційного керування браузером;
  • просканувати і використовувати програмно-апаратні ресурси і додатки у внутрішній мережі.

Запобігання XSS-атак

Для запобігання XSS-атак додаток має шифрувати вихідні дані сторінки перед передачею їх кінцевому користувачу. При шифруванні вихідних даних розмітка HTML замінюється альтернативними уявленнями - об'єктами. Браузер відображає ці об'єкти, але не запускає їх. Наприклад, <script> перетворюється в & lt; script & gt ;.

У таблиці 1 показані імена об'єктів для деяких поширених символів HTML.

Таблиця 1. Імена об'єктів для символів HTML
Результат Опис Ім'я об'єкта Номер об'єкта Нерозривний пробіл & nbsp; & # 160; <Менше ніж & lt; & # 60; > Більше ніж & gt; & # 62; & Амперсанд & amp; & # 38; ¢ Цент & cent; & # 162; £ Фунт & pound; & # 163; ¥ Йена & yen; & # 165; Євро & euro; & # 8364; § Параграф & sect; & # 167; © Авторське право & copy; & # 169; ® Зареєстрований товарний знак & reg; & # 174 ™ Товарний знак & trade; & # 8482;

Коли браузер зустрічає об'єкти, вони перетворяться назад в HTML і роздруковуються, але вони не запускаються. Наприклад, якщо атакуючий запровадить в змінне поле Web-сторінки сервера рядок <script> alert ( "ви атаковані") </ script>, то при використанні описаної стратегії сервер поверне рядок & lt; script & gt; alert ( "ви атаковані") & lt; / script & gt ;.

Коли браузер завантажить зашифрований сценарій, він перетворює його до виду <script> alert ( "ви атаковані") </ script> і відобразить сценарій в складі Web-сторінки, але не запустить його.

Додавання HTML-коду в додаток Java на стороні сервера

Щоб код шкідливого сценарію не міг виводитися разом зі сторінкою, ваше застосування повинне шифрувати всі рядкові змінні перш, ніж вони відобразяться на сторінці. Шифрування полягає в простому перетворенні кожного символу в відповідне ім'я об'єкта HTML, як показано в коді Java, наведеному в лістингу 1.

Лістинг 1. Перетворення символів в імена об'єктів HTML
public class EscapeUtils {public static final HashMap m = new HashMap (); static {m.put (34, "& quot;"); // <- менше ніж m.put (60, "& lt;"); // <- менше ніж m.put (62, "& gt;"); //> - більше ніж // Користувач повинен зіставити всі об'єкти html з відповідними десятковими значеннями. // Відповідність об'єктів десятковим значенням показано в наведеній нижче таблиці} public static String escapeHtml () {String str = "<script> alert (\" abc \ ") </ script>"; try {StringWriter writer = new StringWriter ((int) (str.length () * 1.5)); escape (writer, str); System.out.println ( "encoded string is" + writer.toString ()); return writer.toString (); } Catch (IOException ioe) {ioe.printStackTrace (); return null; }} Public static void escape (Writer writer, String str) throws IOException {int len ​​= str.length (); for (int i = 0; i <len; i ++) {char c = str.charAt (i); int ascii = (int) c; String entityName = (String) m.get (ascii); if (entityName == null) {if (c> 0x7F) {writer.write ( "& #"); writer.write (Integer.toString (c, 10)); writer.write ( ';'); } Else {writer.write (c); }} Else {writer.write (entityName); }}}}

У коді Java в лістингу 1 виконується кодування HTML-рядки String String "<script> alert (\" abc \ ") </ script>". Використовуйте наступну процедуру:

  1. 1. Створіть hashmap всіх об'єктів HTML і їх десяткових значень. У прикладі показані тільки три об'єкти. В цій карті вам потрібно зіставити всі об'єкти HTML з їх десятковими значеннями. Деякі найбільш поширені об'єкти і їх десяткові значення показані в таблиці 2. Повний перелік всіх об'єктів наведено в довіднику по об'єктах HTML в розділі ресурси .
  2. Створіть StringWriter буфера, в 1,5 рази перевищує довжину вхідного рядка.
  3. Передайте цей StringWriter і вхідні рядок методу escape, який бере по черзі кожен символ рядка і отримує відповідне символу цілочисельне значення.
  4. Передайте цілочисельне значення в карту, створену в кроці 1, візьміть ім'я об'єкта і запишіть це значення в StringWriter.

    Кожен символ рядка буде перетворений в ім'я об'єкта.

В результаті на виході з'явиться наступна рядок: & lt; script & gt; alert (& quot; abc & quot;) & lt; / script & gt ;.

У таблиці 2 показано відповідність об'єктів HTML їх десятковим значенням.

Таблиця 2. Десяткові значення об'єктів HTML
Десяткове значення Об'єкт Опис 160 & nbsp; Нерозривний пробіл 60 & lt; Менше ніж 62 & gt; Більше ніж 38 & amp; Амперсанд 162 & cent; Цент 163 & pound; Фунт 165 & yen; Єна 8364 & euro; Євро 167 & sect; Параграф 169 & copy; Авторське право 174 & reg; Зареєстрований товарний знак 8482 & trade; Товарний знак

висновок

Міжсайтового впровадження сценарію є одним з найпоширеніших способів атаки на комп'ютер користувача. Проте ви можете істотно послабити здатність атакуючого інфікувати ваше Web-додаток шкідливим кодом. Створюючи додаток, уважно поставтеся до шифрування всіх вихідних значень сторінки перед відправкою їх в браузер кінцевого користувача.

Ресурси для скачування

Схожі теми

  • Оригінал статті: Prevent cross-site scripting attacks by encoding HTML responses .
  • Довідник по HTML ISO-8859-1: познайомтеся з ISO-8859-1 - стандартним для більшості браузерів набором символів - і символами, зарезервованими для HTML.
  • Загальномовне пакет Apache містить корисні методи для виконання шифрування та інших спільних операцій. Для конкретного випадку, описаного в цій статті, можна використовувати статичний метод перетворення рядків org.apache.commons.lang3.StringEscapeUtils.escapeHtml4 (String input).

Підпишіть мене на повідомлення до коментарів

Новости