Fast ethernet unmanaged switch series

Подделка межсайтовых запросов (CSRF) простыми словами

  • Предположим, вы в настоящее время вошли в систему онлайн-банкинга по адресу
  • Предположим, перевод денег из приведет к запросу (концептуально) формы , (Ваш номер счета не нужен, поскольку он подразумевается вашим логином.)
  • Ты посещаешь , не зная, что это вредоносный сайт.
  • Если владелец этого сайта знает форму вышеуказанного запроса (просто!) И правильно догадывается, что вы вошли в систему (требуется немного удачи!), они могли бы включить на своей странице запрос, как (где это номер их счета Каймановых островов и это сумма, которую вы раньше считали Рады обладать).
  • Вы извлек это страница, так ваш браузер сделает этот запрос.
  • Ваш банк не может распознать источник этого запроса: ваш веб-браузер отправит запрос вместе с вашим печенье, и это будет выглядеть совершенно законно. Там идут ваши деньги!

Это мир без токенов CSRF.

Теперь к лучшему с Токены CSRF:

  • Запрос на передачу расширен третьим аргументом: ,
  • Этот токен — огромное случайное число, которое невозможно угадать. будет размещать на своей веб-странице, когда они будут служить вам. это разные каждый раз, когда они подают любую страницу кому-либо.
  • Злоумышленник не может угадать токен, не может убедить ваш веб-браузер отказаться от него (если браузер работает правильно …), и поэтому злоумышленник не быть в состоянии создать действительный запрос, потому что запросы с неправильным токеном (или без токена) будут отклонены ,

Результат: Вы держите свой денежные единицы. Я предлагаю вам пожертвовать часть этого в Википедии.

(Ваш пробег может отличаться.)

РЕДАКТИРОВАТЬ из комментария стоит прочитать:

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

Issuing tokens

A token can be:

  • Opaque: Reveals no details other than the value itself (like a random string)
  • Self-contained: Contains details about the token itself (like JWT).

See details below:

Random string as token

A token can be issued by generating a random string and persisting it to a database along with the user identifier and an expiration date. A good example of how to generate a random string in Java can be seen here. You also could use:

JWT (JSON Web Token)

JWT (JSON Web Token) is a standard method for representing claims securely between two parties and is defined by the RFC 7519.

It’s a self-contained token and it enables you to store details in claims. These claims are stored in the token payload which is a JSON encoded as Base64. Here are some claims registered in the RFC 7519 and what they mean (read the full RFC for further details):

  • : Principal that issued the token.
  • : Principal that is the subject of the JWT.
  • : Expiration date for the token.
  • : Time on which the token will start to be accepted for processing.
  • : Time on which the token was issued.
  • : Unique identifier for the token.

Be aware that you must not store sensitive data, such as passwords, in the token.

The payload can be read by the client and the integrity of the token can be easily checked by verifying its signature on the server. The signature is what prevents the token from being tampered with.

You won’t need to persist JWT tokens if you don’t need to track them. Althought, by persisting the tokens, you will have the possibility of invalidating and revoking the access of them. To keep the track of JWT tokens, instead of persisting the whole token on the server, you could persist the token identifier ( claim) along with some other details such as the user you issued the token for, the expiration date, etc.

When persisting tokens, always consider removing the old ones in order to prevent your database from growing indefinitely.

How token-based authentication works

In token-based authentication, the client exchanges hard credentials (such as username and password) for a piece of data called token. For each request, instead of sending the hard credentials, the client will send the token to the server to perform authentication and then authorization.

In a few words, an authentication scheme based on tokens follow these steps:

  1. The client sends their credentials (username and password) to the server.
  2. The server authenticates the credentials and, if they are valid, generate a token for the user.
  3. The server stores the previously generated token in some storage along with the user identifier and an expiration date.
  4. The server sends the generated token to the client.
  5. The client sends the token to the server in each request.
  6. The server, in each request, extracts the token from the incoming request. With the token, the server looks up the user details to perform authentication.

    • If the token is valid, the server accepts the request.
    • If the token is invalid, the server refuses the request.
  7. Once the authentication has been performed, the server performs authorization.
  8. The server can provide an endpoint to refresh tokens.

