Web 开发的安全之旅 | 青训营笔记

67 阅读4分钟

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

Web 开发的安全之旅

攻击篇

XSS

Cross-Site Scripting

  • 植入 js 代码段

特点

  • 通常难以从 UI 上感知
  • 窃取用户信息 (cookie / token)
  • 绘制 UI, 诱骗用户

攻击方式

  • Stored XSS

    • 恶意脚本被存在数据库中
    • 访问页面 -> 读数据 -> 被攻击
    • 危害最大, 对全部用户可见
  • Reflected XSS

    • 不涉及数据库
    • 从 URL 上攻击
  • DOM-based XSS

    • 不需要服务器的参与
    • 恶意攻击的发起 + 执行, 全在浏览器完成
  • Mutation-based XSS

    • 利用了浏览器渲染 DOM 的特性 (独特优化)
    • 不同的浏览器, 会有区别 (按浏览器进行攻击)
  • Cross-stie request Forgery(CSRF)

    • 在用户不知情的前提下
    • 获取用户权限
    • 构造指定的 http 请求, 窃取 / 修改用户敏感信息

Injection

SQL injection

  • SQl 参数 (恶意注入)
  • Server 参数 -> SQL -> 运行 SQL code
  • 获取其他数据, 修改数据, 删除数据

CLI

  • 调用虚拟视频格式转换脚手架, 脚手架接受一些参数, 这些参数运行用户自定义 Options
  • 攻击者个已传入 ' && rm -rf xxx 干掉服务器上的东西

OS command

  • 暴露服务器上的文件位置, 被攻击者修改

SSRF

严格上说, SSRF 不属于 injection, 但是原理类似

  • 将内网信息暴露给外部, 导致外部对内网的一些配置进行攻击

DoS

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

正则表达式 --- 贪婪模式

重复匹配时 [?] VS [no ?] : 满足 "一个" 即可 vs 尽量多

ReDoS

基于正则表达时的 DoS

  • n 次不行, 就试验 n - 1 次
  • 导致服务器大量算力用于处理数据

Logical DoS

  • 耗时的同步操作
  • 数据库写入
  • SQL join
  • 文件备份
  • 循环执行逻辑

Distributed DoS (DDoS)

短时间内, 来自大量僵尸设备的请求流量, 服务器不能及时完成全部请求, 导致请求堆积 ,进而雪崩效应, 无法响应新请求.

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

传输层

中间人攻击

恶意 webview, 路由器, ISP

  • 明文传输
  • 信息篡改不可知
  • 对方身份未验证

防御篇

XSS

  • 永远不要相信用户的提交内容
  • 不要将用户提交内容直接转换成 DOM

现成工具

前端
  • 主流框架默认防御 XSS (vue, react)
  • google-closure-library
服务端(Node)
  • DOMPurify

必须进行 DOM 转换时

  • string -> DOM

  • 检测 svg 文件 (svg 可以插入 js 文件)

  • 使用 Blob 动态生成 script

  • 过滤自定义跳转连接

  • 留意自定义样式

    • 控制状态的 css , 使用网络请求图片, 然后导致了一个请求发送, 导致暴露信息

Same-origin Policy

同源策略: 协议, 域名, 端口 全部相同

Content Security Policy

内容安全策略:

  • 定义哪些源被认为是安全的
  • 来自哪些源的脚本可以执行, 否则直接跑错
  • 对 eval + inline script 说 no

CSRF 的防御

  • 限制请求

  • token

    • 绑定用户:
    • 过期时间: 向前保密
  • iframe 攻击

    • 构造页面, 按钮透明,
  • anti-patten

    • GET !== GET + POST
  • 避免用户信息被携带

    • SameSite Cookie

    • 自己的 cookie 只能被自己使用

    • 与 CORS 的区别

      • SameSite

        • Cookie 发送
        • domain VS 页面域名
      • CORS

        • 资源读写
        • 资源域名 VS 页面域名
        • 白名单
  • 建立防御中间件

Injection

  • 找到项目中查询 SQL 的地方
  • 使用 prepared statement

CLI

  • 最小权限原则
  • 建立允许名单 + 过滤
  • 对 URL 类型参数进行协议, 域名, ip 等的限制

防御 DoS

  • Regex DoS

    • Code Review
    • 代码扫描 + 正则性能测试
    • 不使用用户提供的正则
  • Logincal DoS

    • 分析代码的性能瓶颈
    • 限流
  • DDoS

    • 流量治理

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

    • 非核心服务降级

传输层 --- 防御中间人

Http 的一些特性

可靠性, 完整性, 不可抵赖性

数字签名

公钥, 私钥

Https 的不可抵赖性

也就是提到的数字签名

  • 如果签名算法不够健壮, 可以被暴力破解

HSTS

HTTP Strict-Transport-Security

SRI

Subresource Integrity: 静态资源是否被篡改, 通过对比哈希

最后

  • left-pad 事件
  • eslint-scope 事件
  • event-stream 事件