这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
XSS
Cross-Site Scripting (XSS) 跨站脚本攻击
向网页中注入恶意脚本
攻击
利用点
- 盲目信任用户提交的内容
- 代码直接将用户提交的字符串转换成DOM
特点
- 通常难以 从UI上感知(暗地执行脚本)
- 窃取用户信息(cookie/token)
- 绘制UI(例如弹窗),诱骗用户点击/填写表单
分类
- Stored XSS
- 恶意脚本被存入数据库,访问页面相当于读取了数据即被攻击
- 危害最大,对全部用户可见
- Reflected XSS
- 不涉及数据库,从URL上攻击
- 例如URL的param参数
<div>${param}</div>
- DOM-based XSS
- 不需要服务器参与,恶意攻击的发起和执行全在浏览器完成
- Mutation-based XSS
- 利用了不同浏览器不同的DOM渲染方式,针对某一浏览器进行攻击
- 四类中最巧妙且最难防御的
防御
原则:永远不信任用户的提交内容
现成工具
- 前端:主流框架默认防御XSS;google-closure-library
- 服务端:Node-DOMPurify
实践
- 不要将用户提交的内容直接转换为DOM
- SVG 文件要扫描
- 尽量不允许用户进行自定义跳转行为,允许要做过滤
- 留意用户自定义样式
CSRF
Cross-Site Request Forgery (CSRF) 跨站伪造请求
在用户不知情的前提下,利用用户权限(cookie)构造指定HTTP请求,窃取或修改用户敏感信息
Content Security Policy (CSP) 内容安全策略
- 设定哪些源(域名)是安全的,安全源的脚本可执行,否则报错
- 拒绝eval和内联脚本
攻击
- 常用攻击方式Get,如将GET和POST逻辑指向同一个接口
<ifame>攻击,来自同源请求
防御
- origin + referrer
- token
- X-Frame-Option:DENY/SAMEORIGIN
- 中间件
- SameSite Cookie 属性
- 避免用户信息被携带
- 依赖Cookie的第三方服务,允许携带但要标记为Sesure
Injection
注入攻击的本质,是把用户输入的数据当做代码执行
XSS本质上也是一种针对HTML的注入攻击
攻击
条件
- 用户能够控制输入
- 原本程序要执行的代码,拼接了用户输入的数据
SQL Injection
- SQL参数恶意注入
- ❌SQL语句直接以字符串的形式拼接语句
其它注入
- CLI 命令行,❌执行参数不做过滤
- OS command 系统命令,❌暴露可以读取和修改文件
原理类似
- Server-Site Request Forgery (SSRF),服务端伪造请求
- ❌对callback不进行过滤,暴露内网信息
防御
原则:数据与代码分离
- SQL:prepared statement
- 最小原则,不要通过sudo执行,不给root权限
- 建立白名单机制和过滤原则
- SSRF:对URL类型参数进行协议、域名、IP等限制
DoS
Denial of Service (DoS) 服务拒绝
通过某种方式(如构造特定请求)导致服务器资源被显著消耗,来不及响应更多请求,导致请求挤压,造成雪崩效应
攻击
Regex DoS (ReDoS)
- 基于正则表达式的DoS
- 利用点:匹配的贪婪模式(有多少要多少;非贪婪,有一个就够了)
- 攻击者可以构造一个容易发生回溯行为的字符串,造成服务器响应时间大幅升高
Distributed DoS (DDoS)
- 短时间内,服务器收到大量僵尸设备的请求流量,导致服务器的请求堆积,造成雪崩
- 常见攻击方式
- 洪水攻击SYN Flood,不让服务器完成请求过程,使其达到最大连接数且连接无法释放
- 基于传输层:中间人攻击,介入浏览器和服务器中间
防御
ReDos
- 避免贪婪模式
- 代码扫描工具+正则性能测试
- 拒绝使用用户提供的正则表达式
DDoS
- 流量治理
- (过滤)负载均衡
- (过滤)API网关层面,识别流量
- (抗量)域前置CDN(Content delivery networks,内容分发网络)
- (抗量)快速自动扩容
- (抗量)非核心服务降级
防御中间人攻击
- HTTPS
- 可靠性:对称加密和非对称加密,避免明文传输
- 完整性:MAC验证规则,确保信息未被篡改
- 数字签名:CA(证书机构)签名校验,确认身份
- HTTP Strict-Transport-Security (HSTS)
- 将HTTP主动升级到HTTPS
- Subresource Integrity (SRI)
- hash算法对比前后资源,确保静态资源不被挟持篡改
安全无小事,处处需留心