这是我参与【第四届青训营】笔记创作活动的第6天,今天学习了 Web 安全 的一些知识点
1. 两个角度看 Web 安全
- 假如你是一个
hacker—— 攻击 - 假如你是一个
开发者—— 防御
2. 攻击篇
2.1 Cross-Site Scripting(XSS)
2.1.1 介绍:
跨站脚本攻击(也称为XSS)指利用网站漏洞从用户那里恶意盗取信息。
2.1.2 攻击分类:
人们经常将跨站脚本攻击(Cross Site Scripting)缩写为CSS,但这会与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆。因此有人将跨站脚本攻击缩写为XSS。如果你听到有人说 “我发现了一个XSS漏洞”,显然他是在说跨站脚本攻击。
2.1.3 危害:
为了搜集用户信息,攻击者通常会在有漏洞的程序中插入 JavaScript、VBScript、 ActiveX或Flash以欺骗用户(详见下文)。一旦得手,他们可以盗取用户帐户,修改用户设置,盗取/污染cookie,做虚假广告等。每天都有大量的XSS攻击的恶意代码出现。 Brett Moore的下面这篇文章详细地阐述了“拒绝服务攻击”以及用户仅仅阅读一篇文章就会受到的“自动攻击”。
三部曲
-
1.HTML注入。所有HTML注入范例只是注入一个JavaScript弹出式的警告框:alert(1)。
-
2.做坏事。如果您觉得警告框还不够刺激,当受害者点击了一个被注入了HTML代码的页面链接时攻击者能作的各种的恶意事情。
-
3.诱捕受害者。
2.1.4 XSS 主要利用了
过分相信用户的提交内容
2.1.5 XSS 的一些特点
2.1.6 示例代码
示例一:
对于这段代码,用户可以直接提交恶意脚本
2.1.7 Stored XSS(存储型 XSS)
相比较于反射型XSS漏洞,存储型XSS影响更加持久,如果加入的代码没有进行过滤或者过滤不完善,那么这些代码将存储到服务器中,用户访问该页面的时候就会触发代码执行。这种情况 XSS 比较危险,容易造成蠕虫、盗窃Cookie等
2.1.8 Reflected XSS(反射型 XSS)
- 不涉及数据库
- 在 URL 上进行攻击
例如:
上述 URL 中就被参入了一个 恶意脚本 alert
假如我们在处理 query 的时候没有进行任何过滤操作,如下:
这里直接将 query 参数当做 DOM 渲染,这是十分危险的,因此我们在考虑 XSS 的时候一定要做好过滤操作
2.1.9 DOM-based XSS(反射型 XSS)
通过修改页面的
DOM节点形成的XSS,称之为DOM Based XSS。
示例:
Browser
和 Reflected XSS 的方式差不多
2.1.10 Reflectd vs DOM-based
由上图可以看到:差异点在于 完成注入脚本的地方 不同
2.1.11 Mutation-based XSS
有一些 了解浏览器的 hacker 会针对 不同的浏览器 进行攻击
补充知识:
<noscript>: The<noscript>tag defines an alternate content to be displayed to users that have disabled scripts in their browser or have a browser that doesn't support script.中文含义为:
标签定义了一个替代内容,该内容将显示给在浏览器中禁用脚本或浏览器不支持脚本的用户。
2.2 Cross-site request forgery(CSRF)
2.2.1 介绍
CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。
2.2.2 CSRF 可以做哪些事情
攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账等
造成的问题包括:个人隐私泄露以及财产安全。
2.2.3 CSRF 的原理
先来看一张图
网站是通过
cookie来实现登录功能的。而cookie只要存在浏览器中,那么浏览器在访问这个cookie的服务器的时候,就会自动的携带cookie信息到服务器上去。那么这时候就存在一个漏洞了,如果你访问了一个别有用心或病毒网站,这个网站可以在网页源代码中插入js代码,使用js代码给其他服务器发送请求(比如ICBC的转账请求)。那么因为在发送请求的时候,浏览器会自动的把cookie发送给对应的服务器,这时候相应的服务器(比如ICBC网站),就不知道这个请求是伪造的,就被欺骗过去了。从而达到在用户不知情的情况下,给某个服务器发送了一个请求(比如转账)
2.2.4 示例
- 用户 没有 访问银行页面
- 银行页面中的特定 接口被请求
- 请求 执行成功
2.2.5 GET
2.3 SQL Injection( SQL 注入 )
2.3.1 介绍
SQL注入即是指 web应用程序 对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的 SQL语句 ,在管理员不知情的情况下实现非法操作,以此来实现欺骗 数据库服务器 执行非授权的任意查询,从而进一步得到相应的数据信息。
2.3.2 原理
2.3.3 demo1
上述代码做了两件事
- 读取请求字段
- 直接 以字符串的形式拼接 SQL 语句
假如我们请求的时候发了以下参数
传递完,直接达成成就 删库跑路
2.3.4 demo2
和上述 demo1 一个道理
2.4 Server-Side Request Forgery( SSRF )
2.4.1 介绍
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造,由服务端发起请求的一个网络攻击,一般用来在外网探测或攻击内网服务,其影响效果根据服务器用的函数不同,从而造成不同的影响。
SSRF 形成的原因大都是由于服务端提供了从其他服务器获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。
攻击的数据流为:攻击者 -> 服务器 -> 目标主机
2.4.2 ssrf 原理
- 内外网的端口和服务扫描
- 主机本地敏感数据的读取
- 内外网主机应用程序漏洞的利用
- 内外网Web站点漏洞的利用
- ......
2.4.3 demo
上述代码中我们做了两件事:
- 请求【用户自定义】的
callbackURL web server通常有内网访问权限
2.5 Denial of Service( DoS )
2.5.1 介绍
通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及响应更多请求,导致请求挤压,进而产生雪崩效应
2.5.2 关于正则表达式的贪婪模式
重复匹配时,[?] vs [no ?] :满足 “一个” 即可 vs 尽量多
2.5.3 ReDoS: 基于正则表达式的 DoS
由此可知:过于贪婪的正则表达式可能会造成系统响应时间过长,从而导致瘫痪。
2.5.4 Logical DoS
2.5.5 Logical DoS Demo
2.6 Distributed DoS( DDoS )
2.6.1 介绍
短时间内,来自大量僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,进而发生雪崩效应,无法响应新请求
2.6.2 攻击特点
2.6.3 DDoS Demo
2.7 中间人攻击
2.7.1 介绍
中间人攻击(Man-in-the-MiddleAttack,简称“MITM攻击”)是一种“间接”的入侵攻击,这种攻击模式是通过各种技术手段将受入侵者控制的一台计算机虚拟放置在网络连接中的两台通信计算机之间,这台计算机就称为“中间人”。
上图中
- 明文传输
- 信息篡改不可知
- 对方身份未验证
3. 防御篇
3.1 XSS
上文中,我们知道 XSS 主要是由 用户恶意输入 才会导致的,所以,我们应该
- 永远不要相信用户的提交内容
- 不要将用户提交的内容 直接 转换为 DOM
3.1.1 现成工具
在我们前端开发中,像 Vue, React 这样的框架都是默认防御 XSS 的
3.1.2 令人血压升高的需求
存在【用户需求】:必须动态生成 DOM,那么我们一定要做好过滤操作。。
3.1.3 string -> DOM
可以通过 new DOMPasrer() 来操作
3.1.4 上传 svg
3.1.5 Blob 动态生成 script
3.1.6 自定义跳转链接
3.1.7 自定义样式
3.2 CSRF
3.2.1 token
- 用户绑定:攻击者也可以是 注册用户 === 可以获取自己的
token - 过期时间:【前向保密】
3.2.2 iframe
3.2.3 anti-pattern
GET !== GET + POST
3.3 避免用户信息被携带:SameSite Cookie
3.3.1 依赖 Cookie 的第三方服务怎么办?
内嵌一个 X 站播放器,识别不了用户登录态,发不了弹幕
3.3.2 SameSite vs CORS
3.3.3 SameSite demo
3.4 防御 CSRF 的正确姿势
3.5 Injection
3.5.1 针对 Injection beyond SQL
3.6 防御 DoS
3.6.1 Regex DoS
3.6.2 Logical DoS
3.7 DDoS
3.8 传输层————防御中间人
3.9 HTTPS 的一些特性
3.9.1 TLS 握手
3.9.2 完整性
扩展:数字签名
3.9.3 HTTPS 中的数字签名
CA: Centificate Authority 证书机构
数字签名在 HTTPS 中的工作
3.9.4 证书 续
关于证书的一个 Demo
3.9.5 成也证书,败也证书
当签名算法不够健壮时:
3.9.6 Strict-Transport-Security( HSTS )
将 HTTP 主动升级到 HTTPS
3.10 Subresource Integrity( SRI )
静态资源被劫持篡改? 对比 hash
3.10.1 Demo
标签 hash( 原始内容 hash ) vs 实际内容 hash
总结
今天写了好多的内容,这些安全知识在我们日常开发中一定要特别重视,出现危害的话后果是十分严重的,我们还是要不断学习知识,丰富自己的开发经验和提高安全意识。