Note: The step 3 is not required if the server has issued a signed token (such as JWT, which allows you to perform stateless authentication).

Методы защиты

Первое, что приходит на ум, когда речь заходит о защите от CSRF – это проверка значения заголовка Referer. И действительно, поскольку подделка HTTP-запросов заключается в передаче запроса с третьего сайта, контроль исходной страницы, чей адрес автоматически добавляется браузером в заголовки запроса, может решить проблему.
Однако этот механизм имеет ряд недостатков. Во-первых – перед разработчиком встает вопрос об обработке запросов, не имеющих заголовка Referer как такового. Многие из персональных межсетевых экранов и анонимизирующих proxy-серверов вырезают Referer, как потенциально небезопасный заголовок. Соответственно, если сервер будет игнорировать подобные запросы, группа наиболее «параноидально» настроенных граждан не смогут с ним работать.
Во-вторых, в некоторых ситуациях заголовок Referer может быть подделан, например, с помощью уже упоминавшегося трюка с Flash. Если пользователь применяет IE 6.0, то содержимое заголовка запроса может быть модифицировано c использованием ошибки в реализации XmlHttxmpquest. Уязвимость заключается в возможности использования символов перевода строки в имени HTTP-метода, что позволяет изменять заголовки и даже внедрять дополнительный запрос. Эта уязвимость была обнаружена Amit Clein () в 2005 году и снова открыта в 2007. Ограничением этого метода является то, что он работает только в случае наличия между пользователем и сервером HTTP-Proxy или размещения серверов на одном IP-адресе, но с разными доменными именами.
Другой распространенный метод – добавление уникального параметра к каждому запросу, который затем проверяется сервером. Параметр может добавляться к URL при использовании GET запроса как например, в Google Desktop или в виде спрятанного параметра формы, при использовании POST. Значение параметра может быть произвольным, главное, чтобы злоумышленник не мог его предсказать, например – значение сессии пользователя.

Рис. 6. Защита от CSRF в Bitrix

Для быстрого добавления функции проверки CSRF в свое приложение можно воспользоваться следующим подходом:
1. Добавлять в каждую генерируемую страницу небольшой JavaScript, дописывающий во все формы дополнительный скрытый параметр, которому присваивается значение Cookie.
2. Проверять на сервере, что переданные клиентом с помощью метода POST данные содержат значение, равное текущему значению Cookie.
Пример подобного клиентского сценария приведен ниже:

Дальнейшим развитием этого подхода является сохранение идентификатора сессии не в Cookie, а в качестве скрытого параметра формы (например, VIEWSTATE).
В качестве метода противодействия CSRF могут использоваться различные варианты тестов Тьюринга, например, хорошо известные всем изображения — CAPTCHA. Другим популярным вариантом является необходимость ввода пользовательского пароля при изменении критичных настроек.

Рис. 7. Защита от CSRF в mail.ru

Таким образом, Cross-Site Request Forgery являются атакой, направленной на клиента Web-приложения и использующей недостаточную проверку источника HTTP-запроса. Для защиты от подобных атак может использоваться дополнительный контроль источника запроса на основе заголовка Referer или дополнительного «случайного» параметра.

Сергей Гордейчик работает системным архитектором компании Positive Technologies, где он специализируется в вопросах безопасности приложений, безопасности беспроводных и мобильных технологий. Автор также является ведущим разработчиком курсов «Безопасность беспроводных сетей», «Анализ и оценка защищенности Web-приложений» учебного центра «Информзащита» . Опубликовал несколько десятков статей в “Windows IT Pro/RE”, SecurityLab и других изданиях. Является участником проектов Web Application Security Consortium (WASC).

Подписывайтесь на каналы «SecurityLab» в Telegram и , чтобы первыми узнавать о новостях и эксклюзивных материалах по информационной безопасности.

Using JWT

There are a few Java libraries to issue and validate JWT tokens such as:

  • jjwt
  • java-jwt
  • jose4j

To find some other great resources to work with JWT, have a look at http://jwt.io.

Handling token revocation with JWT

If you want to revoke tokens, you must keep the track of them. You don’t need to store the whole token on server side, store only the token identifier (that must be unique) and some metadata if you need. For the token identifier you could use UUID.

