Web安全 | 青训营笔记

85 阅读5分钟

这是我参与「第四届青训营 」笔记创作活动的的第5天

红蓝对抗:本文主要围绕攻-防两个方面展开

常见攻击方式

Cross-Site Scripting(XSS)

概念: 跨站脚本攻击(Cross-site scripting,通常简称为XSS)发生在客户端,跨站脚本攻击是指在存在安全漏洞的Web浏览器内运行非法的HTML标签或JavaScript进行的一种攻击。

原理: XSS 的原理是恶意攻击者往 Web 页面里插入恶意可执行网页脚本代码,当用户浏览该页之时,嵌入其中 Web 里面的脚本代码会被执行,从而可以达到攻击者盗取用户信息或其他侵犯用户安全隐私的目的。

常见漏洞:

  • 盲目信任用户提交内容

  • string → DOM

    • document.write
    • element.innerHTML = anyString;
    • SSR(user_data)

特点:

  • 难以从UI上感知(暗中执行脚本)
  • 窃取用户信息(cookie/token)
  • 绘制UI(如弹框),诱骗用户点击/填写表单

Stored XSS

  • 恶意脚本经正常功能提交被存在数据库中
  • 客户端从数据中读取数据时,会将其渲染并被执行
  • 访问页面 → 读数据 === 被攻击
  • 危害最大,对全部用户可见

Reflected XSS

  • 最普遍的跨站类型
  • 跨站攻击代码存在于链接中,通过请求攻击链接,经过服务端反射回来
  • 即时性,不经过服务器存储,直接通过 HTTP 的 GET 和 POST 请求就能完成一次攻击
  • 反馈率低,所以较难发现和响应修复
  • 需要经过用户点击链接才能发起
<http://host/api/path?param=><script>攻击脚本</script>

async render(ctx) {
	const { param } = ctx.query;
	ctx.status = 200;
	ctx.body = `<div>${param}</div>`;
}

DOM-based XSS

  • 不需要服务端的参与
  • 恶意攻击的发起 + 执行全部由浏览器完成

image.png

Mutation-based XSS

通过浏览器渲染机制,在渲染错误时执行回调,调用攻击脚本

防御:

  • 永远不要信任用户提交的内容

  • 不要将用户提交内容直接转换成DOM

    • new DOMParser() 进行转义
    • 上传SVG时进行扫描
    • 让用户自定义跳转、样式时尤其需要注意,可以执行脚本的地方

防御策略:CSP

CSP 本质上就是建立白名单,开发者明确告诉浏览器哪些外部资源可以加载和执行。只需要配置规则,如何拦截是由浏览器实现的。

  • 设置 HTTP Header 中的 Content-Security-Policy
  • 设置 meta 标签的方式

现成工具:

  • 主流框架默认防御XSS
  • google-closure-library
  • DOMPurify

Cross-Site Request Forgery(CSRF)

在用户不知情的前提下,利用用户权限(cookie),构造指定HTTP请求,窃取或修改用户敏感信息

image.png

image (1).png

防御:

  • 请求头部进行设置

image.png

  • 不让第三方网站访问到用户 Cookie
  • 阻止第三方网站请求接口
  • 请求时附带验证信息,比如验证码或者 Token
  • 重要操作增加二次图片验证码或滑动验证码等
  • 致命操作使用二次密码验证或人脸识别等
  • SameSite Cookie

image.png

SameSite和CORS区别

image.png

CSRF-iframe

用户在登陆 A 网站的系统后,被攻击者诱惑打开第三方网站,而第三方网站通过 iframe 引入了 A 网站的页面内容,用户在第三方网站中点击某个按钮(被装饰的按钮),实际上是点击了 A 网站的按钮。

image.png

防御:

  1. 通过配置 nginx 发送 X-Frame-Options 响应头.

这个HTTP响应头 就是为了防御用 iframe 嵌套的点击劫持攻击。

这样浏览器就会阻止嵌入网页的渲染

该响应头有三个值可选,分别是:

  • DENY,表示页面不允许通过 iframe 的方式展示。
  • SAMEORIGIN,表示页面可以在相同域名下通过 iframe 的方式展示。
  • ALLOW-FROM,表示页面可以在指定来源的 iframe 中展示。
  1. 使用 Javascript防御

判断顶层视口的域名是不是和本页面域名一致,如果不一致就让恶意网页自动跳转到我方的网页。

if (top.location.hostname !== self.location.hostname) {    
    alert("您正在访问不安全的页面,即将跳转到安全页面!")   
    top.location.href = self.location.href;
 }

Injection

SQL injection

SQL注入攻击(SQL Injection),简称注入攻击、SQL注入,被广泛用于非法获取网站控制权,是发生在应用程序的数据库层上的安全漏洞。在设计程序,忽略了对输入字符串中夹带的SQL指令的检查,被数据库误认为是正常的SQL指令而运行,从而使数据库受到攻击。

可能导致数据被窃取、更改、删除,以及进一步导致网站被嵌入恶意代码、被植入后门程序等危害。

image.png

OS command

修改 + 读取系统内容,执行系统命令(如 rm -rf /)

Server-Side Request Forgery(SSRF)

利用服务器端具有内网访问权限的特点,进行攻击,获取内网信息。

image.png

防御:

  • 构建Middlewares,对SQL进行过滤和预编译
  • 最小权限,不要赋予sudo和root权限
  • 建立允许名单
  • 对URL类型参数进行协议、域名、ip等限制

Denial of Service(DoS)

  • 通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及响应更多请求,导致请求挤压,进而雪崩效应。

防御:

  • code review
  • 正则性能测试
  • 不适用用户提供的正则

Distributed DoS(DDoS)

通过不停的去访问你的网站,让你的网站负荷过大承载不了而使网站无法被其他人访问

特点:

  • 直接访问IP
  • 任意API
  • 消耗大量带宽

image.png

防御:

  • 流量治理

    • 负载均衡
    • API网关
    • CDN
  • 快速自动扩容

  • 非核心服务降级

中间人攻击

原理:

  1. 明文传输
  2. 信息篡改不可知
  3. 对方身份未验证

防御:

  • 确保当前你所访问的网站使用了HTTPS
  • 不要在公共Wi-Fi上发送敏感数据
  • 如果你的网站使用了SSL,确保你禁用了不安全的SSL/TLS协议。
  • 不要点击恶意链接或电子邮件。

image.png