常见Web安全漏洞(一)

1,236 阅读4分钟

前言

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。

一、XSS

XSS (Cross-Site Scripting),跨站脚本攻击,因为缩写和CSS一样,所以就只能叫XSS。是非常常见的一种web攻击手段。XSS的原理是攻击者往Web页面插入恶意可执行网页脚本,当用户浏览这个页面的时候,嵌在网页中的脚本就会执行,从而达到窃取用户信息的目的。

XSS的攻击手段非常多,大致可以分为下面几个类型。

1. 非持久型XSS,也叫反射型XSS

非持久型XSS攻击,顾名思义是一次性的攻击,仅对当前访问的页面产生影响。攻击者会让用户访问一个被篡改的URL,当用户访问该链接的时候就会触发预先插入网页中的脚本,从而达到攻击的目的。

https://xxx.com/xxx?test=<script>alert(document.cookie)</script>

举个例子: 攻击者可以通过上面的URL执行脚本代码alert('XSS')

2. 持久性XSS(存储型XSS)

持久型XSS漏洞,一般存在于表单提交等交互功能,如文章留言,提交文本信息等,黑客利用的XSS漏洞,将攻击脚本经正常功能提交进入数据库持久保存,当前端页面获得后端从数据库中读出的注入代码时,恰好将其渲染执行。

WeChat5a10e5ea6b59dd0198ab34d1bdee19c1.png

相较于反射性XSS攻击,存储型XSS攻击更持久,危害性也更高。但是攻击成本也会相应的提高。

因为同时要满足几个条件:后端数据入库的时候没有进行转义。前端拿到数据没有转义直接渲染。任何一个条件的不满足都会导致攻击的失败。

如何防御XSS攻击

从用户输入下手

我们常说用户的输入是不可信的,把用户的输入想象成具有攻击性的代码。最普遍的做法就是转义输入输出的内容,对于引号、尖括号、斜杠进行转义。现在有很多开源的XSS Filter。

输出格式化

在前端渲染的时候对可能存在攻击的内容做XSS过滤。转义格式化标志字符,从而禁止可疑代码的执行。想要对抗XSS,以下的字符转义内容是必不可少的:

特殊字符实体编码
&&amp;
<&lt;
&gt;
"&quot;
'&#x27;
/&#x2F;

HttpOnly

这是预防XSS攻击窃取用户cookie最有效的防御手段。Web应用程序在设置cookie时,将其属性设为HttpOnly,就可以避免该网页的cookie被客户端恶意JavaScript窃取,保护用户cookie信息。

二、CSRF

什么是CSRF?

跨站请求伪造(Cross-site request forgery),也被称为one-click attack 或者session riding,通常缩写为CSRF 或者XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

如何防御CSRF?

通过以下几个原则可以大大减少CSRF的攻击:

  • Get请求不对数据进行修改
  • 不让第三方网站访问到用户Cookie
  • 阻止第三方网站请求接口
  • 请求时附带验证信息,比如验证码或者Token

(1)SameSite

对Cookie设置SameSite属性。该属性表示Cookie不随着跨域请求发送,可以很大程度减少CSRF的攻击。

(2)Token

在HTTP请求中以参数的形式加入一个随机产生的token,并在服务器建立一个拦截器来验证这个token。服务器读取浏览器当前域cookie中这个token值,会进行校验该请求当中的token和cookie当中的token值是否都存在且相等,才认为这是合法的请求。否则认为这次请求是违法的,拒绝该次服务。

(3)Referer

Referer是header的一部分,当浏览器向web服务器发送请求时,一般会带上Referer信息告诉服务器是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。可以通过检查请求的来源来防御CSRF攻击。正常请求的referer具有一定规律,如在提交表单的referer必定是在该页面发起的请求。所以通过检查http包头referer的值是不是这个页面,来判断是不是CSRF攻击。但是这个方法存在一定的风险。

(4)Verification code

这是一个偏向业务的方法,也在很多的网站中应用。当用户想要操作存在危险的动作,比如修改密码、更换自己的手机号、修改银行卡、转账等操作的时候,进行验证码二次确认可以很大程度上提高安全性。

常见Web安全漏洞(二)

参考链接:

www.cnblogs.com/fundebug/p/…

zhuanlan.zhihu.com/p/163052063

tech.meituan.com/2018/10/11/…