手机版

XSS和CSRF的详细说明和预防措施

时间:2021-08-27 来源:互联网 编辑:宝哥软件园 浏览:

XSS和CSRF是网络安全领域最常见的攻击。本文将简要介绍XSS和CSRF的攻防问题。

1.跨站脚本

XSS,即跨站点脚本,是跨站点脚本攻击;它最初的缩写是CSS,但为了区别于级联样式表,它在安全领域被称为XSS。

XSS攻击是指攻击者向网站注入恶意客户端代码,通过恶意脚本篡改客户端网页,从而控制用户浏览器或在用户浏览网页时获取用户隐私数据的攻击方式。

攻击者注入客户端网页的恶意脚本一般包括JavaScript,有时也包括HTML和Flash。攻击XSS的方式有很多,但它们有一些共同点:向攻击者发送一些私有数据,如cookie和会话,将受害者重定向到攻击者控制的网站,并在受害者的机器上进行一些恶意操作。

XSS攻击可以分为三类:反射(非持久)、存储(持久)和基于DOM。

1.1反射率

Reflective XSS简单地将用户输入的数据“反射”到浏览器中,这往往需要攻击者在进入恶意网站时诱导用户点击恶意链接,或者提交表单,或者向攻击者的网站注入脚本。

看一个例子。我准备了如下静态页面:

恶意链接的地址指向localhost:8001/?q=111p=222 .然后,我启动了一个简单的Node服务来处理恶意链接请求:

const http=require(' http ');函数handleReequest(req,RES){ RES . setheader(' Access-Control-Allow-Origin ',' * ');res.writeHead(200,{ ' Content-Type ' : ' text/html;charset=UTF-8 ' });Res.write('scriptalert('反射XSS攻击')/script ');RES . end();} const server=new http。server();server.listen(8001,' 127 . 0 . 0 . 1 ');server.on('request ',handleRequest);当用户点击恶意链接时,页面跳转到攻击者事先准备好的页面,你会发现js脚本是在攻击者的页面上执行的:

因此,产生了反射XSS攻击。根据攻击者的目的,攻击者可以注入任何恶意脚本进行攻击,可能是恶作剧脚本,也可能是可以获取用户私人数据(如cookie)的脚本。

1.2存储类型

存储的XSS将把用户输入的数据“存储”在服务器上。当浏览器请求数据时,脚本从服务器上传并执行。这种XSS攻击具有很强的稳定性。

常见的情况是,攻击者在社区或论坛中撰写包含恶意JavaScript代码的文章或评论。文章或评论发布后,所有访问文章或评论的用户都会在其浏览器中执行恶意的JavaScript代码。

举个例子。

首先准备一个输入页面:

输入类型=' text ' id=' input ' button id=' BTN ' Submit/button script const input=document . GetElementByID(' input ');const BTN=document . getelementbyid(' BTN ');让瓦尔;input.addEventListener('change ',(e)={ val=e . target . value;},false);btn.addEventListener('click ',(e)={ fetch(' http://localhost :8001/save ',{ method: 'POST ',body : val });},false);/script启动节点服务来侦听保存请求。为了简化,变量用于保存用户的输入:

