这是我参与「第四届青训营 」笔记创作活动的的第5天
攻击篇
XSS (跨站脚本攻击)
攻击者利用盲目信任用户提交的内容, 直接把用户提交的字符串转化成DOM,从而造成XSS攻击
XSS的特点:
- 通常难以从UI上感知 (暗地执行脚本)
- 窃取用户信息 (cookie/token)
- 绘制UI(例如弹窗), 诱骗用户点击/填写表单
Stored XSS (存储型XSS)
- 恶意脚本被存储在数据库中
- 访问页面 => 读数据 => 被攻击
- 危害最大, 对全部用户可见
Reflected XSS
- 不涉及数据库
- 从URL上攻击
把用户输入的数据反射给浏览器,需要诱导用户点击一个恶意链接才能攻击成功
DOM-based XSS
- 不需要浏览器的参与
- 恶意攻击的发起 + 执行, 全在浏览器完成
Mutation-based XSS
- 利用了浏览器渲染DOM的特性(独特优化)
- 不同浏览器会有区别(按照浏览器进行攻击)
CSRF (跨站伪造请求)
- 在用户不知情的前提下
- 利用用户权限 (cookie)
- 构造指定HTTP请求, 窃取或修改用户敏感信息
Injection
SQL Injection
服务器端用字符串凭借SQL语句注入恶意
SSRF
Server-Side Request Forgery
- 请求用户自定义的callback URL
- web server通常有内网访问权限
DoS
Denial of Service
通过某种方式(构造特定请求), 导致服务器资源被显著消耗来不及响应更多请求, 导致请求挤压, 进而雪崩效应
ReDos
基于正则表达式的DOS
贪婪: n次不行?n-1次再试试,即回溯的方法([?] vs [no ?] :一个即可 vs 尽可能多的)
不恰当的正则, 可以大大提高响应时间, 降低接口吞吐量
DDoS
Distributed Dos
短时间内, 大量僵尸设备的请求流量, 服务器不能及时完成全部请求, 导致请求堆积,进而无法响应新请求
特点:
- 直接访问IP
- 任意API
- 消耗大量带宽 (以耗尽为目的)
SYN洪水攻击, 攻击者发送大量TCP请求, 发送大量SYN给服务器, 服务器返回ACK + SYN, 但攻击者不返回ACK, 导致TCP三次握手无法完成, connection不能被释放, 达到最大连接次数后, 服务器无法响应请求
中间人攻击 (传输层)
特点
- 明文传输
- 信息篡改不可知
- 对方身份未验证
防御篇
XSS
-
永远不要信任用户的提交内容
-
不要讲用户提交的内容直接转化未DOM
现成工具
前端
- 主流框架默认防御XSS
- google-closure-library
服务端 (Node)
- DOMPurify
如果必须动态生成DOM
注意
- string转DOM, 要先对string进行转义
- 上传svg文件, 先对svg进行扫描, 防止恶意的script标签
- 自定义的跳转行为,做好过滤
- 自定义样式要仔细检查,防止出现发送get请求等
Same-origin Policy (同源策略)
协议, 域名, 端口均相同才是同源, 否则是跨域
Content Security Policy (内容安全策略)
CSRF的防御
利用请求头部防御
可用请求头部的Origin或Referer判断请求是否来自安全源
利用token防御
用户端请求页面, 服务端会返回页面+token, 客户端API+token发送请求, 服务端验证token后返回数据
iframe攻击
防御anti-pattern
使用GET请求的就只使用GET请求,不要将POST和GET请求写在一起,会造成攻击的漏洞
SameSite Cookie
如果依赖Cookie的第三方服务,内嵌一个X站播放器, 识别不了用户登录态, 发不了弹幕
Injection
SQL
- 找到项目中查询SQL的地方
- 使用prepared statement
Injection(除了SQL)
防御DOS
Regex DoS
- Code Review 避免不好的正则
- 代码扫描 + 正则性能测试
- 用户提供的使用正则不采用
Logical DoS
DDoS
- 流量治理 (过滤)
- 负载均衡
- API网关
- CDN
- 快速自动扩容 (扛量)
- 非核心服务降级 (扛量)
传输层 -- 防御中间人
使用HTTPS
HTTPS特性
- 可靠性
- 完整性
- 不可抵赖性