这是我参与「第四届青训营 」笔记创作活动的第 5 天
Web 开发的安全之旅
攻击篇
XSS
Cross-Site Scripting
- 植入 js 代码段
特点
- 通常难以从 UI 上感知
- 窃取用户信息 (cookie / token)
- 绘制 UI, 诱骗用户
攻击方式
-
Stored XSS
- 恶意脚本被存在数据库中
- 访问页面 -> 读数据 -> 被攻击
- 危害最大, 对全部用户可见
-
Reflected XSS
- 不涉及数据库
- 从 URL 上攻击
-
DOM-based XSS
- 不需要服务器的参与
- 恶意攻击的发起 + 执行, 全在浏览器完成
-
Mutation-based XSS
- 利用了浏览器渲染 DOM 的特性 (独特优化)
- 不同的浏览器, 会有区别 (按浏览器进行攻击)
-
Cross-stie request Forgery(CSRF)
- 在用户不知情的前提下
- 获取用户权限
- 构造指定的 http 请求, 窃取 / 修改用户敏感信息
Injection
SQL injection
- SQl 参数 (恶意注入)
- Server 参数 -> SQL -> 运行 SQL code
- 获取其他数据, 修改数据, 删除数据
CLI
- 调用虚拟视频格式转换脚手架, 脚手架接受一些参数, 这些参数运行用户自定义 Options
- 攻击者个已传入
' && rm -rf xxx干掉服务器上的东西
OS command
- 暴露服务器上的文件位置, 被攻击者修改
SSRF
严格上说, SSRF 不属于 injection, 但是原理类似
- 将内网信息暴露给外部, 导致外部对内网的一些配置进行攻击
DoS
通过某种方式构造特点请求, 导致服务器资源被显著消耗, 来不及响应更多请求, 导致请求挤压, 进而雪崩效应
正则表达式 --- 贪婪模式
重复匹配时 [?] VS [no ?] : 满足 "一个" 即可 vs 尽量多
ReDoS
基于正则表达时的 DoS
- n 次不行, 就试验 n - 1 次
- 导致服务器大量算力用于处理数据
Logical DoS
- 耗时的同步操作
- 数据库写入
- SQL join
- 文件备份
- 循环执行逻辑
Distributed DoS (DDoS)
短时间内, 来自大量僵尸设备的请求流量, 服务器不能及时完成全部请求, 导致请求堆积 ,进而雪崩效应, 无法响应新请求.
- 直接访问 IP
- 任意 API
- 消耗大量带宽
传输层
中间人攻击
恶意 webview, 路由器, ISP
- 明文传输
- 信息篡改不可知
- 对方身份未验证
防御篇
XSS
- 永远不要相信用户的提交内容
- 不要将用户提交内容直接转换成 DOM
现成工具
前端
- 主流框架默认防御 XSS (vue, react)
- google-closure-library
服务端(Node)
- DOMPurify
必须进行 DOM 转换时
-
string -> DOM
-
检测 svg 文件 (svg 可以插入 js 文件)
-
使用 Blob 动态生成 script
-
过滤自定义跳转连接
-
留意自定义样式
- 控制状态的 css , 使用网络请求图片, 然后导致了一个请求发送, 导致暴露信息
Same-origin Policy
同源策略: 协议, 域名, 端口 全部相同
Content Security Policy
内容安全策略:
- 定义哪些源被认为是安全的
- 来自哪些源的脚本可以执行, 否则直接跑错
- 对 eval + inline script 说 no
CSRF 的防御
-
限制请求
-
token
- 绑定用户:
- 过期时间: 向前保密
-
iframe 攻击
- 构造页面, 按钮透明,
-
anti-patten
- GET !== GET + POST
-
避免用户信息被携带
-
SameSite Cookie
-
自己的 cookie 只能被自己使用
-
与 CORS 的区别
-
SameSite
- Cookie 发送
- domain VS 页面域名
-
CORS
- 资源读写
- 资源域名 VS 页面域名
- 白名单
-
-
-
建立防御中间件
Injection
- 找到项目中查询 SQL 的地方
- 使用 prepared statement
CLI
- 最小权限原则
- 建立允许名单 + 过滤
- 对 URL 类型参数进行协议, 域名, ip 等的限制
防御 DoS
-
Regex DoS
- Code Review
- 代码扫描 + 正则性能测试
- 不使用用户提供的正则
-
Logincal DoS
- 分析代码的性能瓶颈
- 限流
-
DDoS
-
流量治理
- 负载均衡
- API 网关
- CDN
-
快速自动扩容
-
非核心服务降级
-
传输层 --- 防御中间人
Http 的一些特性
可靠性, 完整性, 不可抵赖性
数字签名
公钥, 私钥
Https 的不可抵赖性
也就是提到的数字签名
- 如果签名算法不够健壮, 可以被暴力破解
HSTS
HTTP Strict-Transport-Security
SRI
Subresource Integrity: 静态资源是否被篡改, 通过对比哈希
最后
- left-pad 事件
- eslint-scope 事件
- event-stream 事件