一、XSS
XSS (Cross-Site Scripting),跨站脚本攻击,因为缩写和 CSS重叠,所以只能叫 XSS。跨站脚本攻击是指通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或JavaScript进行的一种攻击。
跨站脚本攻击有可能造成以下影响:
1:利用虚假输入表单骗取用户个人信息
2:利用脚本窃取用户的Cookie值,被害者在不知情的情况下,帮助攻击者发送恶意请求
3:显示伪造的文章或图片
XSS 的原理是恶意攻击者往 Web 页面里插入恶意可执行网页脚本代码,当用户浏览该页之时,嵌入其中 Web 里面的脚本代码会被执行,从而可以达到攻击者盗取用户信息或其他侵犯用户安全隐私的目的
XSS攻击细分为以下两种类型:
1.非持久型 XSS(反射型 XSS )
非持久型 XSS 漏洞,一般是通过给别人发送带有恶意脚本代码参数的 URL,当 URL 地址被打开时,特有的恶意代码参数被 HTML 解析、执行。
攻击者可以直接通过 URL 类似:https://xx.com/xx?default= 注入可执行的脚本代码。
为了防止出现非持久型 XSS 漏洞,需要确保这么几件事情:
1:Web 页面渲染的所有内容或者渲染的数据都必须来自于服务端。
2:尽量不要从 URL,document.referrer,document.forms 等这种 DOM API 中获取数据直接渲染。
3:尽量不要使用 eval, new Function(),document.write(),document.writeln(),window.setInterval()
window.setTimeout(),innerHTML,document.createElement() 等可执行字符串的方法。
4:如果做不到以上几点,也必须对涉及 DOM 渲染的方法传入的字符串参数做 escape 转义。
2.持久型 XSS(存储型 XSS)
持久型 XSS 漏洞,一般存在于 Form 表单提交等交互功能,如文章留言,提交文本信息等,黑客利用的 XSS 漏洞,将内容经正常功能提交进入数据库持久保存,当前端页面获得后端从数据库中读出的注入代码时,恰好将其渲染执行。
持久型 XSS 攻击不需要诱骗,后端没做转义直接入库,然后直接输出给前端,如下:
如何防御:
1:CSP; CSP 本质上就是建立白名单,开发者明确告诉浏览器哪些外部资源可以加载和执行。我们只需要配置规则,如何拦截是由浏览器自己实现的。我们可以通过这种方式来尽量减少 XSS 攻击。
2:转义字符;用户的输入永远不可信任的,最普遍的做法就是转义输入输出的内容,对于引号、尖括号、斜杠进行转义
3:设置HttpOnly Cookie
二、CSRF
CSRF(Cross Site Request Forgery),即跨站请求伪造,是一种常见的Web攻击,攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。
如何防御:
1: SameSite ;可以对 Cookie 设置 SameSite 属性。该属性表示 Cookie 不随着跨域请求发送,可以很大程度减少 CSRF 的攻击,但是该属性目前并不是所有浏览器都兼容。
2:Referer Check;HTTP Referer是header的一部分,当浏览器向web服务器发送请求时,一般会带上Referer信息告诉服务器是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理来判断是不是CSRF攻击
3:Anti CSRF Token;这种方法相比Referer检查要安全很多,token可以在用户登陆后产生并放于session或cookie中,然后在每次请求时服务器把token从session或cookie中拿出,与本次请求中的token 进行比对。由于token的存在,攻击者无法再构造出一个完整的URL实施CSRF攻击
4:验证码;验证码能够很好地遏制CSRF攻击。但降低了用户的体验,在关键业务点设置验证码即可。
三、DoS
在 DoS 攻击中,攻击者通过伪造 ACK 数据包,希望 Server 重传某些数据包,Server 根据 TCP 重转机制,进行数据重传。攻击者利用 TCP 协议缺陷,通过发送大量的半连接请求,耗费 CPU 和内存资源。
TCP三次握手过程中,服务器给客户端发送 SYN+ACK 之后到收到客户端的 ACK 之前的 TCP 连接称为半连接,此时服务器处于 SYN_RCVD 状态。攻击者配合 IP 欺骗,SYN 攻击会达到很好的效果。SYN 攻击指的就是在短时间内伪造大量不存在的 IP 地址,向服务器不断地发送 SYN 包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的 SYN 包将长时间占用未连接队列,正常的 SYN 请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
如何防御:
1:缩短 SYN Timeout 时间,及时将超时请求丢弃,释放被占用的 CPU 和内存资源
2:限制同时打开的 SYN 半连接数目,关闭不必要的服务
3:设置 SYN Cookie,给每一个请求连接的 IP 地址分配一个 Cookie。如果短时间内连续受到某个 IP 的重复 SYN 报文,就认定受到了攻击,以后从这个 IP 来的请求包都会丢弃
四、SQL注入
SQL注入利用这个漏洞,可以访问或修改数据,或者利用潜在的数据库漏洞进行攻击。
比如之前预想的SQL 语句是:
SELECT * FROM user WHERE username='admin' AND psw='password'
但是恶意攻击者用奇怪用户名将你的 SQL 语句变成了如下形式:
SELECT * FROM user WHERE username='admin' --' AND psw='xxxx'
在 SQL 中,' --是闭合和注释的意思,-- 是注释后面的内容的意思,所以查询语句就变成了:
SELECT * FROM user WHERE username='admin'
如何防御:
1:前端进行有效性检验
2:后端进行有效性检验。(为什么服务端还要做有效性检验?第一准则,外部都是不可信的,防止攻击者绕过Web端请求)
3:过滤SQL需要的参数中的特殊字符。比如单引号、双引号。
五、点击劫持
点击劫持是一种视觉欺骗的攻击手段。攻击者将需要攻击的网站通过 iframe 嵌套的方式嵌入自己的网页中,并将 iframe 设置为透明,在页面中透出一个按钮诱导用户点击。
如何防御:
X-FRAME-OPTIONS是一个 HTTP 响应头,在现代浏览器有一个很好的支持。这个 HTTP 响应头 就是为了防御用 iframe 嵌套的点击劫持攻击
六 、URL跳转漏洞
借助未验证的URL跳转,将应用程序引导到不安全的第三方区域,从而导致的安全问题。
如何防御:
1:referer的限制
2:加入有效性验证Token,通过在生成的链接里加入用户不可控的Token对生成的链接进行校验