前端安全入门

316 阅读9分钟

一、常见攻击方式

1.XSS(Cross Site Scripting)跨站脚本攻击

(1)跨站脚本攻击为区别CSS,在安全领域叫做XSS。本质是恶意代码未经过滤,与网站正常的代码混在一起,浏览器无法分辨哪些脚本是可信的,导致恶意脚本执行。

(2)攻击要素:

  • 攻击者提交恶意代码

  • 浏览器执行恶意代码

(3)攻击分类:

  • 反射型XSS
    恶意代码并没有保存在目标网站,通过引诱用户点击一个链接到目标网站的恶意链接来实施攻击的,反射型XSS也叫做“非持久型XSS

    有这样一个url:http:xxxxx.com?name=xxx(xxx是恶意代码)
    // 传到服务端的参数name被服务端接收之后,假设响应的页面包含name这个变量的值,则会把name注入到页面上面,达到攻击的效果
    
  • 存储型XSS
    存储型XSS会把用户输入的数据“存储”在服务器端,这种XSS具有很强的稳定性,存储型XSS通常也叫做“持久型XSS
    比较常见的一个场景就是,黑客写下一篇包含有恶意JS代码的博客文章,发表后,所有访问该博客文章的用户都会在他们的浏览器中执行这段恶意的JS代码。黑客把恶意的脚本保存到服务器端,所以这种XSS攻击就叫做“存储型XSS

  • DOM型XSS
    利用dom本身的缺陷,进行攻击,属于JS自身的安全漏洞,输出点在dom,可能是反射性也可能是存储型

    <img src="{{img.src}}">
    
    // 返回的 img.src=/xxxx" onerror=xxx"
    // 这样放到imgsrc中就成了这样<img src="/xxx" onerror=xxx">
    // src肯定会加载失败,然后执行了onerror中注入的恶意代码,达到攻击效果
    

2.CSRF(Cross Site Request Forgy)跨站请求伪造

(1)原理:在第三方网站向本网站发起请求(如图)

  1. 用户在a站前端页面发起登录(身份认证)请求

  2. a站后端确认身份,登录成功,cookie中存在用户的身份认证信息

  3. b站前端页面向a站后端发起请求,带着a站的cookie信息(身份认证信息),请求成功

综上,可以清楚的知道,只要用户访问了b站的前端页面,b站就可以在用户完全不知道的情况下,带着a站的用户登录态(cookie)向a站发起请求

(2)CSRF攻击要素

  • 攻击一般发起在第三方网站,被攻击的网站无法防止攻击发生

  • 攻击利用受害者在被攻击网站的登录凭证,冒充受害者提交操作,而不是直接窃取数据

  • 整个过程攻击者并不能获取受害者登录凭证,只是冒用

  • 跨站请求可以是图片URL、超链接、CORSForm提交等

(3)举个栗子

一个网站用户`Bob`可能正在浏览聊天论坛,而同时另一个用户`Alice`也在此论坛中,并且后者刚刚发布了一个具有`Bob`银行链接的图片消息。设想一下,`Alice`编写了一个在`Bob`的银行站点上进行取款的`form`提交的链接,并将此链接作为图片`src`。如果`Bob`的银行在`cookie`中保存他的授权信息,并且此`cookie`没有过期,那么当`Bob`的浏览器尝试装载图片时将提交这个取款`form`和他的`cookie`,这样在没经`Bob`同意的情况下便授权了这次事务。

3.SQL注入

(1)通过Web应用接口注入SQL语法,破坏原有SQL结构,达到攻击行为。 如果网站存在注入漏洞,相当于将数据库直接暴露在攻击者面前。根据注入位置及方式不同分分为POST注入、GET注入、cookie注入、盲注、延时注入、搜索注入、base64注入等

(2)攻击要素

  • 跳过账户权限验证达到越权

  • 获取数据库关键信息从而进行脱库

  • 特别情况下还可以修改数据库内容,如果数据库权限分配存在问题,攻击者可以通过SQL入漏洞直接获取webshell或者服务器系统权限

(3)举个栗子
某个网站的登录验证的SQL查询代码为:

strSQL = ``"SELECT * FROM users WHERE (name = '" + userName + ``"') and (pw = '"``+ ``passWord +``"');"

恶意填入

userName = ``"1' OR '1'='1"``;

passWord = ``"1' OR '1'='1"``;

时,将导致原本的SQL字符串被填为

strSQL = ``"SELECT * FROM users WHERE (name = '1' OR '1'='1') and (pw = '1' OR '1'='1');"

也就是实际上运行的SQL命令会变成下面这样的

strSQL = ``"SELECT * FROM users;"

因此达到无账号密码,亦可登录网站。所以SQL注入攻击被俗称为黑客的填空游戏

4.点击劫持

点击劫持就是利用视觉欺骗用户将一个危险网站设置透明,然后在其上方设置一个按钮,当你点击这个按钮的时候,就触发底部透明的危险网站的事件,从而欺骗用户点击一个按钮或者输入一个值

