XSS攻击与CSRF攻击

1,261 阅读5分钟

XSS攻击

什么是XSS

Cross Site Scripting(跨站脚本攻击),是一种代码注入攻击。攻击者在目标网站注入恶意脚本,使之在用户的浏览器运行。利用这些恶意脚本,盗取用户的敏感信息如cookie等,进而危害数据安全。

XSS攻击的分类

根据攻击的来源,可分为反射型、DOM型、存储型XSS攻击

反射型

1、攻击者构造出特殊的url,其中包含恶意代码
2、用户打开带有恶意代码的url,网站服务端将恶意代码从url取出,拼接在HTML中返回给浏览器
3、用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行
4、恶意代码窃取用户数据并发送到攻击者的网站,
或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

存储型

1、攻击者将恶意代码提交到目标网站的数据库中
2、用户打开目标网站时,服务端将数据从数据库中读取然后拼接在HTML中返回给浏览器
3、浏览器接收到响应后解析执行,混在其中的恶意代码也被执行
4、恶意代码窃取用户数据并发送到攻击者的网站,
或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

存储型XSS(也被称为持久性XSS)攻击常见于带有用户保存数据的网站功能,如论坛发帖、评论、用户私信。

它是最危险的一种跨站脚本,相比反射型XSS和DOM型XSS具有更高的隐蔽性,所以危害更大,因为它不需要用户手动触发。任何允许用户存储数据的web程序都可能存在存储型XSS漏洞,当攻击者提交一段XSS代码后,被服务器端接收并存储,当所有浏览者访问某个页面时都会被XSS。

与反射型XSS攻击的区别是:

反射型是将恶意代码存在url中,存储型是存在数据库
反射型XSS漏洞常见于通过url传递参数的功能,如网页搜索、跳转等
反射型XSS需要诱导用户主动打开恶意url才生效

DOM型

1、攻击者构造出特殊的 URL,其中包含恶意代码。
2、用户打开带有恶意代码的 URL。
3、用户浏览器接收到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行。
4、恶意代码窃取用户数据并发送到攻击者的网站,
或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞。

防止XSS攻击

1、输入过滤:包括用户输入、url参数、post请求参数、Ajax

2、输出转义:比如<:‘&lt;’ >:‘&gt’,转成特殊字符的实体

3、cookie设置为http-only(在服务端设置),那么页面的js将无法读取到cookie信息

CSRF

什么是CSRF

Cross Site Request Forgery(跨站请求伪造),CSRF或XSRF。

CSRF通过伪装已登录用户身份,向网站发送恶意请求。

攻击步骤

1、用户登录受信任网站A,在本地生成cookie 2、在不登出A的情况下,访问危险网站B,B含有需要用户身份的恶意请求,用户浏览器携带cookie发送请求,从而在用户不知情的情况下完成了一次请求。

防御

1、验证码:强制用户与应用进行交互,才能完成最终请求。这种方式能很好的抑制csrf,但是用户体验较差

2、Referer Header:根据HTTP协议,在HTTP头中有一个字段叫Referer,记录了该HTTP请求的来源地址。 服务器判断请求头的referer。这种方法并非万无一失,Referer的值是由浏览器提供的,每个浏览器对于Referer的具体实现可能有差别,并不能保证浏览器自身没有安全漏洞。在部分情况下,攻击者可以隐藏,甚至修改自己请求的Referer。

3、服务端产生加密的token,客户端存到本地(cookie或localStorage,需要防止xss),以后的请求都将token放到authorization发送到服务端,服务端解密token判断。

cookie和localStorage

为了防止通过XSS获取Cookie数据,浏览器支持了使用HTTPONLY来保护Cookie不被XSS攻击获取到。
而localStorage存储没有对XSS攻击有任何的抵御机制
。一旦出现XSS漏洞,那么存储在localStorage里的数据就极易被获取到。 

CSRF与XSS的区别

本质上讲,XSS是代码注入问题,CSRF是http问题。

XSS是内容没有过滤导致浏览器将攻击者的输入当代码执行

CSRF是因为浏览器在发送HTTP请求时自动带上cookie,而一般网站的session-id都存在cookie里