WEB开发的安全之旅
1、假如你是一个hacker–攻击
Cross-Site Scripting(XSS)
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。
XSS主要利用了:
- 盲目信任用户提交的内容
- sring->DOM
- document.wirte
- element.innerHTML = anyString
- SSR(user_data) //伪代码
特点
- 通常难以从 UI 上感知(暗地里执行脚本)
- 窃取用户的信息(cookie/token)
- 绘制UI(例如弹窗),诱骗用户点击/填写表单
类型:
- Stored XSS
-
Reflected XSS
- 不涉及数据库
- 从URL上攻击
-
DOM-based XSS
- 不需要服务器的参与
- 恶意攻击的发起 + 执行,全在浏览器完成
-
Mutation-based XSS
- 利用了浏览器渲染DOM的特性
- 不同浏览器,会有区别(按照浏览器进行攻击)
Cross-site request forgert(CSRF)
- 在用户不知情的前提下
- 利用用户权限(cookie)
- 构造指定 HTTP 请求,窃取或者修改用户敏感信息
SQL injection
SSRF injection
Denial of Service(Dos)
通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及响应更多请求,导致请求被挤压,进而雪崩效应。
正则表达式–贪婪模式
Distributed DoS(DDoS)
短时间内,基于大量僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,进而雪崩效应,无法响应新请求。
特点:
- 直接访问IP
- 任意API
- 消耗大量带宽(耗尽)
基于传输层–中间人攻击
- 明文传输
- 信息篡改不可知
- 对方身份未认证
2、假如你是一个开发者–防御
XSS
原则
- 永远不要相信用户提交的任何类容
- 不要将用户提交内容直接转化成dom
现成工具
- 前端
- 主流框架默认防御XSS
- google-closure-library
- 服务端(node)
- DOMPurify
注意
-
string->DOM
-
上次svg(以为里面可以插入script标签)
-
自定义跳转链接
-
自定义样式
Conten Security Policy(CSP)
-
拿些源被认为是安全的
-
来自安全源的脚本可以执行,否则直接抛出错误
-
对eval + inline script直接拒绝
CSRF的防御
token
iframe攻击
anti-pattern
SameSite Cookie
对比SameSite vs CORS
- SameSite
- cookie发送
- domain vs 页面域名
- CORS
- 资源读写
- 资源域名 vs 页面域名
- 白名单
inject
- 找到项目中查询SQL的地方
- 使用 prepared statement
原则 - 最小权限原则
- sudo || root
- 建立允许白名单 + 过滤
- rm
- 对URL类型参数进行协议、域名、ip等限制
- 访问内网
Regex Dos
不要写出贪婪匹配的方式,特别处理接口的的地方
拒绝使用用户提供的正则表达式
- 访问内网
DDos
- 流量治理
- 负载均衡
- API网关
- CDN
- 快速自动扩容
- 非核心服务降级
传输层–防御中间人
HTTPS
- 可靠性:加密
- 完整性:MAC验证
- 不可抵赖性:数字签名
完整性
成也证书,败也证书,当签名算法不够健壮时,签名算法被暴力破解!
HTTP Strict-Transport-Security(HSTS)
Subresource Integrity( SRI)
扩展
总结
- 安全无小事
- 使用的依赖(npm package,设置是nodejs)可能会成为最薄弱的一环
- left-pad事件
- eslint-scope事件
- event-stream事件
- 保持学习心态