这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天
以下为今日课上笔记内容
Web 安全一窥
安全问题“很常见”,会危害
- 用户
- 公司
- 程序员 (祭天)
很遗憾,这个[免费变强] 的功能下线了
两个角度看 web 安全
1.假如你是一个 hacker一一攻击
2.假如你是一个开发者一一防御
一.攻击篇
1.Cross-Site Scripting(XSS)
- XSS 主要利用了
- XSS 的一些特点
通常难以从UI上感知(暗地执行脚本)
窃取用户信息 (cookie/token)
绘制 UI(例如弹窗),诱骗用户点击/填写表单
- XSS demo
可以直接提交恶意脚本
- 类型
1).Stored XSS(存储型)
恶意脚本被存在数据库中
访问页面->读数据==被攻击
危害最大,对全部用户可见
2).Reflected XSS
不涉及数据库
从URL上攻击
- Reflected XSS Demo
3).DOM-based XSS
不需要服务器的参与
恶意攻击的发起+执行,全在浏览器完成
Reflected vs DOM-based
一个为服务端 一个为浏览器
4).Mutation-based XSS
利用了浏览器渲染 DOM 的特性(独特优化)
不同浏览器,会有区别(按浏览器进行攻击)
2.Cross-site request forgery(CSRF)
在用户不知情的前提下
利用用户权限(cookie)
构造指定HTTP请求,窃取或修改用户敏感信息
CSRF demo
类型: 1)CSRF--GET
2)CSRF--beyond GET
3.Injection(注入)
- SQLInjection
- Injection demo 1
读取请求字段
直接以字符串的形式拼接SQL 语句
Injection 不止于 SQL
- CLI
- OS command
- Server-Side Request Forgery(SSRF),服务端伪造请求
- 严格而言,SSRF 不是 injection,但是原理类似
Injection demo 2一一执行
- Injection demo2--读取 +修改
- SSRF demo
1)请求[用户自定义]的 callback URL
2)web server 通常有内网访问权限
- Denial of Service(DoS)
导致服务器资源被显薯消耗通过某种方式(构造特定请求),来不及响应更多请求,导致请求挤压,进而雪崩效应。
- 插播: 正则表达式一一贪婪模式
重复匹配时[?]vs [no ?]: 满足“一个“即可 vs 尽量多
- ReDoS:基于正则表达式的 DoS
贪婪:n 次不行? n- 1 次再试试? --回溯
- Distributed DoS(DDoS)
短时间内,来自大量僵尸设备的请求流量,服务器不能及时完成全部请求,!导致请求堆积,进而雪崩效应,无法响应新请求 [不搞复杂的,量大就完事儿了]
- DDos
攻击特点
1)直接访问 IP
2)任意API
3)消耗大量带宽(耗尽)
- DDoS demo
- 传输层
1.中间人攻击
1)明文传输
2)信息篡改不可知
3)对方身份未验证
二.防御篇
1.XSS
- 永远不信任用户的提交内容
- 不要将用户提交内容直接转换成 DOM
2.XSS一一现成工具
前端
- 主流框架默认防御XSS
- google-closure-library 服务端 (Node)
- DOMPurify
3.XSS一一耗子尾汁
[用户需求] 不讲武德,必须动态生成 DOM
string -> DOM
上传svg
自定义跳转链接
自定义样式
4.插播: Same-origin Policy
- 协议
- 域名
- 端口
5.Content Security Policy(CSP)
CSP
- 哪些源(域名)被认为是安全的
- 来自安全源的脚本可以执行,否则直接抛错
- 对 eval + inline script 说不
服务器的响应头部
浏览器 meta
6.CSRF的防御
7.CSRF--token
除了 Origin + Referrer其他判断[请求来自于合法来源]的方式
1)用户绑定攻击者也可以是注册用户 === 可以获取自己的token
2)过期时间[前向保密]
8.CSRF--iframe 攻击
9.CSRF anti-pattern
GET != GET + POST
避免用户信息被携带: SameSite Cookie
10.SameSite Cookie
依赖 Cookie 的第三方服务怎么办?
- 内嵌一个 X 站播放器,识别不了用户登录态,发不了弹幕
11.SameSite vs CORS
SameSite
- Cookie 发送
- domain vs页面域名
- "我跟你说个事儿出这屋我可就不认了"
CORS
- 资源读写(HTTP请求)
- 资源域名vs页面域名
- 白名单
12.SameSite demo
FirstPartyCookie 3PartyCookie
13.防御CSRF的正确姿势
Case by case 防御?不
Injection
- 找到项目中查询 SQL 的地方
- 使用 prepared statement
14.Injection beyond SQL
15.防御 DoS
Regex DoS
DDos
16.传输层一一防御中间人
17.HTTPS的一些特性
- 可靠性:加密
- 完整性:MAC验证
- 不可抵赖性:数字签名
明文
篡改身份
18.HTTPS一一完整性
19.插播:数字签名
签名执行者
- privateKey (自己藏好)
- publicKey (公开可见)
20.HTTPS一一不可抵赖:数字签名
21.HTTPS一一证书续
22.HTTPS一一证书 demo
成也证书,败也证书
23.HTTP Strict-Transport-Security(HSTS)
24.Subresource Integrity(SRI)
25.SRI--demo
标签 hash (原始内容 hash) vs 实际内容 hash
一点点补充内容
三.尾声 安全无小事 使用的依赖,(npm package,甚至是 NodeJS) 可能成为最薄弱的一环。
- left-pad 事件
- eslint-scope 事件
- npm install 除了带来了黑洞,还可以带来漏洞
- event-stream 事件 保持学习心态
推荐读物
- Amazon.com: Web Application Security: Exploitationand Countermeasuresfor Modern WebApplications (9781492053118): Hoffman,Andrew: Books
- SameSite 那些事怡红院落(imnerd.org)
- 关于 Web 安全突然想到的 · Issue #32 · AngusFu/diary (github.com)
- What_is_a_DDoS_Attack?