Является ли это уязвимым для xss на основе дом? - PullRequest
3 голосов
/ 01 декабря 2011

У меня есть разногласие с аудитором безопасности, независимо от того, уязвим ли фрагмент html / js для XSS или нет.

Короче вот оно:

<html>
<form name="myform" action="page.php" method="post" onsubmit="return validate()">
<input name="field" type="text" size="50" />
<input type="submit" value="Submit" />
</form>

<script>
function validate()
{
  var str=document.myform.field.value;
  alert("Error in " + str);
  return false
}
</script>
</html>

Итак, мой аудитор говорит, что это может быть уязвимо для XSS на основе DOM, но пока не дал мне пример.

Лично я считаю, что это не так, поскольку из-за оповещения + в строке str является строкой, поэтому она не выполняется. Например, если кто-то предоставляет «document.cookie» в форме и нажимает «Отправить», в окне предупреждения будет напечатано «Ошибка в document.cookie» (а не фактический файл cookie).

Ответы [ 2 ]

3 голосов
/ 01 декабря 2011

Единственный способ, которым это может быть потенциальной угрозой, - это если вы включаете сценарии, которые не находятся под вашим контролем из ненадежного источника.

  • Вредоносный скрипт может перезаписать alert, чтобы стать другой функцией. Например, он может отправлять данные, переданные на alert, на свои собственные серверы.
  • Вредоносный скрипт может перезаписать значение document.myform.field объектом, содержащим свойство value. Таким образом, alert может отображать сообщение, похожее на другое сообщение об ошибке, например:

Ошибка аутентификации. Перейдите на сайт www.phisherman.com и введите свое имя пользователя и пароль.

Если вы ссылаетесь на скрипты из ненадежных источников, у вас намного больше проблем безопасности, чем указано выше.

Если вы ссылаетесь на такие ненадежные сценарии, то нет, это не уязвимо для XSS на основе DOM. form.field.value содержит строку. Он не оценивается как сценарий, escape-символы не действуют, строка, содержащаяся в текстовом поле, будет отображаться в окне предупреждения. Ничто из того, что пользователь вводит в это поле, не может быть использовано для нанесения вреда вашим серверам или для повреждения ваших данных на основе опубликованного вами кода.

Я бы сказал, что если ваш аудитор имеет дело с «XSS на основе DOM», где пользователь может нанести вред вашим серверам, манипулируя DOM, ваш аудитор мало знает о DOM и JavaScript на основе браузера. Пользователь может взломать консоль JavaScript и выполнить всевозможные сценарии, включая запросы XMLHttp на ваш сервер, которые могут выглядеть так, как будто они получены из вашего собственного сценария. Для этих типов атак необходимо предпринять меры предосторожности на сервере. Бесполезно беспокоиться о рисках безопасности для DOM или пользовательского интерфейса из-за ввода пользователя в поля формы.

2 голосов
/ 01 декабря 2011

Определенно нет проблем с XSS.

Что делает ваша функция validate ():

  1. С помощью API DOM скопируйте ссылку на свойство узла DOM (свойство "value" элемента <input>) в переменную JavaScript.
  2. Выполнить операцию конкатенации строк JavaScript. На этом этапе совершенно не имеет значения, что это за строка символов.
  3. Передать строку результата в window.alert(). Функция «alert ()» всегда обрабатывает свой аргумент строго как строку. Единственным «специальным» символом является символ новой строки, и все, что он делает, - это перенос текста на новую строку.

В частности, обратите внимание, что:

     window.alert("<script>var u_r_so_hacked = true;</script>");

покажет "" теги, такие же, угловые скобки и все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...