这是我参与「第四届青训营 」笔记创作活动的第6天
安全问题“很常见”,发生安全事故会危害,用户,公司,程序员
两个角度看web安全:
- 假如你是一个hacker--攻击
- 假如你是一个开发者--防御
一.攻击篇
Cross-Site Scripting(xss)--跨栈脚本攻击 在网页中攻击者通过一种方式把恶意脚本注入进来当用户访问页面,脚本就会被运行,用户信息就会被监控,用户电脑会被控制
1.xss主要利用了:
- 作为开发者,盲目信任用户提交的内容
- 作为开发者,直接将用户提交的字符串转化为了demo
xss= string->Dom
-document.write
-element.innerHTML=anyString
-SSR(user_data) // 伪代码
xss的一些特点:
- 通常很难从UI上感知(暗地执行脚本)
- 窃取用户信息(cookie/token)
- 绘制UI(例如弹窗),诱骗用户点击/填写表单
eg:
没有进行过滤的开发者代码
黑客可以直接提交恶意脚本
xss的分类:
- 存储型的xss(stored xss)
- 恶意脚本被存在数据库中
- 其他用户访问页面->读数据=被攻击
- 危害最大,对全部用户可见
eg: 若黑客上传了一个带有xss的视频,那么当其他用户看这个视频的时候,用户就会被这个视频攻击,用户的隐私信息会被盗用,账号也会被盗用
2.反射性xss(Refleted xss)
- 不涉及数据库
- 从url上攻击
eg:
上面是url,下面是服务器代码,服务器代码会读取这个url并且生成HTML片段,如果攻击者把这个字段设计成xss片段,那么当用户访问这个页面的时候就会被攻击
3.DOM攻击(DOM-based xss)
- 不需要服务器的参与
- 恶意攻击的发起+执行,全在浏览器中完成
eg:
环境改变,这里在浏览器中,在浏览器中从url中读取指定的参数,创建指定的html标签,把这个参数对应的值,写到html标签的属性之中 再插入到具体代码中。
4.Reflected与DOM-based的区别
他们完成注入脚本的地方不同,反射性xss在服务端进行注入,Dom xss用浏览器来完成整个闭环
5.基于Mutation类型的攻击(Mutation-based xss)
- 利用了浏览器渲染DOM的特性(独特优化)
- 不同浏览器,会有区别(按浏览器攻击) eg:
在很多浏览器中很多xss过滤中都会吧这段titlt属性当做正常的字符串属性,合法合理,但是如果这段代码放入浏览器中进行渲染,就会得到下面图片的结果
6.跨站伪造请求(CSRF)
- 在用户不知情的前提下
- 利用用户权限
- 构造指定HTTP请求,窃取或修改用户敏感信息
eg:
当用户打开了一个恶意网页,这个恶意页面中攻击者构造了一个http请求,也就是向银行发起了一个转账请求,而这个请求是另外一个域名,银行接到了这个请求,这个请求的cookie正确,那么银行便会同意这个请求,那么用户就损失了一笔财产
常见的伪造请求-GRT请求:
6.注入(Injection)
常见的注入攻击-SQl注入攻击
其他的注入攻击:
- OS command
- Server-Side REquest Forgery(SSRF),服务段伪造请求(严格而言),ssrf不是injection,但是原理类似
二.防御篇
1.xss
- 永远不信任用户提交的内容
- 不要将用户提交的内容直接转换成DOM而是转成String
防御xss的现成工具:
前端:
- 主流框架默认防御xss
- google-closuer-library
服务端(node:
- DOMPurify
2.CSRF
- if 伪造请求=异常来源
- then 限制请求来源 -> 限制伪造请求
- Origin
- 永远请求中,GET+HEAD不发送
- Referer
3.Injection
- 找到项目查询SQL的地方
- 使用 prepared statement
三.事件案例和推荐读物
1.案例事件
npm 博客存档:kik、left-pad 和 npm (npmjs.org)
恶意软件包的事后分析 发布于 2018 年 7 月 12 日 - ESLint - 可插拔 JavaScript Linter
npm 博客存档:有关事件流事件的详细信息 (npmjs.org)
2.推荐读物
Web 应用程序安全:现代 Web 应用程序的利用和对策 第 1 版