说明
这是我参与「第四届青训营 」笔记创作活动的第1天。
在web开发中,可能会出现各种各样的安全问题。如果不加以防范,有可能造成很严重的后果,本文将介绍web开发中常见的各种安全问题以及如何防范。
本文将介绍的安全问题包括:
- Cross-Site Scripting(XSS)
- Stored XSS
- Reflected XSS
- DOM-based XSS
- Mutation-based XSS
- Cross-site request forgery(CSRF)
- SQL Injection
- Server-Side Request Forgery(SSRF )
- Denial of Service(DoS)
- ReDoS:基于正则表达式的DoS
- Logical DoS
- Distributed DoS(DDoS)
- 中间人攻击
1. XSS
全称 Cross-Site Scripting,也叫跨站点脚本攻击。
XSS的特点:
- 难以从 UI 上感知(暗地里执行脚本)。
- 窃取用户信息(cookie / token)。
- 绘制 UI (例如弹窗),诱骗用户点击/填写表单。
XSS主要利用了:
其他类型的XSS攻击
Stored XSS(存储型)
- 恶意脚本被存在数据库中。
- 访问页面 -> 读数据 == 被攻击。
- 危害最大,对全部用户可见。
Reflected XSS(反射性)
- 不涉及数据库。
- 从URL上攻击。
DOM-based XSS(基于DOM型)
- 不需要服务器的参与。
- 恶意攻击的发起+执行,全部在浏览器完成。
Mutation-based XSS
- 利用了浏览器渲染DOM的特性(独特优化)
- 不同浏览器,会有区别(按浏览器进行攻击)
如何防御?
- 永远不信任用户提交的内容。
- 永远不能将用户提交的内容直接转换成 DOM。
防御——现成工具
前端
- 主流框架默认防御 XSS
- google-closure-library
服务端
- DOMPurify
2. CSRF
全称 Cross-site request forgery,跨站请求伪造。
在用户不知情的前提下,利用用户权限(cookie),构造指定 HTTP 请求,窃取或修改用户敏感信息。
CSRF demo
GET请求:
POST请求:
3. SQL Injection
SQL注入,读取请求字段,直接以字符串的形式拼接 SQL 语句。
流程如下:
SQL injection demo
如何防御SQL注入?
-
最小权限原则。
- suto || root
-
建立允许名单 + 过滤。
- rm
-
对 URL 类型参数进行协议、域名、ip等限制。
- 访问内网
其他 Injection
- CLI:命令行攻击。
- OS command:操作系统命令攻击。
- Server-Side Request Forgery(SSRF):服务器端的伪造请求,严格来说SSRF不是injection,但原理类似。
3. DoS
全称 Denial of Service,服务拒绝。
通过某种方式(构造特定请求) ,导致服务器资源被显著消耗,来不及响应更多请求,导致请求挤压,进而雪崩效应。
- ReDos:基于正则表达式的 Dos,当服务端采用贪婪匹配时,😈传入一个可回溯的字符串,导致服务器响应时间延长,导致响应用户次数降低。
-
Logical Dos:
-
耗时的同步操作。
-
数据库写入。
-
SQL join。
-
文件备份。
- 循环执行逻辑。
-
如何防御?
-
Regex DoS
- 代码扫描 + 正则性能测试
-
logical DoS
-
有些案例只有在请求量达到一定之后,才会体现。
-
分析代码中的性能瓶颈
- 同步调用
- 串行调用
- CPU 密集型操作
-
限流
-
4. DDoS
短时间内,来自大量僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,进而雪崩效应,无法响应新请求。
攻击特点:
- 直接访问IP。
- 任意 API。
- 消耗大量带宽(耗尽)
SYN flood demo
如图,攻击者创建大量SYN给服务器,服务器会返回ACK和SYN,但攻击者此时不会返回第三次ACK,导致第三次握手未完成,连接数不能被释放,等服务器达到最大连接次数,所有的新请求都无法响应,完成一次洪水攻击。
如何防御?
5. 基于传输层进行攻击
中间人攻击
特点:
- 明文传输。
- 信息篡改不可知。
- 对方身份未验证。
流程如下图:
如何防御?
HTTPS的一些特性
- 可靠性:加密
- 完整性:MAC验证
- 不可抵赖性:数字签名
HTTPS 可靠性:TLS 握手
HTTPS 完整性
HTTPS 不可抵赖性:数字签名
总结
冲浪需谨慎,莫点毒链接。
开发不规范,亲人两行泪。