Отсутствие токенов анти-csrf в файлах cookie конечных точек аутентификации / заголовках wso2 IS 5.9 - PullRequest
1 голос
/ 26 мая 2020

Я пробовал все рекомендации WSO2 для включения свойств CSRF в сетевых файлах cookie и отправки форм GET-методов аутентификации конечной точки веб-приложения, но все еще не смог достичь результата.

Я получал сообщение «Отсутствие Anti-CSRF» tokens "Уязвимость ZAP для конечной точки аутентификации в ответе методов GET, поскольку она не содержит скрытого параметра - токена csrf в теге отправки формы тела ответа.

Ссылки WSO2:

https://is.docs.wso2.com/en/5.9.0/administer/mitigating-cross-site-request-forgery-attacks/#securing -веб-приложения

https://wso2.com/technical-reports/wso2-secure-engineering-guidelines#C03

https://medium.com/@PrakhashS / overview-cross-site-request-forgery- csrf-рекомендованный подход-for-wso2-products-bb0e2437307

Информация, представленная в уязвимости ZAP:

No known Anti-CSRF token [anticsrf, CSRFToken, __RequestVerificationToken, csrfmiddlewaretoken, authenticity_token, OWASP_CSRFTOKEN, anoncsrf, csrf_token, _csrf, _csrfSecret] was found in the following HTML form: [Form 1: "tocommonauth" "username" "password" "chkRemember" "sessionDataKey" ].

web. xml аутентификацииendpoint webapp