或者是将一个网站通过iframe进来,通过透明度设置不可见,诱导用户点击可见的一个按钮触发事件达到自己的一个目的等

5.XXE漏洞

XXEXML External Entity)外部实体漏洞,当应用程序解析XML输入时,如果没有禁止外部实体的加载,导致可加载恶意外部文件和代码,造成任意文件读取、命令执行、内网端口扫描等攻击。只在能够接收XML格式参数的接口才会出现

6.暴力破解

弱密码(Weak Password)被他人猜到或被破解工具暴力破解

7.其他漏洞

  • XST攻击

  • 目录遍历漏洞

  • 命令执行漏洞

  • 文件上传漏洞

  • 业务漏洞

  • 框架或应用漏洞

二、如何防御

1.XSS攻击防御

(1)CSP(Content Security Policy)网页安全政策

CSP的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。两种方法可以启用 CSP

一种是通过HTTP头信息的Content-Security-Policy的字段

另一种是通过网页的<meta>标签

<meta
  http-equiv="Content-Security-Policy"
  content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:"
>

上面代码中,CSP做了如下配置

  • 脚本:只信任当前域名
  • <object>标签:不信任任何URL,即不加载任何资源
  • 样式表:只信任cdn.example.orgthird-party.org
  • 框架(frame):必须使用HTTPS协议加载
  • 其他资源:没有限制

启用后,不符合CSP的外部资源就会被阻止加载

详情:www.ruanyifeng.com/blog/2016/0…

(2)X-XSS-Protection

HTTPX-XSS-Protection 响应头是Internet ExplorerChromeSafari的一个特性,当检测到跨站脚本攻击(XSS)时,浏览器将停止加载页面。若网站设置了良好的 Content-Security-Policy 来禁用内联JavaScript ('unsafe-inline'),现代浏览器不太需要这些保护, 但其仍然可以为尚不支持CSP的旧版浏览器的用户提供保护

(3)HttpOnly

Web应用程序在设置cookie时,将其属性设为HttpOnly,这是预防XSS攻击窃取用户cookie最有效的防御手段

(4)特殊字符转义

永远不要信赖用户的输入,对特定字符做转义。内容注入替换尖括号(< => &lt; > => &gt;),属性注入替换单引号或双引号(" => &quot; ' => &#39;

2.CSRF攻击防御

CSRF的发生有几个特点,b站发送的请求带着a站的cookie信息; b站发送请求不经过a站的前端;http请求头中的referer为b站。我们可以从这些特点入手,思考防御的办法

(1)禁止第三方网站携带本网站的cookie信息:设置same-site属性,same-site属性有两个值,Strict(所有的第三方请求都不能携带本网站的cookie)和Lax(链接可以,但是form表单提交和ajax请求不行)

参考:www.ruanyifeng.com/blog/2019/0…

(2)本网站前端页面添加验证信息:使用验证码或者添加token验证

  • 验证码:当发起请求时,前端需要输入本网站页面的验证码信息,后端对验证码进行验证,验证码正确才会进行相关操作(存取数据等)

  • token验证:a站前端将token存在当前页面中(比如表单中的input隐藏域,meta标签或者任何一个dom的属性)和cookie中,当请求a站后端的时候,参数中带上这个token字段,a站后端将参数中的tokencookie中的token做对比, 相同则验证通过,不同则请求不合法

不管是验证码还是token验证,原理都是一样的,在a站前端页面加入验证,当第三方网站请求a站后端时,即使能携带a站cookie,但是因为没有经过a站的前端页面从而拿不到验证信息,也会导致请求失败

(3)referer验证:禁止来自第三方的请求

3.SQL注入防御

(1)增加黑名单或者白名单验证

白名单验证一般指,检查用户输入是否是符合预期的类型、长度、数值范围或者其他格式标准。黑名单验证是指,若在用户输入中,包含明显的恶意内容则拒绝该条用户请求。在使用白名单验证时,一般会配合黑名单验证

(2)安全检测

在项目完成的时候,始终坚持安全检测

(3)防止系统敏感信息泄露

对数据表的访问权限进行严格控制,尽量限制用户不必要的访问权限

参考:www.jianshu.com/p/f8e47a132…

4.点击劫持防御

(1)Javascript禁止内嵌:当网页没有被使用iframe内嵌时,topwindow是相等的;当网页被内嵌时,topwindow是不相等的;可以在本网站的页面中添加如下判断:

<script>
if (top.location != window.location) {
  // 如果不相等,说明使用了iframe,可进行相关的操作
}
</script>

但是这种方式并不是万能的,因为iframe标签中的属性sandbox属性是可以禁用内嵌网页的脚本的:

<iframe sandbox="allow-forms" src="..."></iframe>

(2)设置http响应头X-Frame-Options:有三个值DENY(禁止内嵌)SAMEORIGIN(只允许同域名页面内嵌)ALLOW-FROM(指定可以内嵌的地址)。能在所有的web服务器端预设好X-Frame-Options字段值是最理想的状态

(3)一些辅助手段,比如添加验证码,提高用户的防范意识