这是我参加「第四届青训营 」笔记创作活动的第五天。 本次课程从两个角度看待了web安全问题:攻击者、防御者
1.攻击
1.1Cross-Site Scripting(XSS)跨站脚本攻击
可能会导致用户隐私泄露 作为开发者盲目的信任用户提交的内容。比如将用户提交的字符串转换为了DOM,会造成XSS攻击。
1.1.1 特点
- 通常很难以UI上感知(暗地执行脚本)
- 窃取用户信息(cooie/token)
- 绘制UI(例如弹窗),诱骗用户点击/填写表单
1.1.2 分类
1.1.2.1 存储型:Stored XSS
-
恶意脚本被存在数据库中
-
访问页面->读数据->被攻击
-
对全部用户可见(危害最大)
比如一个视频网站存在XSS漏洞,在上传视频时插入XSS恶意脚本,当其他用户观看此视频时,信息可能就会被暴露。
1.1.2.2 反射性型:Reflected XSS(服务端)
- 不涉及数据库
- 从URL上攻击
1.1.2.3 DOM:DOM-based XSS(浏览器)
- 不需要服务器的参与
- 恶意攻击的发起+执行,全在浏览器完成
1.1.2.4 Mutation-based XSS(浏览器)
- 利用了浏览器渲染DOM的特性(独特优化)
- 不同浏览器,会有区别(按浏览器进行攻击)
1.2 Cross-site request forgery(CSRF)跨站伪造请求
-
在用户不知情的前提下
-
利用用户权限(cookie)
-
构造指定HTTP请求,窃取或修改用户敏感信息
比如用户收到一封邮件有链接,点击进去之后,访问一个恶意页面,攻击者构造了一个HTTP请求,比如向银行进行转账,而这个请求在另外一个页面,银行有cooiek且通过,就会执行转账接口,用户就会丢失财产。构造HTTP表单即可。
1.3 注入Injection
1.3.1 SQL Injection
假如有一个HTTP请求,SQL参数在请求上载入,然后这段请求载入服务器端,从HTTP上读取参数,构造一个SQL语句,然后运行SQL代码,被执行后导致信息泄露、删除或者修改。
1.3.2 CLI
1.3.3 OS command
1.3.4 Server-Side Request Forgery(SSRF),服务端伪造请求
严格而言,SSRF不是injection, 但是原理类似
1.3.5 Denial of Service(DoS)
通过某种方式(构造特定请求),导致服务器资源被显著消耗, 来不及响应更多请求,导致请求挤压,进而雪崩效应。
ByteDance
1.3.6 Distributed DoS(DDoS)
短时间内,来自大量僵尸设备的请求流量,服务器不能及时完成 全部请求,导致请求堆积,进而雪崩效应,无法响应新请求。 攻击特点
- 直接访问IP
- 任意API
- 消耗大量带宽(耗尽)
1.3.7中间人攻击
在浏览器和服务器中间,中间人可以窃取、修改信息,中间人可以是恶意浏览器、路由器等。 为什么中间人这种形式会发生呢? ①明文传输 ②信息篡改不可知 ③对方身份未验证
2 防御
2.1 XSS
永远不信任用户的提交内容,不要将用户提交内容直接转换成DOM
防御XSS攻击工具:
前端:主流框架(Vue,React)默认防御XSS
一google-closure-library
服务端(Node)
- DOMPurify
当有用户需求,需要动态生成DOM,我们需要注意以下几点:
string->DOM需要将string进行转义
上传svg文件,需要扫描
尽量不要做自定义跳转链接
自定义样式
2.2插播:Sanme-origin Policy 同源策略
协议、域名、端口相等
2.3 Content Security Policy(CSP)内容安全策略
开发者确定哪些源是安全的,安全源的脚本可以执行否则报错
2.4 CSRF的防御
2.5 SanmeSite Cookie避免用户信息被携带
有一个页面对应的cookie是A,则所有domain属性是A的cookie为第一方Cookie,其他的为第三方Cookie。向域名A发送请求时第一方的Cookie被成功带上,第三方不会带给域名A 的服务器(默认行为)
如果依赖第三方Cookie
2.6注入防御
- 找到项目中查询SQL的地方
- 使用prepared statement
2.7其他注入
- 最小权限原则:sudo|l root
- 建立允许名单+过滤:rm
- 对URL类型参数进行协议、域名、ip等限制:访问内网
2.8防御Dos
- 避免写贪婪模式
- 代码扫描+正则性能测试
- 拒绝用户提供的使用正则
2.9 DDoS
2.10防御层
HTTPS
- 可靠性:加密,避免明文传输
- 完整性: MAC验证,没有被篡改
- 不可抵赖性:数字签名,身份认证
2.11 SRI
静态资源被劫持篡改,在script标签上添加integrity属性(hash)
3总结
开发安全是必须的,在开发安全上还有许多更深的内涵,需要进一步了解。