<?xml version="1.0" encoding="UTF-8"?><!--
  ~ Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
  ~
  ~ WSO2 Inc. licenses this file to you under the Apache License,
  ~ Version 2.0 (the "License"); you may not use this file except
  ~ in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~ http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing,
  ~ software distributed under the License is distributed on an
  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  ~ KIND, either express or implied.  See the License for the
  ~ specific language governing permissions and limitations
  ~ under the License.
  -->

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0" metadata-complete="true">
    <absolute-ordering />


    <!-- OWASP CSRFGuard context listener used to read CSRF configuration -->
    <listener>
        <listener-class>org.owasp.csrfguard.CsrfGuardServletContextListener</listener-class>
    </listener>
    <!-- OWASP CSRFGuard session listener used to generate per-session CSRF 
        token -->
    <listener>
        <listener-class>org.owasp.csrfguard.CsrfGuardHttpSessionListener</listener-class>
    </listener>
    <!-- OWASP CSRFGuard per-application configuration property file location -->
    <context-param>
        <param-name>Owasp.CsrfGuard.Config</param-name>
        <param-value>/repository/conf/security/Owasp.CsrfGuard.properties</param-value>
    </context-param>
    <!-- OWASP CSRFGuard filter used to validate CSRF token -->
    <filter>
        <filter-name>CSRFGuard</filter-name>
        <filter-class>org.owasp.csrfguard.CsrfGuardFilter</filter-class>
    </filter>
    <!-- OWASP CSRFGuard filter mapping used to validate CSRF token -->
    <filter-mapping>
        <filter-name>CSRFGuard</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- OWASP CSRFGuard servlet that serves dynamic token injection JavaScript 
        (application can customize the URL pattern as required) -->
    <servlet>
        <servlet-name>JavaScriptServlet</servlet-name>
        <servlet-class>org.owasp.csrfguard.servlet.JavaScriptServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>JavaScriptServlet</servlet-name>
        <url-pattern>/csrfguard.js</url-pattern>
    </servlet-mapping>






    <!-- *************** Account Recovery Endpoint Context URL Configuration 
        ********************** -->
    <!--context-param> <param-name>IdentityManagementEndpointContextURL</param-name> 
        <param-value>https://localhost:9443/accountrecoveryendpoint</param-value> 
        </context-param -->
    <context-param>
        <param-name>AccountRecoveryRESTEndpointURL</param-name>
        <param-value>/t/tenant-domain/api/identity/user/v1.0/</param-value>
    </context-param>

    <!-- *************** End of Authentication REST API URL Configuration ********************** -->

    <!--Display scopes in the consent page. -->
    <context-param>
        <param-name>displayScopes</param-name>
        <param-value>true</param-value>
    </context-param>

    <filter>
        <filter-name>HttpHeaderSecurityFilter</filter-name>
        <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
        <init-param>
            <param-name>hstsEnabled</param-name>
            <param-value>false</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>HttpHeaderSecurityFilter</filter-name>
        <url-pattern>*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>AuthenticationEndpointFilter</filter-name>
        <filter-class>
            org.wso2.carbon.identity.application.authentication.endpoint.util.filter.AuthenticationEndpointFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>AuthenticationEndpointFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>



    <filter>
        <filter-name>URLBasedCachePreventionFilter</filter-name>
        <filter-class>org.wso2.carbon.ui.filters.cache.URLBasedCachePreventionFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>URLBasedCachePreventionFilter</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>


    <filter>
        <filter-name>ContentTypeBasedCachePreventionFilter</filter-name>
        <filter-class>
            org.wso2.carbon.ui.filters.cache.ContentTypeBasedCachePreventionFilter</filter-class>
        <init-param>
            <param-name>patterns</param-name>
            <param-value>"text/html" ,"application/json" ,"plain/text"</param-value>
        </init-param>
        <init-param>
            <param-name>filterAction</param-name>
            <param-value>enforce</param-value>
        </init-param>
        <init-param>
            <param-name>httpHeaders</param-name>
            <param-value>
                Cache-Control: no-store, no-cache, must-revalidate, private
            </param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>ContentTypeBasedCachePreventionFilter</filter-name>
        <url-pattern>*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>

    <listener>
        <listener-class>
            org.wso2.carbon.identity.application.authentication.endpoint.util.listener.AuthenticationEndpointContextListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>retry.do</servlet-name>
        <jsp-file>/retry.jsp</jsp-file>
    </servlet>

    <servlet>
        <servlet-name>wait.do</servlet-name>
        <jsp-file>/long-wait.jsp</jsp-file>
    </servlet>

    <servlet>
        <servlet-name>idf-confirm.do</servlet-name>
        <jsp-file>/identifier-logout-confirm.jsp</jsp-file>
    </servlet>

    <servlet>
        <servlet-name>dynamic_prompt.do</servlet-name>
        <jsp-file>/dynamic_prompt.jsp</jsp-file>
    </servlet>

    <servlet>
        <servlet-name>handle-multiple-sessions.do</servlet-name>
        <jsp-file>/handle-multiple-sessions.jsp</jsp-file>
    </servlet>

    <servlet>
        <servlet-name>claims.do</servlet-name>
        <jsp-file>/requested-claims.jsp</jsp-file>
    </servlet>

    <servlet>
        <servlet-name>oauth2_login.do</servlet-name>
        <jsp-file>/login.jsp</jsp-file>
    </servlet>

    <servlet>
        <servlet-name>oauth2_authz.do</servlet-name>
        <jsp-file>/oauth2_authz.jsp</jsp-file>
    </servlet>

    <servlet>
        <servlet-name>oauth2_consent.do</servlet-name>
        <jsp-file>/oauth2_consent.jsp</jsp-file>
    </servlet>

    <servlet>
        <servlet-name>oauth2_logout_consent.do</servlet-name>
        <jsp-file>/oauth2_logout_consent.jsp</jsp-file>
    </servlet>

    <servlet>
        <servlet-name>oauth2_logout.do</servlet-name>
        <jsp-file>/logout.jsp</jsp-file>
    </servlet>

    <servlet>
        <servlet-name>oauth2_error.do</servlet-name>
        <jsp-file>/oauth2_error.jsp</jsp-file>
    </servlet>

    <servlet>
        <servlet-name>samlsso_login.do</servlet-name>
        <jsp-file>/login.jsp</jsp-file>
    </servlet>

    <servlet>
        <servlet-name>samlsso_logout.do</servlet-name>
        <jsp-file>/logout.jsp</jsp-file>
    </servlet>

    <servlet>
        <servlet-name>samlsso_redirect.do</servlet-name>
        <jsp-file>/login.jsp</jsp-file>
    </servlet>

    <servlet>
        <servlet-name>samlsso_notification.do</servlet-name>
        <jsp-file>/samlsso_notification.jsp</jsp-file>
    </servlet>

    <servlet>
        <servlet-name>openid_login.do</servlet-name>
        <jsp-file>/login.jsp</jsp-file>
    </servlet>

    <servlet>
        <servlet-name>openid_profile.do</servlet-name>
        <jsp-file>/openid_profile.jsp</jsp-file>
    </servlet>

    <servlet>
        <servlet-name>passivests_login.do</servlet-name>
        <jsp-file>/login.jsp</jsp-file>
    </servlet>

    <servlet>
        <servlet-name>tenantlistrefresher.do</servlet-name>
        <jsp-file>/tenant_refresh_endpoint.jsp</jsp-file>
    </servlet>

    <servlet>
        <servlet-name>registration.do</servlet-name>
        <jsp-file>/registration.jsp</jsp-file>
    </servlet>

    <servlet>
        <servlet-name>consent.do</servlet-name>
        <jsp-file>/consent.jsp</jsp-file>
    </servlet>

    <servlet>
        <servlet-name>cookie_policy.do</servlet-name>
        <jsp-file>/cookie_policy.jsp</jsp-file>
    </servlet>

    <servlet>
        <servlet-name>privacy_policy.do</servlet-name>
        <jsp-file>/privacy_policy.jsp</jsp-file>
    </servlet>

    <servlet>
        <servlet-name>authenticate.do</servlet-name>
        <jsp-file>/authenticate.jsp</jsp-file>
    </servlet>

    <servlet>
        <servlet-name>error.do</servlet-name>
        <jsp-file>/generic-exception-response.jsp</jsp-file>
    </servlet>

    <servlet-mapping>
        <servlet-name>retry.do</servlet-name>
        <url-pattern>/retry.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>wait.do</servlet-name>
        <url-pattern>/wait.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>idf-confirm.do</servlet-name>
        <url-pattern>/idf-confirm.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>dynamic_prompt.do</servlet-name>
        <url-pattern>/dynamic_prompt.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>handle-multiple-sessions.do</servlet-name>
        <url-pattern>/handle-multiple-sessions.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>oauth2_login.do</servlet-name>
        <url-pattern>/oauth2_login.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>oauth2_authz.do</servlet-name>
        <url-pattern>/oauth2_authz.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>oauth2_consent.do</servlet-name>
        <url-pattern>/oauth2_consent.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>oauth2_logout_consent.do</servlet-name>
        <url-pattern>/oauth2_logout_consent.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>oauth2_logout.do</servlet-name>
        <url-pattern>/oauth2_logout.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>oauth2_error.do</servlet-name>
        <url-pattern>/oauth2_error.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>samlsso_login.do</servlet-name>
        <url-pattern>/samlsso_login.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>samlsso_logout.do</servlet-name>
        <url-pattern>/samlsso_logout.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>samlsso_redirect.do</servlet-name>
        <url-pattern>/samlsso_redirect.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>samlsso_notification.do</servlet-name>
        <url-pattern>/samlsso_notification.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>openid_login.do</servlet-name>
        <url-pattern>/openid_login.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>openid_profile.do</servlet-name>
        <url-pattern>/openid_profile.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>passivests_login.do</servlet-name>
        <url-pattern>/passivests_login.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>tenantlistrefresher.do</servlet-name>
        <url-pattern>/tenantlistrefresher.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>registration.do</servlet-name>
        <url-pattern>/registration.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>claims.do</servlet-name>
        <url-pattern>/claims.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>consent.do</servlet-name>
        <url-pattern>/consent.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>cookie_policy.do</servlet-name>
        <url-pattern>/cookie_policy.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>privacy_policy.do</servlet-name>
        <url-pattern>/privacy_policy.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>authenticate.do</servlet-name>
        <url-pattern>/authenticate.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>error.do</servlet-name>
        <url-pattern>/error.do</url-pattern>
    </servlet-mapping>

    <error-page>
        <exception-type>java.lang.Throwable</exception-type>
        <location>/generic-exception-response.jsp</location>
    </error-page>

    <!-- custom error pages -->
    <error-page>
        <error-code>400</error-code>
        <location>/errors/error_400.html</location>
    </error-page>
    <error-page>
        <error-code>401</error-code>
        <location>/errors/error_401.html</location>
    </error-page>
    <error-page>
        <error-code>403</error-code>
        <location>/errors/error_403.html</location>
    </error-page>
    <error-page>
        <error-code>404</error-code>
        <location>/errors/error_404.html</location>
    </error-page>
    <error-page>
        <error-code>405</error-code>
        <location>/errors/error_405.html</location>
    </error-page>
    <error-page>
        <error-code>408</error-code>
        <location>/errors/error_408.html</location>
    </error-page>
    <error-page>
        <error-code>410</error-code>
        <location>/errors/error_410.html</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/errors/error_500.html</location>
    </error-page>
    <error-page>
        <error-code>502</error-code>
        <location>/errors/error_502.html</location>
    </error-page>
    <error-page>
        <error-code>503</error-code>
        <location>/errors/error_503.html</location>
    </error-page>
    <error-page>
        <error-code>504</error-code>
        <location>/errors/error_504.html</location>
    </error-page>
    <error-page>
        <location>/errors/error.html</location>
    </error-page>

    <session-config>
        <cookie-config>
            <secure>true</secure>
        </cookie-config>
    </session-config>

