这是我参与「第四届青训营 」笔记创作活动的第3天
感觉今天的课很有意义,浅记录一下课堂内容
两个角度看web安全
攻击者,防御者
一、攻击篇
1、跨站脚本攻击xss
跨站脚本攻击是开发维护页面中,攻击者通过注入恶意脚本
主要利用了开发者盲目信任用户提交的内容,直接把用户提交的直接转换成dom
特点:
- 通常难以从ui上感知(暗地执行脚本)
- 窃取用户信息(cookie/token)
- 绘制ui(例如弹窗),诱骗用户点击、填写表单 一些xss的demo:
- Stored XSS存储型xss攻击,直接存到数据库中,危害最大,对全部用户都可见。
如果是攻击者就可以提交一个script标签插入html中
- Reflected XSS反射型,不涉及数据库,从URL上攻击 如果把字段构造一个恶意script标签,当用户访问页面时,就会命中xss攻击
- Dom-based XSS不需要服务器参与,恶意攻击的发起和执行全部在浏览器完成
DOM和Reflected区别: - Mutation-base XSS按浏览器区别攻击
2、跨站伪造请求CSRF 没有访问某个网页,却在该页面中特定接口被请求,且请求执行成功 - 在用户不知情的情况下
- 利用用户权限(cookie)
- 构造指定的http请求窃取信息
GET请求或者任意形式 构造一个html表单即可攻击
3、Injection(注入)
-
SQL注入:通过恶意注入sql参数非法获得数据库的权限
-
CLI
-
OS command
-
SSRF 视频格式在转换,接受option参数,无过滤。攻击者传入一个系统命令,可以直接对服务器的目标文件执行操作,读取修改或删除
转移流量,对竞争对手的服务器发起攻击令其挂掉
callback URL不进行过滤会暴露内网信息,暴露内网访问权限
-
DoS 构造特定请求,消耗服务器资源,导致服务器雪崩
-
ReDos:基于正则表达式的DoS 贪婪:N次不行?N-1再试试?无限回溯。导致响应时间高,接口吞吐量变低
-
DDoS最常见的DoS攻击,来自大量僵尸设备的请求,就是量大 直接访问ip,直接目的消耗带宽 洪水攻击:发送大量TCP请求,但攻击者不反回第三次ACK,导致三次握手不能完成,Connection不能被释放,新请求无法响应。
基于传输层的攻击: 1、中间人攻击 在服务器和客户端的信息交互中多了个中间人 中间人会窃取信息,修改请求,返回 产生原因:明文传输,不知道信息篡改,对方身份未验证
二、防御篇
1、针对XSS
不信任用户提交的内容,不把用户提交内容直接转换成DOM 现成工具: 前端:
- 主流框架 服务器(Node):
- DOMPurify
如果用户需求不讲武德,必须动态生成DOM:
1.1、转义
1.2、扫描上传svg
1.3、不做让用户自定义跳转行为,做好过滤
1.4、自定义样式
当某个特定标签被选中时,触发GET请求。
2、Same-orign Policy
对于http请求,一般同源yes,不同源no SCP:\
- 哪项域名安全
- 对某些标签eval+inline script直接抛错
3、CSRF防御
4、不带cookie:SameSite Cookie
一种可以防御CSFPF的防御模式
5、Injection
找到SQL查询的地方,使用prepared statement Injection beyong SQL
- 最小权限
- 建立白名单
- 对URL类型参数进行协议域名IP等限制
6、Regex DoS
- 避免写贪婪算法
- 代码扫描+正则性能测试
- 拒绝用户提供的正则
7、DDoS防御思路
8、传输层防御方式:防御中间人HTTPS
特点:
- 可靠性:加密,避免明文传输
- 完整性:MAC认证,确保信息没有被篡改
- 不可抵赖性:数字签名确保身份
https流程:
9、SRI
静态资源被篡改?对比哈希值!
10、Feature Policy/Permission Policy
在一个源/页面开发者可以使用哪些功能?
就算被攻击,也可以限制页面不能调用一些敏感的东西
尾声
使用的依赖(npm package ,甚至是NodeJS)可能成为最薄弱的一环
-
left-pad事件
-
eslint-scope事件
-
event-stream事件 npm install黑洞还有漏洞