Ответы 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, которые возвращаются без экранирования HTML в ответе JSON, и сообщает об этом как об уязвимости XSS. У меня есть сообщение, что мое приложение содержит уязвимости такого рода, но я не уверен. Я пробовал это, и я не могу заставить эксплойт работать.
Так что я не думаю, что это правильно, но я прошу вас принять участие в сообществе StackOverflow.
Есть один конкретный случай, например, при прослушивании IE MIME-типа, который, я думаю, может привести к эксплойту. В конце концов, в IE 7 все еще была «особенность», заключающаяся в том, что теги скрипта, встроенные в комментарии к изображению, выполнялись независимо от заголовка Content-Type. Давайте сначала оставим в стороне такое явно глупое поведение.
Конечно, JSON будет анализироваться либо собственным синтаксическим анализатором JavaScript (Window.JSON в Firefox), либо eval () в соответствии со старым поведением jQuery по умолчанию. Ни в том, ни в другом случае следующее выражение не приведет к выполнению предупреждения:
{"myJSON": "legit", "someParam": "12345<script>alert(1)</script>"}
Я прав или я не прав?