一、XSS攻击(跨脚本攻击)
是一种普遍的Web应用安全漏洞。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。
本质是:网站没有对恶意代码进行过滤,浏览器因为无法分辨脚本是否可信,从而导致恶意代码的执行。
1.反射型XSS攻击流程(恶意脚本发送给浏览器)
攻击者构造带有恶意代码参数的URL,当服务器接受到请求后,从URL中获取数据,拼接到HTML后返回,从而使得恶意代码的执行。非持久化攻击
2.存储型XSS攻击流程(恶意代码发送给目标服务器)
攻击者将恶意代码存储在网站的数据库中,当用户向服务器发起请求时,服务器会讲恶意代码拼接返回给用户,浏览器解析执行,从而使得恶意代码的执行。持久化攻击
3.DOM型XSS攻击
只有HTML代码,并不存在服务器代码,即此程序并未与服务器端进行交互。属于反射型XSS攻击。通过url传入参数去控制触发,url里的参数部分本来可能是业务正常逻辑,取到后会作为dom内容渲染到页面。
4.XSS攻击会造成的结果
1.cookie劫持。可以通过document.cookie得到。
2.构造GET/POST请求。
3.钓鱼。如攻击者在登录框的地方将原来的登录框隐藏一下,自己伪造一个登录框,即可能会获取到用户的个人信息。
4.识别用户浏览器。navigator.userAgent
5.识别用户安装的软件。
6.获取用户真实的IP地址。借助第三方软件,当客户端安装了JRE环境,可以通过调用JavaApplet接口获取本地IP。
7.判断是否访问了某个网站。
8.XSS蠕虫。
5.XSS攻击防御手段
1.对用户输入信息和URL参数进行过滤。
2.对输出的行进行HTML编码。
3.设置HttpOnly,使得cookie不能被客户端的脚本获取。
二、CSRF攻击(跨站请求伪造)
利用服务器的漏洞和用户的登录状态实施攻击。攻击者引诱用户打开恶意网站,在恶意网站中利用用户的登录状态向对应网站发起请求。
1.CSRF攻击方式
打开恶意网站,有三种方式实施CSRF攻击
1.自动发起GET请求
转账的请求接口隐藏在img标签内。
2.自动发起POST请求
在页面中构建隐藏的表单。
3.引诱用户点击链接
提供一些下载地址。
2.CSRF攻击防御手段
1.验证HTTP Referer字段。安全性都依赖于第三方——浏览器。根据HTTP协议,HTTP头中有一个字段Referer,记录了该HTTP请求的来源地址。
缺点:Referer字段的值由浏览器提供,每个浏览器的Referer的具体实现有差别,且并不能保证浏览器本身没有安全漏洞;在最新的浏览器,无法篡改Referer的值,但是有些用户认为侵犯了隐私权,用户自行设置浏览器在其发送请求时不提供Referer值,当有些网站需要校验Referer时,会误判受到了CSRF攻击。
2.在请求地址中添加token并验证。token不存在于cookie中,用户登陆后产生token并放入session中,然后在每次请求时把token从session中取出,将token以参数的形式加入请求。
缺点:对于每一个请求都加上token,繁琐且容易出现漏添加的问题。通常用的方法是每次页面加载时,利用JavaScript遍历整个dom树,对于a和form添加token。对于动态生成的html需要在编码时手动添加token。同时攻击者还是能通过Referer字段得到token值来发起CSRF攻击。
3.在HTTP头中自定义属性并验证。将token放入HTTP头中自定义属性里。可以通过XMLHttpRequest类一次性给所有请求加上csrftoken这个HTTP头属性。
缺点:XMLHttpRequest请求通常用于Ajax方法中对于页面局部的异步刷新,并不是所有的请求都适合用这个类发起,且这类请求得到的页面不能被浏览器记录。