Вопрос по javascript, csrf, post, security – CSRF - могут ли поддельные POST содержать произвольные данные?

5

Поддельные POST-запросы могут быть созданы ненадежными веб-сайтами, создав форму и разместив ее на целевом сайте. Однако необработанное содержимое этого POST будет закодировано браузером в следующем формате:

param1=value1&param2=value2

Возможно ли это дляuntrusted websites построить поддельные посты, которые содержатarbitrary необработанный контент - например, строковый JSON?

{param1: value1, param2: value2}

Перефразируй:Can websites cause the browser to POST arbitrary content to third-party domains?

Ваш Ответ

5   ответов
1

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

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

@JS_Riddler: спецификации HTML ничего не говорят о подобных вещах. Я не знаю, есть ли что-нибудь в спецификациях HTTP по этому поводу, но ограничения безопасности в браузерах обычно намного строже, чем указано в стандартах. В любом случае, можно легко настроить веб-страницу, которая отправляет запрос через прокси-сервер, который отправляет его на ваш сервер, так что посетитель может опубликовать форму, где контент может быть заменен.
В этом случае запросы не будут подделаны, поскольку они будут созданы пользователем. Что я действительно получаю: запрещено ли в спецификации HTML браузерам отправлять произвольный контент POST в другие домены. Я верю в это, но хотел бы получить подтверждение. JS_Riddler
«Трудностями» ты имеешь в виду невозможное? Это действительно вопрос: это возможно или нет? JS_Riddler
@JS_Riddler: программа может выступать в качестве браузера в любом отношении, поэтому идентификация пользователя не является защитой. Кто-то может даже взять любой проект браузера с открытым исходным кодом и переписать его, чтобы сделать что-нибудь, поэтому даже если какой-либо текущий браузер не может отправить сообщение с произвольным содержимым, это, безусловно, можно сделать.
CSRF работает только в том случае, если запрос также содержит личность пользователя, поэтому я не беспокоюсь о том, что клиенты, не являющиеся браузерами, подделывают запрос. JS_Riddler
9

Тело POST запроса HTML-формы всегда либоapplication/x-www-form-urlencoded, multipart/form-data, или жеtext/plain поскольку они отражают действительные значения дляenctype attribute, Особенноtext/plain one can be used to form valid JSON data, Таким образом, здесь можно использовать CSRF на основе форм, однако для этого требуется, чтобы сервер принял его какtext/plain.

Кроме того, CSRF на основе XHR может использоваться в качествеAPI XMLHttpRequest позволяет отправлять произвольные данные POST, Единственным оставшимся препятствием для этого является Политика одного и того же происхождения: только если оба имеют одинаковое происхождениеor ваш сервер поддерживаетОбмен запросами между источниками и позволяет совместное использование ресурсов, такие действительные запросы POST могут быть подделаны.

Я думаю, что этот принятый ответ совершенно неверный для текста / простого текста. Посмотрите этот пример для подделки XML:pentestmonkey.net/blog/csrf-xml-post-request , Тот же самый метод может быть использован для чего-то вроде & lt; input name = & quot; equals & quot; & quot; & ap; значение = "a", "param1": "значение 1"} " / & GT ;.
@BradenAnderson Вы правы, соответственно обновил мой ответ.
Мне все еще кажется опасным полагаться на то, что application / json никогда не будет добавлен; Я думаю, что стандартная защита по токену / nonce является разумной. Увидетьsecurity.stackexchange.com/questions/10227/csrf-with-json-post.
@JS_Riddler Theserver has a processing model, тоже.
1

Вы можете создать действительный JSON через обычную форму сообщения. Это просто вопрос творческого именования параметров формы. В частности, имена параметров могут содержать кавычки.

http://blog.opensecurityresearch.com/2012/02/json-csrf-with-parameter-padding.html

0

В случае форм чистого HTML, да, он всегда будет закодирован в соответствии сспекуляция, Но естьдругие схемы кодирования такие как MIME multipart. Существует также вопрос Javascript иXMLHttpRequest, Кодирование конкретно упоминается только в одном случае. Это сильно подразумевает, что в других случаях кодирование не применяется.

1

Да! POST-запрос - это не что иное, как текст с определенным форматом, отправляемый на веб-сервер. Вы можете использовать инструменты разработчика IE или Chrome, чтобы посмотреть, как выглядит каждый запрос.

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

http://tools.ietf.org/html/rfc2616

Извините, я имею в виду именно ненадежные веб-сайты, создающие эти сообщения, а не клиентов. Я обновил вопрос. JS_Riddler

Похожие вопросы