</web-app>

1 Ответ

0 голосов
/ 28 мая 2020

По умолчанию все веб-приложения, поставляемые с продуктом, защищены от CSRF-атак [1] ​​

Для WSO2 Identity Server конфигурации для защиты от CSRF-атак по умолчанию включены для всех приложений. встроенные в продукт. Следовательно, вам необходимо применить эти конфигурации вручную, только если у вас есть какие-либо пользовательские приложения, развернутые в вашем продукте.

Таким образом, вам не нужно никаких дополнительных настроек.


Согласно к информации, предоставленной в сканировании уязвимостей ZAP, он определяет запрос commonauth внутри веб-приложения аутентификации конечной точки как уязвимость. Это неправильно, позвольте мне объяснить, почему.

Что такое веб-приложение конечной точки проверки подлинности и запрос commonauth?

На сервере идентификации WSO2 конечная точка проверки подлинности обслуживает вход в систему, подтверждает страницы во время проверки подлинности. А действия пользователя (такие как учетные данные, код OTP, объединенные потоки входа в систему, утверждение согласия) отправляются на сервер с использованием запроса commonauth. Таким образом, эти взаимодействия происходят из браузера до того, как пользователь не аутентифицируется.

Что такое CSRF? [2]

Подделка межсайтовых запросов (также известная as CSRF) - это уязвимость в веб-безопасности, которая позволяет злоумышленнику побудить пользователей выполнить действия, которые они не собираются выполнять.