The claim should be used to store the token identifier on the token. When validating the token, ensure that it has not been revoked by checking the value of the claim against the token identifiers you have on server side.

For security purposes, revoke all the tokens for a user when they change their password.

Supporting role-based authorization with JSR-250 annotations

Alternatively to defining the roles in the annotation as shown above, you could consider JSR-250 annotations such as , and .

JAX-RS doesn’t support such annotations out-of-the-box, but it could be achieved with a filter. Here are a few considerations to keep in mind if you want to support all of them:

  • on the method takes precedence over and on the class.
  • on the method takes precedence over on the class.
  • on the method takes precedence over on the class.
  • can’t be attached to classes.
  • on the class takes precedence over on the class.

So an authorization filter that checks JSR-250 annotations could be like:

Expected CSRF Token: not present

Flask-Debug-Toolbar во вкладке Templates показывает такой токен:

session 

Я так понимаю, что этот токен — это SECRET_KEY из конфига:

SECRET_KEY = 'iddqd3133122'

но при событии onClick передаётся другой токен:

onclick="Sijax.request('say_hi', { data: { 'csrf_token': '1474296572##ae6869da1ecba603d2819d02144d5aad63988140' } });"

Саму ошибку показывает функция, которая находится в __init__.py

Содержимое __init__.py

import os
from flask import (Flask,
                   redirect,
                   url_for,
                   session,
                   request,
                   abort,
                   current_app)
# from flask_login import LoginManager
from flask_wtf.csrf import CsrfProtect, safe_str_cmp
from os import path
 
from .database import db
from werkzeug.contrib.fixers import ProxyFix
import flask_sijax
 
import hmac
from hashlib import sha1
 
def create_app(config=None):
    app = Flask(__name__)
    app.config.from_object(os.environ)
    app.wsgi_app = ProxyFix(app.wsgi_app)
    db.init_app(app)
    if app.debug is True:
        try:
            from flask_debugtoolbar import DebugToolbarExtension
            toolbar = DebugToolbarExtension(app)
        except:
            pass
 
    with app.test_request_context():
        db.create_all()
 
    from .general import controllers as general
    from .shop import controllers as shop
    from .test import controllers as test
    app.register_blueprint(shop.module)
    app.register_blueprint(general.module)
    app.register_blueprint(test.module)
 
    flask_sijax.Sijax(app)
 
    @app.before_request
    def check_csrf_token():
        """Checks that token is correct, aborting if not"""
        if request.method in ("GET",):  # not exhaustive list
            return
        token = request.form.get("csrf_token")
        if token is None:
            app.logger.warning("Expected CSRF Token: not present")
            abort(400)
        if not safe_str_cmp(token, csrf_token()):
            app.logger.warning("CSRF Token incorrect")
            abort(400)
 
    @app.template_global('csrf_token')
    def csrf_token():
        """
        Generate a token string from bytes arrays. The token in the session is user
        specific.
        """
        if "_csrf_token" not in session:
            session = os.urandom(128)
        return hmac.new(app.secret_key, session,
                        digestmod=sha1).hexdigest()
 
    def log_error(*args, **kwargs):
        current_app.logger.error(*args, **kwargs)
 
    CsrfProtect(app)
 
    return app

Но я не уверен, что и объявляются там, где нужно.

Без CSRF всё работает нормально.

Я не совсем понимаю, нужно ли, чтобы токены совпадали?
Я пробовал «подсунуть» в в onclick тот же токен, что и указан в FDT, но результат не изменился.

Не понимаю, что делать.

Злая форма

«Классический» сценарий атаки CSRF таков:

  • Петя является залогиненным на сайт, допустим, site.com. У него есть  сохраненная сессия в куках.
  • Петя попал на «злую страницу», например злоумышленник пригласил его сделать это письмом или каким-то другим способом.
  • На зараженной странице находится форма такого вида:

  • При заходе на зараженную страницу JavaScript вызывает form.submit, отправляя таким образом форму на server.com.
  • Сайт server.com проверяет куки, видит, что посетитель авторизован и обрабатывает форму. В данном примере форма отправляет посылку сообщения.

Итог атаки – Петя, зайдя на зараженную страницу, получается отправил письмо от своего имени. Содержимое письма сформировано злоумышленником.

