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

53 阅读4分钟

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

攻击篇

  1. XSS 跨站脚本攻击
  • 原理:恶意用户在提交会经过页面渲染的内容时嵌入代码;如果盲目信任用户提交的内容,将恶意用户提交的内容按原样渲染到页面,就有可能使其他用户遭受攻击
  • 特点:
    • 偷偷执行,通常难以从UI上感知
    • 窃取用户的cookie token等隐私信息
    • 能够绘制弹窗等UI,诱骗用户点击/填写表单
  • 类别
    • Stored XSS 如上传带有恶意脚本的视频,存到数据库被所有用户访问
      • 特点:
        • 恶意脚本存在数据库中
        • 用户在读取页面数据时被攻击
        • 危害最大,对全部用户可见
    • Reflected XSS 在url字段填入攻击内容提交,用页面上服务器发回的响应渲染
      • 特点:
        • 不涉及数据库
        • 从URL上攻击
    • DOM-based XSS 在url字段填入攻击内容,在本地渲染
      • 特点:
        • 不需要服务器的参与
        • 攻击的发起和执行都在本地的浏览器完成
    • Mutation-based XSS 如用title属性渲染出一个加载失败的图片,用onerror回调攻击函数
      • 特点
        • 利用了某种特定浏览器渲染DOM的特性
<!--Mutation-based XSS-->
<noscript><p title="</noscript><img src=x onerror=exploit()>">
<!--example, say chrome, rendered result-->
<div>
 <noscript><p title="</noscript>
 <img src="x" onerror="exploit()">
"">"
</div>
  1. CSRF 跨站请求伪造

如:用户点开恶意邮件的链接,恶意邮件构造一个跨域的HTTP请求,带着用户的Cookie发到银行,从而窃取用户账户财产

  • 特点:
    • 用户不知情时利用cookie等行使用户权限
    • 构造指定HTTP请求,窃取修改用户敏感信息
  1. Injection 注入攻击
  • 原理:在参数中注入命令,恶意执行

  • 类型

    • SQL
    • CLI
    • shell command
  • 原理类似的SSRF 服务端伪造请求

    如嵌入命令修改重要文件,将流量代理转发到对手网站使其瘫痪 或者利用请求中的自定义callback URL访问内网机密等

  1. DoS 拒绝服务

如利用正则匹配的贪婪模式构造恶意字符串进行ReDos

  • 原理:通过构造特定请求等方式显著消耗服务器资源,使服务器来不及响应更多请求,导致请求挤压,进而导致雪崩效应
  • 特点
    • 直接访问IP
    • 任意API
    • 消耗大量带宽
  1. DDoS 分布式拒绝服务

如SYN Flood,大量发送SYN=1的TCP包却不进行第三次握手,导致大量连接没有被释放

  1. 中间人攻击

防御篇

  1. 防XSS
  • 原则
    • 永远不信任用户提交的内容
  • 现成工具
    • 前端
      • 主流框架默认防御XSS
      • 利用google-closure-library
    • 服务端
      • DOMPurify
  • 如果必须动态生成DOM
    • 从string到DOM的过程中一定要对string转义
    • 用户上传的svg文件可能含有script标签,需要进行扫描
    • 尽量不要做用户自定义跳转,做了要进行过滤
    • 尽量不要让用户自定义样式,防止CSS选择器被利用攻击
  • SoP 浏览器同源策略(服务器设置)
  • CSP 内容安全策略(服务器设置)
  1. 防 CSRF
  • 利用Origin+Referer限制来源
  • 防CSRF-token
    • 可以先有页面、后有请求,在请求页面的同时传递一个token
    • 注意两个token需要和具体用户绑定
    • 注意token需要指定过期时间
  • 防CSRF-iframe攻击

在合法页面的iframe嵌入一个button

点击按钮时由于button的css属性设置,请求由iframe发送

从而实现Origin字段同源

解决方法: 在服务器的响应中设置X-Frame-Options,选择DENY或SAMEORIGIN

  • 防CSRF-anti-pattern

避免把get和post放一块,防止数据同时泄露和被篡改

  • SameSite Cookie

    隔离不同域名的cookie

    由服务器端指定Set-Cookie字段

  • 用中间件防御

  1. 防SQL Injection
  • 用SQL预编译语句代替raw SQL语句
  • 限制用户权限
  • 限制用户可执行的命令
  • 对URL类型参数进行协议、域名、ip等限制
  1. 防御DoS

避免写出贪婪正则等易被攻击的代码

  • 代码审查贪婪正则
  • 代码扫描 + 性能测试正则
  • 不使用用户自定义正则
  1. 防御DDoS
  • 过滤
    • 负载均衡
    • API 网关
  • 抗量
    • 使用CDN
    • 快速自动扩容
    • 非核心服务降级
  1. 防御中间人
  • 使用HTTPS
    • 避免明文传输
    • 确保信息没有被篡改
    • 确认双方身份
  • 数字签名 不对称加密
  • HSTS 将http请求升级到https
  1. 防静态资源被劫持篡改
  • 用hash SRI(Subresource Integrity)
  • feature policy / permission policy