Так как пользователь еще не прошел проверку подлинности, дополнительных преимуществ нет. злоумышленник может получить доступ, отправив эти страницы аутентификации.

Таким образом, они настроены на пропуск из защиты CSRF. Вы можете проверить эти конечные точки в файле IS_HOME / repository / conf / security / Ow asp .CsrfGuard.Carbon.properties

# please remove the below entry to enable protection for services.
org.owasp.csrfguard.unprotected.Services=%servletContext%/services/*
org.owasp.csrfguard.unprotected.commonauth=%servletContext%/commonauth/*
org.owasp.csrfguard.unprotected.samlsso=%servletContext%/samlsso/*
org.owasp.csrfguard.unprotected.authenticationendpoint=%servletContext%/authenticationendpoint/*
org.owasp.csrfguard.unprotected.wso2=%servletContext%/wso2/*
org.owasp.csrfguard.unprotected.oauth2=%servletContext%/oauth2/*
org.owasp.csrfguard.unprotected.oidc=%servletContext%/oidc/*
org.owasp.csrfguard.unprotected.openid=%servletContext%/openid/*
org.owasp.csrfguard.unprotected.openidserver=%servletContext%/openidserver/*
org.owasp.csrfguard.unprotected.passivests=%servletContext%/passivests/*
org.owasp.csrfguard.unprotected.acs=%servletContext%/acs/*
org.owasp.csrfguard.unprotected.iwa=%servletContext%/iwa/*
org.owasp.csrfguard.unprotected.oauthiwa=%servletContext%/commonauth/iwa/*
org.owasp.csrfguard.unprotected.thrift=%servletContext%/thriftAuthenticator/*
org.owasp.csrfguard.unprotected.mex=%servletContext%/mexut/*
org.owasp.csrfguard.unprotected.identity=%servletContext%/identity/*

Как видите, это конечные точки, используемые в потоках аутентификации.

[1] - https://is.docs.wso2.com/en/5.9.0/administer/mitigating-cross-site-request-forgery-attacks/#configuring -applications-in-wso2-product-to-mitigate-csrf-attack

[2] - https://portswigger.net/web-security/csrf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...