Токен и AJAX

Теперь перейдём к AJAX-запросам.

Что если посылка сообщений в нашем интерфейсе реализуется через объект XMLHttpRequest?

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

Здесь возможны варианты, самый простой – это дополнительная кука.

  1. При авторизации сервер  например устанавливает куку с именем CSRF-TOKEN, и пишет в неё токен.
  2. Код, осуществляющий XMLHttpRequest, получает куку и ставит заголовок X-CSRF-TOKEN с ней:

    var request = new XMLHttpRequest(); 
    var csrfCookie = document.cookie.match(/CSRF-TOKEN=(+)/); 
    if (csrfCookie) { request.setRequestHeader("X-CSRF-TOKEN", csrfCookie); 
    }
  1. Сервер проверяет, есть ли заголовок и содержит ли он верный токен.

Защита действует потому, что прочитать куку может только JavaScript с того же домена. «Зараженная страница» не сможет «переложить» куку в заголовок.

Если нужно сделать не XMLHttpRequest, а, к примеру, динамически сгенерировать форму из JavaScript – она также подписывается аналогичным образом, скрытое поле или дополнительный параметр генерируется по куке.

«Internet of Things» Gateway

The NXP JN5168-RD6040 «Internet of Things» (IoT) Gateway is an Ethernet gateway for wireless networks operating on IEEE 802.15.4-based protocols such as ZigBee PRO. It is used with a conventional IP router to connect a wireless network to an IP-based network, such as the Internet, allowing the control and monitoring of wireless nodes from everyday IP-connected devices, such as smart phones, tablets, PCs and the Cloud.

The IoT Gateway is designed around NXP’s JN5168 wireless microcontroller and Arm9-based LPC3240 microcontroller, which runs the OpenWRT distribution of the Linux operating system, providing an easy-to-use platform for system development.

The JN5168-RD6040 IoT Gateway is available to buy as a product. Full technical details are provided in the Application Note ZigBee IoT Gateway (JN-AN-1194). Design resources for custom builds of the IoT Gateway are provided in the Reference Design JN5168-RD6040 IoT Gateway (JN-RD-6040).

什么是CSRF攻击

CSRF全称Cross-Site Request Forgery,是跨站请求伪造攻击的意思,这里面有两个关键词,一个是跨站,一个是伪造。前者说明CSRF攻击发生时所伴随的请求的来源,后者说明了该请求的产生方式。所谓伪造即该请求并不是用户本身的意愿,而是由攻击者构造,由受害者被动发出的。流程如下:

用户首先登录了一个普通网站A,这时新的session就会被创建,用户的浏览器会自动存储cookie信息以及session id,这样短期内再打开网站或者网站的其他链接,用户就不需要重复登陆了。如果此时,用户访问了攻击者制作的恶意网站B,攻击者设置的对A的跨站请求就会被触发,并且由于浏览器的机制,cookie信息和session id会被附加到这个请求中(即使它是跨站的)。于是,A就会以为这个请求是用户发出的从而执行请求内容。只要稍加设计,攻击者就能利用该漏洞进行盗取用户隐私信息,篡改用户数据等行为。

具体来说,恶意网站可以伪造HTTP的GET和POST请求,在HTML的img,iframe,frame等标签中可以发起GET请求,而form标签可以发起POST请求。前者相对简单,后者需要用到JavaScript的技术。因为Elgg只使用POST,所以实验中会涉及到HTTP POST请求和JavaScript的使用。

How to mitigate CSRF attacks?

Use only JSON APIs

AJAX calls use JavaScript and are CORS-restricted.
There is no way for a simple to send ,
so by accepting only JSON,
you eliminate the possibility of the above form.

Disable CORS

The first way to mitigate CSRF attacks is to disable cross-origin requests.
If you’re going to allow CORS,
only allow it on as they are not supposed to have side-effects.

Unfortunately, this does not block the above request as it does not use JavaScript (so CORS is not applicable).

Check the referrer header

Unfortunately, checking the referrer header is a pain in the ass,
but you could always block requests whose referrer headers are not from your site.
This really isn’t worth the trouble.

For example, you could not load sessions if the referrer header is not your server.

GET should not have side effects

