Web开发安全 | 青训营笔记

76 阅读3分钟

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

05 Web开发安全

hacker —— 攻击篇

Cross-Site Scripting(XSS)
  • 主要利用:

    • 盲目信任用户的提交内容
    • 将用户提交的string直接转换为DOM
  • 特点

    • 通常难以从UI上感知
    • 窃取用户信息(cookie/token)
    • 绘制UI,诱骗用户点击/填写表单
  • 分类

    • 存储型:

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

      • 不涉及数据库
      • 从URL上攻击
    • 基于DOM的攻击:

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

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

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

    • GET
    • beyond GET
Injection
  • SQL Injection

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

    • CLI
    • OS command
    • Server-Side Request Forgery(SSRF) 服务端伪造请求(严格来讲不是注入攻击)
Denial of Service (Dos)
  • 正则表达式的贪婪模式,带"?"即为关闭贪婪模式,不带"?"的正则表达式即为贪婪模式。处于贪婪模式的正则表达式会尽可能多的匹配字符

  • ReDoS:基于正则表达式的DoS

    • n次不匹配则回溯到n-1次尝试,导致响应时间增加,接口吞吐量下降
  • Distributed Dos(DDoS)

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

    • 攻击特点:

      • 直接访问IP
      • 任意API
      • 消耗大量带宽
基于传输层的攻击
  • 中间人攻击

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

防御篇

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

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

  • 现成工具:

    • 前端

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

      • DOMPurify
  • 对于必须要将string转换成为DOM的情况:

    • 对string进行转义
  • 用户上传svg:

    • 对svg文件进行一次扫描
  • 自定义跳转链接:

    • 尽量不要做允许用户自定义跳转链接的页面,即使要做也必须对自定义跳转链接做扫描
  • 同源策略Same-origin Policy(SOP)

    • 协议、域名、端口均相同才叫同源
    • HTTP请求一般对于同源是可行的,而对于跨域则不可行(更多是要看服务器的配置)
  • Content Security Policy(CSP)

    • 哪些源被认为是安全的
    • 来自安全源的脚本的脚本可以执行,否则直接抛错
    • 对eval或内联script直接报错
CSRF的防御
  • 如果伪造请求是异常来源,限制请求
  • token防御机制:

    • 浏览器向服务器请求页面
    • 服务器返回页面+token
    • 浏览器请求API时携带token
    • 服务器验证token并返回数据

image.png

  • iframe攻击——同源请求

    • X-Frame-Options:DENY/SAMEORIGIN
  • GET请求不应该既可以请求数据又可以修改数据

  • SameSite Cookie

    • 避免用户信息被携带
    • 第三方cookie不会被携带
Injection的防御
  • 找到项目中查询SQL的地方
  • 使用prepared statement
防御DoS
  • 完善代码,避免贪婪模式的正则表达式
  • 拒绝用户提供的使用正则
防御DDoS
  • 流量治理

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

  • 非核心服务降级

防御中间人
  • HTTPS

    • 可靠性
    • 完整性
    • 不可依赖性

image.png