这是我参与「第五届青训营」伴学笔记创作活动的第 7 天
一、本堂课重点内容:
- 从攻击者角度看 Web 安全
- 从防御者角度看 Web 安全
二、详细知识点介绍:
攻击篇
跨站脚本攻击(XSS)
危险
- 用户隐私泄露
- 成为挖矿工具
防护
- 不能盲目信任用户输入内容
特点
- 通常难以从 UI 上感知
- 窃取用户信息(cookie / token)
- 绘制 UI ,诱骗用户
分类
存储型 XSS 攻击
- 恶意脚本存在数据库中
- 访问页面即可因读数据被攻击
- 危害最大(所有用户均可见)
反射性 XSS 攻击
- 对服务器进行注入
- 不涉及数据库
- 从 URL 上进行攻击
基于 DOM 的 XSS 攻击
- 对浏览器进行注入
- 不需要服务器参与
- 恶意攻击发布和执行在浏览器中完成
基于 Mutation 的 XSS 攻击
- 例子:<noscript><p title="</noscript><img src="xxx" />">
- 不易被防御
跨站伪造请求(CSRF)
特点
- 在用户不知情的前提下利用用户权限(cookie)构造 HTTP 请求,窃取用户敏感信息
注入
SQL 注入
流程
- 请求 SQL 语句
- 服务器运行 SQL 语句
- 被恶意增删查改数据
例子
sql.query(`SELECT a, b, c FROM table WHERE username = ${username}`)
攻击者可执行 any; DROP TABLE table; 即可将以上的查询语句改造为 SELECT XXX FROM XXX; DROP TABLE table; 即可被恶意删库
命令行(CLI)
例子
exec(`conver-cli ${video} -o ${options}`);
攻击者可在 options 中传入 && rm -rf xxx 即可将以上的查询语句改造为 conver-cli ${video} -o ${options} && rm -rf xxx 即可被恶意删除数据
重要文件举例
- /etc/passwd
- /etc/shadow
- ~/.ssh
- /etc/apache2/httpd.conf
- /etc/nginx/nginx.conf
系统命令
服务端伪造请求(SSRF)
目标
从外网访问到其无法访问的内部系统
服务拒绝(DoS)
介绍
通过某种方式(构造特定请求),导致服务器资源被显著消耗从而使得服务器来不及响应更多请求以致于请求挤压,导致雪崩效应
基于正则表达式的 DoS(ReDoS)
正则表达式 - 贪婪模式
是否使用「 ? 」,使用即为满足一个即可,反之则为贪婪模式
例子
使用正则表达式 /^((ab)*)+$/ 匹配字符串 abababababababa 时,会因为匹配失败而不断删除末尾的 ab 进行重试匹配,这种行为则会导致回溯,使得响应时间延长,接口吞吐量降低
分布式拒绝服务攻击(DDOS)
介绍
短时间内,来自大量僵尸设备的请求流量,服务器不能及时完成全部请求导致请求堆积,从而导致雪崩效应
特点
- 直接访问 IP
- 任意 API
- 消耗大量带宽
例子
TCP 与服务器握手三次,在握手第二次后,攻击者并没有进行第三次握手,导致服务器的连接数被占用,当占用到最大连接数时,服务器则无法响应新的请求
传输层
中间人攻击
介绍
在浏览器-服务器中插入中间人使得传输层变为浏览器-中间人-服务器,让浏览器认为自己在与服务器沟通,服务器也在与浏览器沟通,中间人则可以继续宁窃取信息、修改请求和返回数据等等操作
存在场景
- 明文传输
- 信息篡改不可知
- 对方身份未验证
防御篇
跨站脚本攻击(XSS)
- 永远不信任用户的提交内容
- 不将用户提交内容直接转换为 DOM
- 对内容(string、svg等等)进行转义
注意
- 自定义样式
- 自定义跳转连接
- 上传 SVG
现成工具
前端
- 主流框架默认防御 XSS
- Google-closure-library
服务端(Node)
- DOMPurify
内容安全策略(CSP)
特点
- 判断哪些源(域名)是安全的
- 来自安全源的脚本可以执行否则抛错
- 禁用 eval 和 行内 Script
同源策略(Same-orgin Policy)
三要素一致才为“同源”
- 协议
- 域名
- 端口号
例子
服务器响应头部
Content-Security-Policy: script-src 'self' -> 同源
浏览器 meta
跨站伪造请求(CSRF)
- 限制请求来源
- 由于同源请求中,GET 和 HEAD 方法不发送 Origin ,因此用 Referer 更广泛一些
使用 token 防御
访问步骤
- 浏览器向服务器请求页面
- 服务器接收请求并返回页面 + token
- 浏览器请求 API 带上 token
- 服务器验证 token + 数据
注意
- 需要进行用户绑定
- 需要设置过期时间
Iframe 攻击
介绍
通过用户点击攻击者伪装在 iframe 中的 button 使得触发 iframe 发送 HTTP 请求,因 iframe 在服务端内,因此访问为同源访问,不受限制
防御
通过 X-Frame-Options 响应头部进行设置
- DENY - 当前页面不能通过 Iframe 进行加载
- SAMEORIGIN - 必须为同源页面才能加载 Iframe
CSRF 反模式
- 使用 GET 请求同时实现获取数据和修改数据等操作
避免用户信息被携带(SameSite Cookie)
介绍
仅有第一方的 Cookie 会被带上,不会带上来自其他域名的 Cookie
特点
- 限制 Cookie Domain
- 判断是否与页面域名匹配
依赖 Cookie 的第三方服务处理
使用 Set-Cookie: SameSite=None; Secure;
注入
SQL 注入
- 找到项目中查询 SQL 的语句
- 使用 prepared statement
其他注入
- 最小权限原则(拒绝 sudo 和 root)
- 建立白名单以及过滤
- 对 URL类型参数进行协议、域名、IP等限制
服务拒绝(DoS)
基于正则表达式的 DoS(ReDoS)
- 杜绝写出贪婪模式
- 代码扫描和正则性能测试
- 拒绝使用用户提供的正则表达式
分布式拒绝服务攻击(DDOS)
-
流量治理
- 负载均衡
- API 网关
- CDN
- 快速自动扩容
- 非核心服务降级
传输层
中间人攻击
使用 HTTPS
-
可靠性:加密
- 传输内容:加密信息 + 加密信息_hash
- 完整性:MAC 验证
- 不可抵赖性:数字签名
TLS 过程
-
非对称加密
- 加密套件选项传给服务端
- 采用套件 + 证书返回给浏览器
- 判断证书正确后协商加密算法生成 sessionKey
-
对称加密
- 通过传输 sessionKey 以及数据进行验证和传输数据
通过 HSTS 使得 HTTP 主动升级为 HTTPS
SRI
通过 hash 判断资源是否被进行篡改
三、课堂总结:
- 不要相信用户所输入的内容
- 对内容进行转移或者过滤
- 使用的依赖可能成为薄弱的一环
- 不断学习防御知识