const http=require(' http ');让userInput=function handleReequest(req,RES){ const method=req . method;res.setHeader('访问控制-允许-源',' *);RES . setheader(' Access-Control-Allow-Headers ',' Content-Type ')if(method==' POST ' req . URL==='/save){ let body=' ';req.on('data ',chunk={ body=chunk});req.on('end ',()={ if(body){ user input=body;} RES . end();});} else { res.writeHead(200,{ ' Content-Type ' : ' text/html;charset=UTF-8 ' });RES . write(user input);//将输入的脚本内容返回首页RES . end();}} const服务器=新http。server();server.listen(8001,' 127 . 0 . 0 . 1 ');server.on('request ',handleRequest);当用户单击提交按钮向服务器提交输入信息时,服务器通过用户输入变量保存输入内容。当用户通过http://localhost:8001/${id}访问时,服务器将返回与该id对应的内容(此示例简化了处理)。如果用户输入恶意脚本内容,当其他用户访问内容时,恶意脚本将在浏览器端执行:

1.3基于DOM

基于DOM的XSS攻击是指通过恶意脚本修改页面的DOM结构,纯粹是客户端的攻击。

请看下面的代码:

h2xs s 3360/H2 input type=' text ' id=' input ' button id=' BTN ' Submit/button div id=' div '/div script const input=document . getelementbyid(' input ');const BTN=document . getelementbyid(' BTN ');const div=document . getelementbyid(' div ');让瓦尔;input.addEventListener('change ',(e)={ val=e . target . value;},false);btn.addEventListener('click ',()={ div . innerhtml=` a href=$ { val } testLink/a `},false);/script点击提交按钮后,会在当前页面插入一个链接,其地址就是用户的输入。如果用户在输入时构造了以下内容:

Onclick=alert(/xss/)用户提交后,页面代码变为:

a href on lick=' alert(/XSS/)' test link/a此时,当用户单击生成的链接时,将执行相应的脚本:

2.预防2。XSS攻击

现在主流浏览器都内置了防XSS的措施,比如CSP。但是对于开发者来说,他们也应该找到可靠的解决方案来防止XSS攻击。

2.1HttpOnly防止Cookie被抢

HttpOnly最早由微软提出,至今已成为标准。浏览器将禁止页面的Javascript访问带有HttpOnly属性的Cookie。

如上所述,攻击者可以通过注入恶意脚本来获取用户的Cookie信息。通常情况下,cookies包含用户的登录凭据,攻击者在获取cookies后可以发起Cookie劫持攻击。因此,严格来说,HttpOnly不能防止XSS攻击,但可以防止XSS攻击后的Cookie劫持攻击。

2.2输入检查

不要相信用户的任何输入。应该检查、过滤和转义来自用户的任何输入。建立可信的字符和HTML标签白名单,过滤或编码白名单中未列出的字符或标签。

在XSS防御中,输入检查一般是检查用户输入的数据是否包含、等特殊字符。如果存在,则过滤或编码特殊字符,这也称为XSS滤波。

在一些前端框架中,会有一个decodingMap,用于编码或过滤用户输入中包含的特殊字符或标签,例如脚本,以防止XSS攻击:

//vuejs中的Decodingmap//在Vuejs中,如果输入带有脚本标签的内容,将直接过滤掉Const Decodingmap={'': ' ',' ' : ' ',' ' 3360 ' ',' ' : ' ',' ' : ' '。

用户的输入和服务器的输出都会有问题。一般来说,除了富文本的输出,当变量输出到HTML页面时,可以使用编码或转义来防御XSS攻击。例如,sanitize-html用于定期过滤输出内容,然后将其输出到页面。

3.跨站点请求伪造

CSRF (Cross Site Request伪造)是中文翻译中的跨站点请求伪造,是一种劫持可信用户并向服务器发送意外请求的攻击方式。

一般来说,CSRF攻击是指攻击者借助受害者的Cookie来欺骗服务器的信任。在受害者不知情的情况下,攻击者可以伪造一个请求,以受害者的名义发送给被攻击的服务器,从而在未经授权的情况下,在权限的保护下执行操作。

在举一个例子之前,我们先来谈谈浏览器的Cookie策略

3.1浏览器的Cookie策略

Cookie是服务器发送到用户浏览器并存储在本地的一小部分数据。当浏览器下次向同一服务器发出请求时,它将被携带并发送到服务器。Cookie主要用于以下三个方面:

会话状态管理(如用户登录状态、购物车、游戏分数或其他需要记录的信息)个性化设置(如用户自定义设置、主题等。)个性化设置(如用户自定义设置、主题等。)浏览器持有的Cookie有两种:

会话Cookie:会话Cookie是最简单的Cookie,不需要指定过期时间或Max-Age,只在会话期间有效,关闭浏览器后会自动删除。永久Cookie:与会话Cookie不同,永久Cookie可以指定特定的过期时间或最长期限。res.setHeader('Set-Cookie ',[' my kokie=222 ',' test=3333到期时间=2018年7月21日星期六00:00:00格林尼治标准时间;']);上面的代码创建了两个cookie:我的cookie和测试Cookie,前者是会话Cookie,后者是持久Cookie。当我们查看与Cookie相关的属性时,不同的浏览器对于会话Cookie具有不同的Expires属性值:

此外,每个Cookie都有一个与之关联的域,该域的范围通常由domain属性指定。如果cookie的域与页面的域相同,那么我们称之为第一方Cookie,如果Cookie的域与页面的域不同,则称之为第三方Cookie。当一个页面包含其他域中存储的图片或资源(如图片)时,第一方的Cookie将只发送到设置它们的服务器。

3.2 CSRF通过Cookie进行攻击

假设有一个论坛网站:http://www.c.com。当登录用户发起以下GET请求时,ID指定的帖子将被删除:

http://www . c.com :8002/content/delete/: id

如果发起http://www . c.com :8002/content/delete/87343的请求,id为87343的帖子将被删除。当用户登录时,将设置以下cookie:

res.setHeader('Set-Cookie ',[' user=22333;到期时间=2018年7月21日星期六00:00:00格林尼治标准时间;']);

用户对应的值是用户标识。然后构建一个页面a:

CSRF攻击者准备的网站:

pCSRF攻击者准备的网站a页:/pimg src=' http :3358 www . c.com :8002/content/delete/87343 '使用了一个img标签,其地址指向删除用户帖子的链接:

可以看到,当登录的用户访问攻击者的网站时,他会向www.c.com发送删除用户帖子的请求。此时如果用户切换刷新www.c.com的帖子页面,会发现ID为87343的帖子已经被删除。

由于Cookie包含用户的身份验证信息,当用户访问攻击者准备的攻击环境时,攻击者可以对服务器发起CSRF攻击。在这次攻击中,攻击者使用受害者的Cookie来欺骗服务器的信任,但是他无法获得Cookie,也看不到Cookie的内容。至于服务器返回的结果,由于浏览器同源策略的限制,攻击者无法解析。因此,攻击者无法从返回的结果中获得任何东西。他能做的就是向服务器发送请求,执行请求中描述的命令,直接在服务器端改变数据的值,而不是从服务器端窃取数据。

但是,如果CSRF攻击的目标不需要使用cookies,则无需担心浏览器的Cookie策略。

4.预防4。CSRF攻击

目前,有几种方法可以防止CSRF袭击。

4.1验证码

验证码被认为是对抗CSRF攻击最简单有效的防御手段。

从上面的例子可以看出,CSRF攻击经常在用户不知情的情况下构造网络请求。验证码将强制用户与应用程序交互以完成最终请求。因为通常情况下,验证码可以抑制CSRF攻击。

但是验证码并不是万能的,因为为了用户着想,验证码并不能添加到网站的所有操作中。因此,验证码只能作为保卫CSRF的辅助手段,而不能作为主要解决方案。

4.2推荐人检查

根据HTTP协议,在HTTP头中有一个名为Referer的字段,它记录了HTTP请求的源地址。通过引用检查,您可以检查请求是否来自合法的“来源”。

例如,如果用户想要删除自己的帖子,他必须首先登录www.c.com,然后找到相应的页面并发起删除帖子的请求。此时,Referer的价值是http://www.c.com;当请求从www.a.com发起时,Referer的值为http://www.a.com。因此,为了防御CSRF攻击,只需要验证每个帖子删除请求的Referer值。如果是以www.c.com开头的域名,则意味着请求来自网站本身,是合法的。如果引荐者是另一个网站,它可能是CSRF攻击,请求可以被拒绝。

对于上面的示例,您可以在服务器上添加以下代码:

if(req . headers . refer!==' http://www . c.com :8002/'){ RES . write(' csrf攻击');返回;} Referer Check不仅可以防范CSRF攻击,还可以用于“防止图片盗链”。

4.3添加令牌身份验证(令牌==令牌)

CSRF攻击成功的原因是攻击者可以完全伪造用户的请求,并且请求中的所有用户认证信息都存在于cookie中,因此攻击者可以在不知道认证信息的情况下直接使用用户自己的cookie通过安全认证。要抵抗CSRF,关键是在请求中放入攻击者无法伪造的信息,而这些信息在Cookie中是不存在的。可以将随机生成的令牌以参数的形式添加到HTTP请求中,并且可以在服务器端建立拦截器来验证该令牌。如果请求中没有令牌或令牌内容不正确,则请求可能会被视为CSRF攻击而被拒绝。

摘要

本文主要介绍了XSS和CSRF的攻击原理和防御措施。当然,在Web安全领域,除了这两种常见的攻击外,还有SQL注入等其他攻击,不在本文讨论范围之内。如果你对它感兴趣,你可以阅读关于SQL注入科技的专栏来了解更多。最后,总结XSS进攻和CSRF进攻的常用防御措施:

1.抵御XSS袭击

HttpOnly防止用户窃取Cookie。检查服务器的输出。2.防御CSRF袭击

验证码Referer Check Token验证以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

版权声明:XSS和CSRF的详细说明和预防措施是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。