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

145 阅读4分钟

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

攻击篇

XSS (跨站脚本攻击)

Cross Site Scripting 跨站脚本, 缩写和CSS重名, 为了区分而叫XSS

主要利用了开发者盲目信任用户提交的内容, 直接把用户提交的字符串转化成DOM

特点:

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

Stored XSS (存储型XSS)

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

Reflected XSS

  • 不涉及数据库
  • 从URL上攻击

把用户输入的数据反射给浏览器,需要诱导用户点击一个恶意链接才能攻击成功

DOM-based XSS

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

Mutation-based XSS

浏览器的渲染引擎会将本来没有任何危害的HTML代码渲染成具有潜在危险的XSS攻击代码

CSRF (跨站伪造请求)

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

Injection

SQL Injection (最常见)

利用服务器端用字符串凭借SQL语句, 来注入恶意SQL语句

CLI

Command-Iine Interface

类似SQL注入, 注入恶意命令

SSRF

Server-Side Request Forgery

SSRF 形成的原因大都是由于服务端提供了从其他服务器获取数据的功能且没有对目标地址做过滤与限制. 由攻击者构造,由服务端发起请求的一个网络攻击,一般用来在外网探测或攻击内网服务

DoS

Denial of Service

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

ReDos

正则的NFA机制

NFA: 不确定有穷自动机。匹配的路径是不确定的,如果在某一条路径能够完成匹配,则能够及时返回。如果没能匹配上,则会回溯,尝试其他的路径。直到把所有的路径走完。

利用不恰当的正则, 可以大大提高响应时间, 降低接口吞吐量

DDoS

Distributed Dos

短时间内, 大量请求, 服务器不能及时完成全部请求, 导致请求堆积

特点:

  • 直接访问IP
  • 任意API
  • 消耗大量带宽 (以耗尽为目的)

如洪水攻击, 攻击构造大量TCP请求, 发送大量SYN给服务器, 服务器返回ACK + SYN, 但攻击者不返回ACK, 导致三次握手没有完成, 连接数不能被释放, 达到最大连接次数后, 服务器无法响应请求

中间人攻击 (基于传输层)

利用:

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

防御篇

XSS

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

    • 不要讲用户提交的内容直接转化未DOM

现成工具

前端

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

服务端 (Node)

  • DOMPurify

如果必须动态生成DOM

注意

  • string转DOM, 要先对string进行转义
  • 如果允许用户上传svg文件, 要对svg进行扫描, 防止夹带恶意的script标签
  • 尽量不要做用户自定义的跳转行为, 如果必须做, 要做好过滤, 避免传递js代码

Same-origin Policy (同源策略)

协议, 域名, 端口均相同才是同源, 否则是跨域

Content Security Policy (内容安全策略)

安全源: 同源或者允许的源

来自安全源的脚本可以执行, 否则直接报错

CSRF的防御

利用请求头部防御

可用请求头部的Origin或Referer判断请求是否来自安全源

利用token防御

用户端请求页面, 服务端会返回页面+token, 客户端利用API+token发送请求, 服务端验证token才会返回数据

抵御iframe攻击

利用iframe发送同源请求进行攻击, 绕开了origin的限制

可用通过设置请求头部 X-Frame-Options: DENY/SAMEORIGIN

防御anti-pattern

利用某些开发的偷懒GET做成既能读又能写, CSRF攻击到损失惨重

SameSite Cookie

  • 依赖Cookie的第三方服务怎么办?

    • 内嵌一个X站播放器, 识别不了用户登录态, 发不了弹幕

服务器端可以设置Set-Cookie: SameSite=None; Secure; (即不对cookie限制, 但必须Secure确保安全)

CORS (跨域资源共享)

Injection

SQL

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

除了SQL的Injection

  • 最小权限原则 (不要什么都sudo)
  • 建立允许名单过滤掉危险命令
  • 对URL类型进行协议, 域名, ip等限制

Regex DoS

  • Code Review 避免不好的正则
  • 代码扫描 + 正则性能测试
  • 不用用户的正则

DDoS

  • 流量治理 (过滤)

    • 负载均衡
    • API网关
    • CDN
  • 快速自动扩容 (扛量)

  • 非核心服务降级 (扛量)

传输层 -- 防御中间人

策略: 使用HTTPS

HTTPS特性

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