这是我参与「第四届青训营」笔记创作活动的第6天
攻击篇
- XSS 跨站脚本攻击
- 原理:恶意用户在提交会经过页面渲染的内容时嵌入代码;如果盲目信任用户提交的内容,将恶意用户提交的内容按原样渲染到页面,就有可能使其他用户遭受攻击
- 特点:
- 偷偷执行,通常难以从UI上感知
- 窃取用户的cookie token等隐私信息
- 能够绘制弹窗等UI,诱骗用户点击/填写表单
- 类别
- Stored XSS
如上传带有恶意脚本的视频,存到数据库被所有用户访问
- 特点:
- 恶意脚本存在数据库中
- 用户在读取页面数据时被攻击
- 危害最大,对全部用户可见
- 特点:
- Reflected XSS
在url字段填入攻击内容提交,用页面上服务器发回的响应渲染
- 特点:
- 不涉及数据库
- 从URL上攻击
- 特点:
- DOM-based XSS
在url字段填入攻击内容,在本地渲染
- 特点:
- 不需要服务器的参与
- 攻击的发起和执行都在本地的浏览器完成
- 特点:
- Mutation-based XSS
如用title属性渲染出一个加载失败的图片,用onerror回调攻击函数
- 特点
- 利用了某种特定浏览器渲染DOM的特性
- 特点
- Stored XSS
如上传带有恶意脚本的视频,存到数据库被所有用户访问
<!--Mutation-based XSS-->
<noscript><p title="</noscript><img src=x onerror=exploit()>">
<!--example, say chrome, rendered result-->
<div>
<noscript><p title="</noscript>
<img src="x" onerror="exploit()">
"">"
</div>
- CSRF 跨站请求伪造
如:用户点开恶意邮件的链接,恶意邮件构造一个跨域的HTTP请求,带着用户的Cookie发到银行,从而窃取用户账户财产
- 特点:
- 用户不知情时利用cookie等行使用户权限
- 构造指定HTTP请求,窃取修改用户敏感信息
- Injection 注入攻击
-
原理:在参数中注入命令,恶意执行
-
类型
- SQL
- CLI
- shell command
-
原理类似的SSRF 服务端伪造请求
如嵌入命令修改重要文件,将流量代理转发到对手网站使其瘫痪 或者利用请求中的自定义callback URL访问内网机密等
- DoS 拒绝服务
如利用正则匹配的贪婪模式构造恶意字符串进行ReDos
- 原理:通过构造特定请求等方式显著消耗服务器资源,使服务器来不及响应更多请求,导致请求挤压,进而导致雪崩效应
- 特点
- 直接访问IP
- 任意API
- 消耗大量带宽
- DDoS 分布式拒绝服务
如SYN Flood,大量发送SYN=1的TCP包却不进行第三次握手,导致大量连接没有被释放
- 中间人攻击
防御篇
- 防XSS
- 原则
- 永远不信任用户提交的内容
- 现成工具
- 前端
- 主流框架默认防御XSS
- 利用google-closure-library
- 服务端
- DOMPurify
- 前端
- 如果必须动态生成DOM
- 从string到DOM的过程中一定要对string转义
- 用户上传的svg文件可能含有script标签,需要进行扫描
- 尽量不要做用户自定义跳转,做了要进行过滤
- 尽量不要让用户自定义样式,防止CSS选择器被利用攻击
- SoP 浏览器同源策略(服务器设置)
- CSP 内容安全策略(服务器设置)
- 防 CSRF
- 利用Origin+Referer限制来源
- 防CSRF-token
- 可以先有页面、后有请求,在请求页面的同时传递一个token
- 注意两个token需要和具体用户绑定
- 注意token需要指定过期时间
- 防CSRF-iframe攻击
在合法页面的iframe嵌入一个button
点击按钮时由于button的css属性设置,请求由iframe发送
从而实现Origin字段同源
解决方法: 在服务器的响应中设置X-Frame-Options,选择DENY或SAMEORIGIN
- 防CSRF-anti-pattern
避免把get和post放一块,防止数据同时泄露和被篡改
-
SameSite Cookie
隔离不同域名的cookie
由服务器端指定Set-Cookie字段
-
用中间件防御
- 防SQL Injection
- 用SQL预编译语句代替raw SQL语句
- 限制用户权限
- 限制用户可执行的命令
- 对URL类型参数进行协议、域名、ip等限制
- 防御DoS
避免写出贪婪正则等易被攻击的代码
- 代码审查贪婪正则
- 代码扫描 + 性能测试正则
- 不使用用户自定义正则
- 防御DDoS
- 过滤
- 负载均衡
- API 网关
- 抗量
- 使用CDN
- 快速自动扩容
- 非核心服务降级
- 防御中间人
- 使用HTTPS
- 避免明文传输
- 确保信息没有被篡改
- 确认双方身份
- 数字签名 不对称加密
- HSTS 将http请求升级到https
- 防静态资源被劫持篡改
- 用hash SRI(Subresource Integrity)
- feature policy / permission policy