Подтвердить что ты не робот

Возможно ли, что XSS использует ответы JSON с надлежащим выравниванием строки JavaScript

Ответы JSON могут быть использованы с помощью переопределения конструкторов Array или если враждебные значения не являются бегущими по строкам JavaScript.

Предположим, что оба этих вектора адресованы обычным образом. Google лихо захватывает прямой ответ JSON, предварительно прикрывая все JSON чем-то вроде:

throw 1; < don't be evil' >

И затем следуют остальные JSON. Поэтому д-р Зел не может, используя описанный здесь эксплойт http://sla.ckers.org/forum/read.php?2,25788, получит ваш файл cookie (при условии, что вы вошли в систему), поставив следующие на его сайте:

<script src="http://yourbank.com/accountStatus.json"> 

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

Но мой вопрос: что, если вы все это делаете?

Burpsuite (автоматизированный инструмент безопасности) обнаруживает встроенные попытки XSS, которые возвращаются unHTML-экранированным в ответ JSON и сообщает об этом как уязвимость XSS. У меня есть отчет о том, что мое приложение содержит уязвимости такого рода, но я не уверен. Я пробовал это, и я не могу выполнить работу эксплойта.

Поэтому я не думаю, что это правильно, но я прошу сообщество StackOverflow взвесить.

Существует один конкретный случай, когда я использую sniffing типа IE MIME, который, как я думаю, может привести к эксплойту. В конце концов, в IE 7 по-прежнему была "функция", в которой теги script, встроенные в комментарии к изображениям, выполнялись независимо от заголовка Content-Type. Пусть сначала оставить такое явно глупое поведение.

Разумеется, JSON будет анализироваться либо на основе собственного парсера JavaScript (Window.JSON в Firefox), либо на eval() в соответствии со старым поведением jQuery по умолчанию. В любом случае это не приведет к выполнению следующего предупреждения:

{"myJSON": "legit", "someParam": "12345<script>alert(1)</script>"}

Я прав, или я не прав?

4b9b3361

Ответ 1

Эта потенциальная уязвимость xss можно избежать, используя правильный Content-Type. На основе RFC-4627 все ответы JSON должны использовать тип application/json. Следующий код не уязвим для xss, проверьте его:

<?php
header('Content-type: application/json'); 
header("x-content-type-options: nosniff");
print $_GET['json'];
?>

Заголовок nosniff используется для отключения обнюхания содержимого в старых версиях Internet Explorer. Другой вариант:

<?php
header("Content-Type: application/json");
header("x-content-type-options: nosniff");
print('{"someKey":"<body onload=alert(\'alert(/ThisIsNotXSS/)\')>"}');
?>

когда вышеуказанный код просматривается браузером, пользователю было предложено загрузить файл JSON, JavaScript не был выполнен в современных версиях Chrome, FireFox и Internet Explorer. Это будет RFC нарушение.

Если вы используете JavaScript для eval() JSON выше или напишите ответ на страницу, тогда он станет DOM Based XSS. Основанный на DOM XSS исправляется на клиенте, дезинфицируя JSON, прежде чем действовать на эти данные.

Ответ 2

Burpsuite (автоматизированный инструмент безопасности) обнаруживает встроенные попытки XSS которые возвращаются unHTML-экранированным в ответ JSON, и он сообщает об этом как уязвимость XSS.

Может быть, он пытается предотвратить уязвимость, описанную в правиле 3.1 OWASP XSS Cheat Sheet.

Они приводят следующий пример уязвимого кода:

<script>
    var initData = <%= data.to_json %>;
</script>

Даже если двойные кавычки, косые черты и символы новой строки правильно экранированы, вы можете выйти из JSON, если он встроен в HTML:

<script>
    var initData = {"foo":"</script><script>alert('XSS')</script>"};
</script>

jsFiddle.

to_json() функция может предотвратить эту проблему, префикс каждой косой черты с обратной косой чертой. Если JSON используется в атрибуте HTML, вся строка JSON должна быть экранирована HTML. Если он используется в атрибуте href="javascript:", он должен иметь URL-экранирование.

Ответ 3

Если мы ограничиваем область действия IE (все версии), предположим, что вы используете сайт на основе PHP или ASP.NET и игнорируете фильтр IE-анти-xss, тогда вы ошибаетесь: ваши пользователи уязвимы. Настройка "Тип контента: приложение /json " тоже не поможет.

Это связано с (как вы упоминаете) поведением обнаружения содержимого IE, которое выходит за рамки обнюхивания HTML-тегов в теле ответа, чтобы включить анализ URI.

Это сообщение в блоге объясняет это очень хорошо:

http://blog.watchfire.com/wfblog/2011/10/json-based-xss-exploitation.html