我正在开发Web应用程序,并要求在发布之前对其运行VAPT
。
然后我下载了Vega并快速扫描了我的webapp,发现了一个VAPT问题,如下所示:
Vega检测到资源设置了不安全的跨源资源共享(CORS)访问控制。CORS提供了允许服务器将跨站点请求的资源访问限制到某些受信任域的机制。通过将“Access Control Allow origin”响应头的值设置为通配符值,所讨论的服务器已允许来自任何源的资源。这会带来安全风险,因为任何站点都可以发出访问资源的请求,而不管其来源如何。
然后我开始寻找一个解决方案来修复它,并遇到了这篇文章,并实现了一个过滤器
,正如答案中建议的那样:
@Component
public class CORSFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Methods",
"POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
chain.doFilter(request, response);
}
public void destroy() {
}
}
现在,当我再次扫描针对webapp的Vega时,它没有再次列出相同的问题,我相信这使我的webapp免受CSRF
攻击。
现在,看完这篇文章后,我在思考如何请求。getHeader(“Origin”)
防止跨站点请求伪造攻击,因为无论源是什么https://webapp.com或https://evil.com,请求对应用程序始终有效,因为我正在从请求标头本身选择“访问控制允许来源”
。
有人能帮助我理解这个概念吗,如何设置request.getHeader("Origin")
从CSRF攻击
中保存?
谢谢
阅读@rism answer和Patrick Grimard post后理解:
当客户端应用程序发出AJAX请求时,浏览器首先向服务器发送预飞行OPTIONS
请求,以确定客户端被允许做什么,对于GET
以外的请求,这就是我们应该设置访问控制的原因-允许-起源
作为响应头的一部分起源或特定域。
以POST
为例,当客户端发送请求时,浏览器首先向服务器发出飞行前OPTIONS
请求,服务器对OPTIONS
请求的响应包含指示浏览器允许所有origin
请求的标题。除了添加响应。setHeader(“访问控制允许原点”,request.getHeader(“原点”)
站点仍然易受攻击,因此我们需要在Apache(对于部署在集群中的应用程序)中明确地白名单
IP,如这里所述,或者在Tomcat中,如这里所述。
我仍然有一个疑问,如果我们限制服务端本身的IP地址,那么我们真的需要设置访问-控制-允许-起源
作为响应头的一部分吗?
它有助于理解CSRF攻击的目的。他们不是关于“窃取”你的数据。顾名思义,它们是关于“跨站点伪造请求”,即跨站点请求伪造,即CSRF。
其目的是使用涉及银行帐户的规范示例更改服务器上的状态。通过CSRF攻击,我们试图以您的名义伪造一个请求(转账100美元)。
所以简单的例子是攻击者将脚本或隐藏表单等注入到任何站点
的页面中,例如www.cutekittens.com并使该脚本针对特定站点,例如www.mybank.com术语跨站点
。
其想法是,作为受害者,您将同时登录这两个网站,而银行网站的安全性不高。当你在www.cutekittens上看到可爱的小猫时。com,攻击者已将跨站点攻击脚本注入其一个或多个页面。该脚本的目的是代表您向您的银行www.mybank提出请求。com转帐100美元。
请再次注意,攻击者并没有窃取您的数据,而是试图以您的名义伪造请求来窃取您的钱/任何东西。这不是中人
攻击(MITM),这是请求伪造攻击。在CSRF中,攻击者看不到或不需要看到你的数据,他们只是想办法表现得好像他们是你。这样做的后续目的可能是获取您的数据,例如更改密码等,但攻击本身是为了伪造请求,而不是拦截。
因此,银行保护自己及其客户的一种方式是通过明确说明哪些网站可以通过CORS头向其发出请求,哪些网站不可以。
如果他们没有特别包括www.cutekittens。com,即使攻击者设法将其恶意脚本注入www.cutekittens上的页面。com网站,即使您碰巧同时在cutekittens和您的银行网站上冲浪,即使执行了攻击脚本,也会将请求发送到www.yourbank。com将被删除(在帖子飞行前),因为银行没有向浏览器ACCESS-CONTROL-ALLOW-ORIGIN:www.cutekittens发送标题。com
专门授权该请求。
所以你是对的。您所做的一切都是将此头的静态*
值替换为动态请求。getHeader(“Origin”)
就是让Vega离开你的背。如果您的网站写得不好,它仍然可能容易受到此攻击,因为它会反映www.cutekittens。这大概不是你想要的。
使用request.getHeader(Origin)
而不是*
的一个原因是当您要向服务器发送凭据时。您不能仅使用*
向服务器发送CORS AJAX请求中的凭据(例如cookie等),因此在这种情况下,您将动态地将来源反映回客户端。
但通过这样做,你真的需要确保你正在以其他方式降低风险。在这种情况下,您通常也会将您将要反映和不会反映的内容列为白名单。e、 g.门户网站。我的银行。com可能在名单上,但www.cutekittens。com不会。如果要使用动态原点反射,那么这将是您可以实现的下一步。
问题内容: 我想为基于Struts 1.x框架的Web应用程序实施跨站点请求伪造预防。我知道struts 2框架为此提供了令牌拦截器,并且可以使用过滤器实现类似的功能。 我对一些想法感到困惑1)如何以简单的方式生成唯一令牌?(我可以为此目的使用Action类令牌来避免重复提交表单) 将struts 1.x框架令牌机制用于CSRF预防是否存在任何问题 问题答案: Struts 1 Action令牌方
本文向大家介绍Django中如何防范CSRF跨站点请求伪造攻击的实现,包括了Django中如何防范CSRF跨站点请求伪造攻击的实现的使用技巧和注意事项,需要的朋友参考一下 CSRF概念 CSRF跨站点请求伪造(Cross—Site Request Forgery)。 攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发
问题内容: 因此,我们的应用程序是: 每个用户都必须登录 登录页面回发到服务器,并且如果授权用户返回SPA应用程序。 SPA应用程序完全是AJAX HTTPS 通常我们会发送一个cookie和一个cookie。令牌cookie值将作为x- header包含在任何AJAX帖子中,并且每次请求都将在服务器上验证所有内容。 由于SPA页面是在返回浏览器之前构建的,因此我们可以在其中嵌入我们想要的任何内容
CSRF攻击迫使经过身份验证的用户(受害者)发送伪造的HTTP请求,包括受害者的会话cookie到易受攻击的Web应用程序,这允许攻击者强制受害者的浏览器生成请求,以便易受攻击的应用程序感知来自受害者。 我们下面来了解这个漏洞的威胁代理,攻击向量,安全弱点,技术影响和业务影响。 威胁代理 - 任何人都可以将内容加载到用户的浏览器中,从而迫使他们向您的网站提交请求。 攻击者的方法 - 攻击者创建伪造
跨站请求伪造(CSRF)是一种漏洞利用,攻击者致使受害的最终用户按恶意URI(例如以误导的链接、图片或重定向提供给用户代理)到达受信任的服务器(通常由存在有效的会话Cookie而建立)。 针对客户端的重定向URI的CSRF攻击允许攻击者注入自己的授权码或访问令牌,这将导致在客户端中使用与攻击者的受保护资源关联的访问令牌而非受害者的(例如,保存受害者的银行账户信息到攻击者控制的受保护资源)。 客户端
跨站请求伪造(Cross-site request forgery), 简称为 XSRF,是 Web 应用中常见的一个安全问题。前面的链接也详细讲述了 XSRF 攻击的实现方式。 当前防范 XSRF 的一种通用的方法,是对每一个用户都记录一个无法预知的 cookie 数据,然后要求所有提交的请求(POST/PUT/DELETE)中都必须带有这个 cookie 数据。如果此数据不匹配 ,那么这个请求