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、输出转义:比如<:‘<’ >:‘>’,转成特殊字符的实体
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里