这是我参与「第四届青训营 」笔记创作活动的第7天
一、本堂课重点内容:
讲述了攻击篇和防御篇的WEB安全相关知识
二、详细知识点介绍:
攻击篇
XSS跨站脚本攻击
XSS=盲目信任用户的提交信息+string->DOM
特点:
- 难以从UI上感知(暗地执行脚本)
- 窃取用户信息(cookie/token)
- 绘制UI(例如弹窗),诱骗用户点击/填写表单
XSS分类
- stored XSS
- 恶意脚本被存在数据库中
- 访问页面 -> 读数据 === 被攻击
- 危害最大,对全部用户可见
- reflected xss
- 从URL攻击
- DOM-based XSS
- 不需要服务器的参与,都在浏览器执行
- mutation-based XSS
- 按浏览器区别攻击
CSRF跨站伪造请求
在用户不知情的前提下,利用用户权限(cookie),构造指定HTTP请求,窃取或修改用户敏感信息。
graph TD
恶意页面requestInBackground --请求银行转账的接口,另一个域名--> 有cookie的请求
有cookie的请求 --执行成功,返回结果--> 恶意页面requestInBackground
injection
SQL参数恶意注入
方式:
- CLI
- os command
- Server-Side Request Forgery(SSRF),服务端伪造请求
读取+修改:
- 流量转发到真实第三方
- 第三方扛不住新增流量
- 第三方服务挂断
访问callback可能暴露内网信息
DOS
通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及响应更多请求,导致请求挤压,进而雪崩效应。
正则表达式--贪婪模式
- 使用'?':一个即可
- 不使用'?':尽量多
基于正则表达式的DOS:响应时间提升,接口吞吐量降低
DDOS
短时间内,来自大量僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,进而雪崩效应,无法响应新请求。
攻击特点:
- 直接访问ip
- 任意API
- 消耗大量带宽
攻击者发出SYN,服务器返回ACK+SYN,攻击者不返回,没有完成三次握手,不能被释放,达到最大连接数
传输层
中间人攻击:
- 明文传输
- 信息篡改不可知
- 对方身份未验证
防御篇
XSS
永远不要相信用户的提交内容,不要转换成DOM
主流框架默认防御XSS
用户请求必须动态生成DOM,要转移,要扫描SVG,不要让用户自定义跳转链接,不要让用户自定义样式。
SOP:同源策略
协议,域名,端口都要相等。跨域往往不可行
CSP内容安全策略
哪些源被认为是安全的
CSRF的防御
if 伪造请求===异常来源 then 限制请求来源 -> 限制伪造请求 origin,同源请求中,GET+HEAD不发送 referer
token:用户绑定:攻击者也可以是注册用户===可以获取自己的token 过期时间:前向保密
X-Frame-Options: DENY/SAMEORIGIN
GET!=GET+POST
samesite cookie
domain是A,=第一方cookie,不是A就是第三方,不会被带上
有第三方服务: Set-Cookie:SameSite=None;Secure;
Injection
最小权限原则,建立允许名单+过滤,对URL参数修改
DOS
code review,代码扫描,拒绝用户的正则
DDOS
过滤/抗量
传输层
https:
- 可靠性:加密
- 完整性:MAX验证(加密信息与哈希对比)
- 不可抵赖性:数字签名(CA:证书机构)
HSTS
将http主动升级到https
SRI
CDN被篡改,对比原来hash和实际的hash
三、实践练习例子:
XSS
public async submit(ctx){
const {content,id} = ctx.request.body;
await db.save({
content,
id
});
}
public async render(ctx){
const {content} = await db.query({
id: ctx.query.id
});
ctx.body='<div>${content}</div>';
}
fetch("/submit",{
body:JSON.stringify({
id:"1",
content:'<script>alert("xss");</script>'
});
});
CSP
Content-Security-Policy: script-src 'self'
<meta http-equiv="Content-Security-Policy" content="script-src self">