通过“Referer”标头防止跨站点请求伪造

Posted

技术标签:

【中文标题】通过“Referer”标头防止跨站点请求伪造【英文标题】:Cross Site Request Forgery prevention via 'Referer' header 【发布时间】:2020-08-25 13:52:24 【问题描述】:

我们最近收到了来自 IBM AppScan DAST 的结果,其中一些结果没有多大意义。

2.Medium——跨站请求伪造

风险:可能会窃取或操纵客户会话和 cookie,它们可能被用来冒充合法的 用户,允许黑客查看或更改用户记录,并以该用户身份执行交易 修复:验证“Referer”标头的值,并为每个提交的表单使用一次性随机数

以下更改已应用于原始请求:

将标题设置为“http://bogus.referer.ibm.com”

推理:

测试结果似乎表明存在漏洞,因为测试响应与 Original Response,表示Cross-Site Request Forgery尝试成功,甚至 虽然它包含一个虚构的“Referer”标题。

请求/响应:

POST /**/main.xhtml HTTP/1.1 -- **This xhtml only opens a default menu on page load**
User-Agent: Mozilla/4.0 (compatible; MS

推荐修复

验证“Referer”标头的值,并为每个提交的表单使用一次性随机数。

javax.faces.ViewState 具有隐式 CSRF 保护。

https://www.beyondjava.net/jsf-viewstate-and-csrf-hacker-attacks

我还可以使用受保护的视图进行明确的 CSRF 保护。这种显式的 CSRF 保护为所有情况添加了一个令牌,并额外添加了对“referer”和“origin”HTTP 标头的检查。 (参考 Bauke & Arjan Book Definitive Guide)

该报告还标记 /javax.faces.resource/ 之类的 CSS 、 JS 、字体,我认为这些在报告中是误报。

寻求反馈和一些见解。

【问题讨论】:

这是我们使用的:enable csrf with spring security; adding csrf token; custom matcher @WoAiNii:如果有远程代码执行漏洞,那个也没用。 【参考方案1】:

这在 JSF 中确实是不必要的。只有当已经存在开放的远程代码执行漏洞(例如 XSS)时,JSF 中的这种攻击才可能发生(因此黑客可以访问会话 cookie 并因此可以通过网络钓鱼站点复制它们),或者当视图通过<f:view transient="true"> 是无状态的(因为当没有远程代码执行漏洞时,您会丢失javax.faces.ViewState 隐藏输入字段作为“正常”情况下的隐式CSRF保护),或者当您使用HTTP而不是HTTPS (因为中间人攻击者可以清楚地看到所有传输的位并从中提取会话 cookie)。

您只需要确保最终用户的会话 cookie 永远不会以某种方式暴露给外界。建议的修复对此毫无帮助。当您迟早会意外引入远程代码执行漏洞时,它只会使攻击者更难执行成功的 CSRF 攻击。但是你遇到的问题确实比 CSRF 大得多。此工具所建议的所有这些努力仅有助于让黑客稍微少一点时间来执行成功的攻击,并给自己多一点时间来修复远程代码执行漏洞。

如果您只想“抑制”此警告,请创建一个 Filter 来完成所需的工作。这是一个启动示例,将其映射到/*

if (!"GET".equals(request.getMethod())) 
    String referrer = request.getHeader("referer"); // Yes, with the legendary typo.

    if (referrer != null) 
        String referrerHost = new URL(referrer).getHost();
        String expectedHost = new URL(request.getRequestURL().toString()).getHost();

        if (!referrerHost.equals(expectedHost)) 
            response.sendError(403);
            return;
        
    
    else 
        // You could also send 403 here. But this is more likely to affect real users.
    


chain.doFilter(request, response);

另见:

CSRF, XSS and SQL Injection attack prevention in JSF

【讨论】:

以上是关于通过“Referer”标头防止跨站点请求伪造的主要内容,如果未能解决你的问题,请参考以下文章

登录期间的会话处理,并在 GWT 中防止 XSRF(跨站点请求伪造)

SpringBoot 安全漏洞之Referer 跨站点攻击解决方案

防止 asp.net Web 表单中的跨站点请求伪造 (csrf) 攻击

如何在php中进行跨站点请求伪造攻击

WEB攻击手段及防御第3篇-CSRF

如何解决跨站点请求伪造