这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天
课程笔记
Web攻击
在Web开发中,安全问题很常见,这些问题都会危害到用户、公司和程序员。
Cross-Site Scripting
跨站脚本攻击(XSS),攻击者通过某些方式将恶意脚本注入到我们的页面当中,用户访问我们的页面的时候这些恶意脚本就会被执行进而完成攻击,造成的后果可能是用户的隐私泄露,也可能会是用户的机器会被利用成挖矿的机器。
XSS攻击方式主要利用了两大部分:
- 开发者盲目信任用户提交的内容。
- 前端工程师把用户提交的字符串直接转换成了DOM。
XSS特点
- 通常难以从UI上获得感知,因为攻击者都是在暗地里执行脚本。
- 窃取用户隐私(cookie/token)。
- 绘制UI(例如弹窗),诱骗用户点击/填写表单等。
XSS demo
该demo就是没有做安全防护的代码,没有对用户提交的内容进行任何的过滤,攻击者就可以通过提交
script标签来进行攻击。
服务器端进行渲染的时候就将攻击者的HTML标签一同渲染就达到了攻击者的目的。
XSS类别
-
Stored XSS
存储型XSS攻击
- 恶意脚本被存在数据库中
- 用户访问页面,服务端写数据给浏览器数据,这个链路完成后就被攻击
- 危害最大,对全部用户可见
-
Reflected XSS
反射型XSS攻击
- 不涉及数据库
- 从URL上攻击,例如在URL中插入脚本代码
-
DOM-based XSS
基于DOM的XSS攻击
- 不需要服务器的参与
- 恶意攻击的发起+执行,全在浏览器完成
-
Mutation-based XSS
- 利用了浏览器渲染DOM的特性(独特优化)
- 不同浏览器会有区别,按浏览器进行攻击
Cross-site request forgery
跨站伪造请求(CSRF),其特点如下:
- 在用户不知情的前提下
- 利用用户权限(比如说cookie)
- 构造指定HTTP的请求,窃取或修改用户敏感信息
demo
用户并没有访问银行页面,但银行页面中的特定接口被恶意请求,并且使用用户的cookie验证通过,接口请求执行成功,用户账户里的欠款就不翼而飞了。
CSRF常见的就是使用GET方法请求,点击a标签或者填写表单后就会使用GET发送请求从而达到攻击的目的。
Injection
注入攻击,最常见的注入攻击就是 SQL Injection ,其具体流程如下:
demo
读取请求字段,直接以字符串的形式拼接SQL语句。
注入攻击不仅有SQL注入,还有CLI(命令行)注入、OS command(系统命令)注入,Server-Side Request Forgery(SSEF)服务端伪造请求,虽然其不属于注入攻击方式,但其原理类似。
SSRF demo:
访问callback === 暴露内网信息
Denial of Service
Dos攻击,即攻击者通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及响应更多请求,导致请求挤压,进而形成雪崩效应。导致无法正常响应请求。
基于正则表达式的Dos
通过正则表达式来进行Dos攻击
通过正则字符串的贪婪匹配模式,攻击者发送容易产生回溯的字符串来进行攻击,导致服务端响应时间大大增加,接口吞吐量大大减少,响应用户的请求次数大大下降。
Distributed Dos
简称DDos,短时间内攻击者构造来自大量僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,进而雪崩效应无法响应新请求。攻击特点:
- 直接访问ip
- 攻击任意API
- 消耗大量带宽(耗尽)
主要攻击手段是利用TCP的三次握手过程来进行攻击
中间人攻击
在浏览器和服务器之间插入一个中间人使得浏览器以为自己在和服务器通信,服务器以为自己在与浏览器通信。
特点:
- 明文传输
- 信息篡改
- 对方身份未验证
Web防御
XSS防御
关键手段:
- 永远不信任用户的提交内容。
- 不要将用户提交内容直接转换成DOM。
现成工具
前端
- 主流框架默认防御XSS
- google-closure-library
服务端(Node)
- DOMPurify
除了字符串等,当用户需要提交富文本(SVG等)时,我们都应对富文本进行扫描,防止攻击者在富文本中插入脚本代码。
Content Security Policy
内容安全策略(CSP),CSP能够允许我们开发者去定义哪些源(或者域名)被认为是安全的,来自安全源的脚本就可以执行,否则直接抛错,对 eval+inline script说不。
可在服务器的响应头部完成CSP
也可以在浏览器meta中完成CSP
CSRF防御
防御手段原理:
使用token方式来防御CSRF,基本模型如下:
- token需要和具体的用户进行绑定才能保证不被攻击者利用。
- token需要有一个过期时间。
我们可以利用HTTP响应头部中的X-Frame-Options来防御iframe攻击,其可选值为DENY和SAMEORIGIN即同源页面的iframe才能进行正常请求。
SameSite Cookie
这是个避免用户信息被携带的方法,其从根源上防御了CSRF攻击。
其限制的是Cookie的Domain属性和当前页面域名是否和页面匹配。
Injection防御
防御的基本原理:
- 找到项目中查询SQL的地方。
- 正确的使用prepared statement语句。
常用的防御措施:
- 最小权限原则
- 所有的命令都不要通过
sudo来执行,不要随便给予root权限。
- 所有的命令都不要通过
- 建立一个白名单机制,只允许指定命令进行执行。
- 对URL类型参数进行协议、域名、IP等限制。
- 禁止访问内网。
Dos防御
防御Regex Dos
- 避免使用贪婪匹配模式
- 使用代码扫描工具扫描代码中存在的正则表达式,对他们进行规整,并进行正则性能测试。
- 拒绝使用用提供的正则表达式
防御DDos
-
流量治理
- 在负载均衡层和API网关层进行流量识别把恶意攻击的流量进行过滤。
- 所有流量都要经过CDN然后再到达具体的服务器。
-
抗量
- 快速自动扩容。
- 非核心服务降能。
中间人攻击防御
最主要的防御手段就是使用HTTPS。HTTPS的特性有:
-
可靠性
使用了加密,避免了明文传输。
-
完整性
具有MAC校验规则,避免了信息被篡改。
-
不可抵赖性
数字签名使通信双方的身份具有可识别性。
HTTPS大致流程:
总结
通过本次课程,大致对Web安全技术有了一定的了解,从Web攻击方式到Wen防御手段,学习到了很多的Web安全知识,在今后的代码开发里我们要多加留意自己所编写的东西是否存在被攻击的可能,多使用Web防御工具来提高项目的安全性。