Make sure that none of your requests change any relevant data in your database.
This is a very novice mistake to make and makes your app susceptible to more than just CSRF attacks.

Don’t use method override!

Many applications use method-override to use
, , and requests over a regular form.
This, however, converts requests that were previously invulnerable vulnerable!

Don’t use in your apps — just use AJAX!

Don’t support old browsers

Old browsers do not support CORS or security policies.
By disabling support for older browsers
(which more technologically-illiterate people use, who are more (easily) attacked),
you minimize CSRF attack vectors.

CSRF Tokens

Alas, the final solution is using CSRF tokens.
How do CSRF tokens work?

  1. Server sends the client a token.
  2. Client submits a form with the token.
  3. The server rejects the request if the token is invalid.

An attacker would have to somehow get the CSRF token from your site,
and they would have to use JavaScript to do so.
Thus, if your site does not support CORS,
then there’s no way for the attacker to get the CSRF token,
eliminating the threat.

Make sure CSRF tokens can not be accessed with AJAX!
Don’t create a route just to grab a token,
and especially don’t support CORS on that route!

The token just needs to be «unguessable»,
making it difficult for an attacker to successfully guess within a couple of tries.
It does not have to be cryptographically secure.
An attack is one or two clicks by an unbeknownst user,
not a brute force attack by a server.

Как это использовать¶

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

  1. Промежуточный слой CSRF активирован по умолчанию и находится в настройке . Если вы переопределяете эту настройку, помните, что ‘django.middleware.csrf.CsrfViewMiddleware’должен следовать перед промежуточными слоями, которые предполагают, что запрос уже проверен на CSRF атаку.

    Если вы отключили защиту, что не рекомендуется, вы можете использовать декоратор в части представлений, которые вы хотите защитить (смотри ниже).

  2. В любом шаблоне, который использует POST форму, используйте тег внутри элемента если форма для внутреннего URL, т. е.:

    Это не должно делаться для POST форм, которые ссылаются на внешние URL’ы, поскольку это может вызвать утечку CSRF токена, что приводит к уязвимости.

  3. В соответствующих функциях представления, убедитесь, что 'django.template.context_processors.csrf' контекстный процессор используется. Обычно, это может быть сделано в один из двух способов:

    1. Использовать RequestContext, который всегда использует 'django.template.context_processors.csrf' (не зависимо от параметра ). Если вы используете общие представления или contrib приложения, вы уже застрахованы, так как эти приложения используют RequestContext повсюду.

    2. Вручную импортировать и использовать процессор для генерации CSRF токена и добавить в шаблон контекста. т.е.:

      from django.shortcuts import render_to_response
      from django.template.context_processors import csrf
      
      def my_view(request):
          c = {}
          c.update(csrf(request))
          # ... view code here
          return render_to_response("a_template.html", c)
      

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

AJAX

Хотя вышеописанный метод может быть использован для AJAX POST запросов, он имеет некоторые неудобства: вы должны не забывать передавать CSRF токен в POST данных с каждым POST запросом. По этой причине есть альтернативный метод: для каждого XMLHttpRequest можно устанавливать кастомный заголовок X-CSRFToken в значение CSRF токена. Это проще, потому что многие javascript фреймворки предоставляют хуки, которые позволяют устанавливать заголовки для каждого запроса.

В качестве первого шага, вы должны получить CSRF токен самостоятельно. Рекомендованный источник для токен — это кука csrftoken , которая будет установлена, если вы включили CSRF защиту для ваших представлений как описано выше.

Примечание

Кука CSRF токена называется csrftoken по умолчанию, но вы можете управлять именем куки при помощи параметра .

Получение токена является простым:

