Предотвращение межсайтовых атак с внедрением сценария путем кодирования HTML-ответов

Познакомьтесь с межсайтовыми атаками с внедрением сценария и узнайте, как их можно предотвратить, запрограммировав HTML-ответы сервера с помощью Java™.

Уша Ладкани, старший разработчик ПО, IBM

Photo of Usha LadkaniУша Ладкани (Usha Ladkani) обладает богатым опытом разработки приложений и уделяет особое внимание технологиям Java/J2EE и промежуточного ПО. С 2005 года она работает в группе разработки и сопровождения B2B. Уша разработала систему, предотвращающую межсайтовые атаки с внедрением сценария в WebSphere Partner Gateway, что сделало данные продукты более безопасными. Ее вклад в другие продукты IBM: автономные вычисления, применение установщика обновлений сервера приложений WebSphere в WPG, технология проектирования и анализ статического кода. Уша является главным специалистом по анализу приложений и статическому сканированию в WPG и Sterling Integrator. Имеет высшее образование по электронике и связи.



28.10.2013

Межсайтовые атаки с внедрением сценария

Во время межсайтовой атаки с внедрением сценария (XSS) атакующая сторона внедряет в легальную Web-страницу вредоносный код, который затем запускает вредоносный сценарий на стороне клиента. При посещении пользователем зараженной страницы сценарий загружается в браузер пользователя и там запускается. Эта схема имеет множество разновидностей. Вредоносный сценарий может получать доступ к cookie-файлам браузера, сеансовым маркерам или другой чувствительной информации, хранящейся в браузере. Тем не менее все атаки действуют по схеме, показанной на рисунке 1.

Рисунок 1. Рисунок 1. Типичная XSS-атака
Four boxes starting with hacker ending with web server, showing the path of an attack

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

Ресурсы

Научиться

Получить продукты и технологии

  • Испытайте продукты IBM самым удобным для себя способом: скачайте ознакомительную версию продукта, опробуйте продукт в Интернете или поработайте с продуктом в облачной среде.
  • Общеязыковый пакет Apache содержит полезные методы для выполнения шифрования и других общих операций. Для конкретного случая, описанного в данной статье, можно использовать статический метод преобразования строк org.apache.commons.lang3.StringEscapeUtils.escapeHtml4(String input).

Обсудить

  • Сообщество developerWorks: связывайтесь с другими пользователями портала developerWorks и знакомьтесь с блогами, форумами, группами и вики-ресурсами разработчиков.

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Технология Java
ArticleID=950257
ArticleTitle=Предотвращение межсайтовых атак с внедрением сценария путем кодирования HTML-ответов
publish-date=10282013