// using jQuery
function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie != '') {
        var cookies = document.cookie.split(';');
        for (var i = ; i  cookies.length; i++) {
            var cookie = jQuery.trim(cookiesi]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(, name.length + 1) == (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
var csrftoken = getCookie('csrftoken');

Вышеприведенный код может быть упрощен при помощи плагина jQuery для замены getCookie:

var csrftoken = $.cookie('csrftoken');

Примечание

CSRF токен также представлен в DOM, но только если он явно включен, используя в шаблоне. Кука содержит канонический токен; CsrfViewMiddleware будет предпочитать этот куки куке из DOM. Не смотря на это, вы гарантировано имеете куки, если токен представлен в DOM, так что вы должны использовать куки.

Предупреждение

Если ваше представление не рендерит шаблон, содержащий шаблонный тег , Django может не установить куки с CSRF токеном.

В конце концов, вы будете должны фактически установить заголовок в вашем AJAX запросе, одновременно защищая CSRF токен от отправки на другие домены, используя settings.crossDomain в jQuery 1.5.1 и выше:

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
    beforeSend function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});

Другие шаблонизаторы

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

Например, в шаблонизаторе Jinja2 , ваша форма может содержать следующее:

 style="display:none">
    type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">


Вы можете использовать JavaScript подобный для получения значения CSRF токена.

Как это работает¶

CSRF базируется на следующих вещах:

  1. A CSRF cookie that is based on a random secret value, which other sites
    will not have access to.

    This cookie is set by . It is sent with every
    response that has called (the
    function used internally to retrieve the CSRF token), if it wasn’t already
    set on the request.

    In order to protect against BREACH attacks, the token is not simply the
    secret; a random salt is prepended to the secret and used to scramble it.

    For security reasons, the value of the secret is changed each time a
    user logs in.

  2. A hidden form field with the name „csrfmiddlewaretoken“ present in all
    outgoing POST forms. The value of this field is, again, the value of the
    secret, with a salt which is both added to it and used to scramble it. The
    salt is regenerated on every call to so that the form field
    value is changed in every such response.

    Эта часть выполняет шаблонным тегом.

  3. Все HTTP запросы, которые не GET, HEAD, OPTIONS или TRACE, должны содержать CSRF куку, и поле „csrfmiddlewaretoken“ с правильным значением. Иначе пользователь получит 403 ошибку.

    When validating the „csrfmiddlewaretoken“ field value, only the secret,
    not the full token, is compared with the secret in the cookie value.
    This allows the use of ever-changing tokens. While each request may use its
    own token, the secret remains common to all.

    Эта проверка выполняется в .

  4. In addition, for HTTPS requests, strict referer checking is done by
    . This means that even if a subdomain can set or
    modify cookies on your domain, it can’t force a user to post to your
    application since that request won’t come from your own exact domain.

    This also addresses a man-in-the-middle attack that’s possible under HTTPS
    when using a session independent secret, due to the fact that HTTP
    headers are (unfortunately) accepted by clients even when
    they are talking to a site under HTTPS. (Referer checking is not done for
    HTTP requests because the presence of the header isn’t reliable
    enough under HTTP.)

    Если указана настройка , значение «referer» будет сравниваться с этим значением. Значение поддерживает под-домены. Например, позволить отправлять POST запросы с и . Если настройка не указана, «referer» должен быть равен HTTP заголовку .

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

Такой подход гарантирует, что только формы, отправленные с доверенных доменов, могут передавать POST данные.

It deliberately ignores GET requests (and other requests that are defined as
„safe“ by ). These requests ought never to have any
potentially dangerous side effects, and so a CSRF attack with a GET request
ought to be harmless. defines POST, PUT, and DELETE
as „unsafe“, and all other methods are also assumed to be unsafe, for maximum
protection.

The CSRF protection cannot protect against man-in-the-middle attacks, so use
with
. It also assumes and that there aren’t any
on your site
(because XSS vulnerabilities already let an attacker do anything a CSRF
vulnerability allows and much worse).

CSRF-уязвимости все еще актуальны +54

  • 04.06.18 07:57


mi5ha6in

#412855

Хабрахабр

12100

Информационная безопасность, Разработка веб-сайтов, Блог компании Конференции Олега Бунина (Онтико)

CSRF (Сross Site Request Forgery) в переводе на русский — это подделка межсайтовых запросов. Михаил Егоров (0ang3el) в своем докладе на Highload++ 2017 рассказал о CSRF-уязвимостях, о том, какие обычно используются механизмы защиты, а также как их все равно можно обойти. А в конце вывел ряд советов о том, как правильно защищаться от CSRF-атак. Под катом расшифровка этого выступления.

О спикере:Дисклаймер:

Cookies

attacker.comexample.com

  • приложение example.com, которое уязвимо к CSRF,
  • пользователь,
  • сайт атакующего, где есть страничка csrf-xhr.html.

example.com

Toolchains

NXP provide toolchains for JN516x application development, based on the Eclipse Integrated Development Environment (IDE). The required toolchain (JN-SW-4041 or JN-SW-4141) depends on the wireless network protocol stack – for example, the ‘BeyondStudio for NXP’ toolchain (JN-SW-4141) is used for ZigBee 3.0, Home Automation and Light Link. The relevant toolchain is available on the web page for each protocol (see above).

A JN51xx Flash programmer utility is supplied in the toolchains. In addition, a separate command-line JN51xx Flash programmer utility (JN-SW-4107) is available.

Кеширование¶

При использовании шаблонного тега (или вызове функции get_token) CsrfViewMiddleware добавит куку и заголовок Vary: Cookie в ответ. Это значит, что CsrfViewMiddleware правильно работает с кеширующим промежуточным слоем, если все делать по инструкции (UpdateCacheMiddleware следует перед всеми остальными промежуточными слоями).

Однако, если вы использует кеширующий декоратор для конкретного представления, CSRF промежуточный слой еще не установил “Vary” заголовок или CSRF куку, и ответ будет закеширован без них. В таком случае для всех таких представлений, которые требуют CSRF токен, используйте сначала декоратор :

from django.views.decorators.cache import cache_page
from django.views.decorators.csrf import csrf_protect

@cache_page(60 * 15)
@csrf_protect
def my_view(request):
    ...

JN516x Support Software

Comprehensive software support for the development of custom applications on the JN516x wireless microcontrollers is provided in a free-to-download Software Developer’s Kit (SDK) for each of the supported wireless network protocols. The SDKs and associated resources are available via the web pages for the following protocols:

  • ZigBee 3.0
  • ZigBee Home Automation
  • ZigBee Light Link
  • ZigBee Smart Energy
  • IEEE 802.15.4

ZigBee 3.0 and ZigBee Home Automation are enabled for ZigBee Green Power.

Each SDK includes APIs for controlling the hardware:

  • Integrated Peripherals API, comprising functions that can be used to control the on-chip peripherals of the JN516x devices
  • Board API, comprising functions for controlling resources on the evaluation kit boards

An SDK must be installed on top of a JN516x toolchain (JN-SW-4041 or JN-SW-4141, depending on the protocol stack), which contains the software tools required to develop JN516x applications (see below).

Comments

ghost

assigned
stamparm

stamparm

mentioned this issue

Reimplement counting of dumped entries
#71

Closed

stamparm

added a commit
that
referenced
this issue

stamparm

added a commit
that referenced
this issue

stamparm

added a commit
that referenced
this issue

stamparm

closed this


chym

mentioned this issue

error-based false
#231

Closed

inquisb

reopened this

dedust

mentioned this issue

unable to retrieve the number of entries for table
#502

Closed


P3NT3ST

mentioned this issue

CSV wrong sorting (mixed order) when finish to dump huge table
#690

Closed


zeusfnx

mentioned this issue

Os-bof not permitted when the subquery follows = , >=
#691

Closed

digininja

mentioned this issue

Broken link
#789

Closed

stamparm

changed the title
Implement anti-CSRF protection bypass (e.g. .NET VIEWSTATE)

stamparm

added a commit
that referenced
this issue

stamparm

added a commit
that referenced
this issue

stamparm

added a commit
that referenced
this issue

stamparm

added a commit
that referenced
this issue

stamparm

added a commit
that referenced
this issue

stamparm

added a commit
that referenced
this issue

stamparm

added a commit
that referenced
this issue

stamparm

added a commit
that referenced
this issue

bf30075

pushed a commit
to
bf30075/sqlmap
that referenced
this issue

stamparm

closed this

inquisb

added

normal

and removed

low

labels

franx47

mentioned this issue

-g, —crawl and dumping data issues
#1191

Closed


jeroen-80

mentioned this issue

Payload injected in referer, not in uri
#1205

Closed

franx47

mentioned this issue

—search & —dump issue, and Automatic Tamper
#1234

Closed


Kamulha

mentioned this issue

File write on PostgreSQL 9.1.15 fails
#1170

Closed


Isa047

mentioned this issue

Simple SQL error confirmed with Burp repeater but not detected in sqlmap
#1468

Closed

inquisb

modified the milestones:
1.0,
1.1


gudewolu

mentioned this issue

not authorized, try to provide right HTTP authentication type and valid credentials (401)
#2400

Closed


aburehan

mentioned this issue

got db but am not getting tables
#2610

Closed


rghostin

mentioned this issue

SQLmap —file-write issue
#2621

Closed


anhkhoa14592

mentioned this issue

anti-CSRF token ‘token’ can’t be found at response although the token is existed
#2659

Closed


LeetDemon

mentioned this issue

Is This SQL-injection ?
#2814

Closed


amirnsahmad

mentioned this issue

ViewSTATE and Eventvalidation are changing at runtime
#2819

Closed

shahzadmuh

mentioned this issue

decode hex output of oracle daatabase
#2856

Closed


vayo8888

mentioned this issue

True — delay, false — http error
#3195

Closed


serptt

mentioned this issue

False positive or something else?
#3490

Closed


snipercatz

mentioned this issue

SQLMAP unable to identify injection point
#3493

Closed

JN516x Evaluation Kits

Evaluation kits are available containing components based around the JN516x microcontrollers, allowing simple wireless networks to be constructed.

The kit components are pre-programmed with demonstration applications that can be run ‘out of the box’. Example applications and templates that can be used with these kits are available in Application Notes, which are provided on the web pages for the relevant wireless network protocols (see JN516x Support Software below). The evaluation kit contents can be used as a platform for developing custom JN516x applications in your chosen network protocol.

The available evaluation kits and their features are summarized below.

Evaluation Kit Chip(s) Supported Protocols Literature
JN516x-EK001 JN5168-001 IEEE802.15.4, ZigBee Home Automation, ZigBee Light Link, ZigBee Smart Energy Product Brief
JN516x-EK004 JN5169-001 ZigBee Home Automation, ZigBee Light Link Product Brief

Mellanox MCX516A-CCAT ConnectX-5 EN Network Interface Card 100GbE Dual-Port QSFP28 PCIe3.0 x16 Tall Bracket ROHS R6

ConnectX-5 EN Dual-Port Adapter Supporting 100GbE

ConnectX-5 EN supports 100Gb Ethernet connectivity, while delivering extremely high message rates, and PCIe switch and NVMe over Fabric offloads. ConnectX-5 providing the highest performance and most flexible solution for the most demanding applications and markets: Machine Learning, Data Analytics, and more.

ConnectX-5 EN utilizes RoCE (RDMA over Converged Ethernet) technology, delivering low-latency and high performance. ConnectX-5 enhances RDMA network capabilities by completing the Switch AdaptiveRouting capabilities and supporting data delivered out-of-order, while maintaining ordered completion semantics, providing multipath reliability and efficient support for all network topologies including DragonFly and DragonFly.

ConnectX-5 also supports Burst Buffer offload for background checkpointing without interfering in the main CPU operations, and the innovative transport service Dynamic Connected Transport (DCT) to ensure extreme scalability for compute and storage systems.

Technology:
Ethernet

Max Speed:
100GbE

Ports:
Dual

Connector Type:
QSFP28/QSFP+/QSFP

PCI:
PCIe3.0 x16

Condition:
New

Итоги

  • CSRF-атака – это когда «зараженная страница» отправляет форму или запрос на сайт, где посетитель, предположительно, авторизован. Если сайт проверяет только куки, то он такую форму принимает. А делать это не следует, так как её сгенерировал злоумышленник.
  • Для защиты от атаки формы, которые генерирует server.com, подписываются специальным токеном. Можно не все формы, а только те, которые осуществляют действия от имени посетителя, то есть и  могут служить объектом атаки.
  • Для подписи XMLHttpRequest токен дополнительно записывается в куки. Тогда JavaScript с домена server.com сможет прочитать её и добавить в заголовок, а сервер – проверить, что заголовок есть и содержит корректный токен.
  • Динамически сгенерированные формы подписываются аналогично: токен из куки добавляется как URL-параметр или дополнительное поле.

Поделиться
Твитнуть
Поделиться

Ссылка на основную публикацию