WEB安全 | 青训营笔记

139 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第7天

一、本堂课重点内容:

讲述了攻击篇和防御篇的WEB安全相关知识

二、详细知识点介绍:

攻击篇

XSS跨站脚本攻击

XSS=盲目信任用户的提交信息+string->DOM

特点:

  • 难以从UI上感知(暗地执行脚本)
  • 窃取用户信息(cookie/token)
  • 绘制UI(例如弹窗),诱骗用户点击/填写表单

XSS分类

  1. stored XSS
    • 恶意脚本被存在数据库中
    • 访问页面 -> 读数据 === 被攻击
    • 危害最大,对全部用户可见
  2. reflected xss
    • 从URL攻击
  3. DOM-based XSS
    • 不需要服务器的参与,都在浏览器执行
  4. mutation-based XSS
    • 按浏览器区别攻击
CSRF跨站伪造请求

在用户不知情的前提下,利用用户权限(cookie),构造指定HTTP请求,窃取或修改用户敏感信息。

graph TD
恶意页面requestInBackground --请求银行转账的接口,另一个域名--> 有cookie的请求
有cookie的请求 --执行成功,返回结果--> 恶意页面requestInBackground
injection

SQL参数恶意注入

方式:

  • CLI
  • os command
  • Server-Side Request Forgery(SSRF),服务端伪造请求

读取+修改:

  1. 流量转发到真实第三方
  2. 第三方扛不住新增流量
  3. 第三方服务挂断

访问callback可能暴露内网信息

DOS

通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及响应更多请求,导致请求挤压,进而雪崩效应。

正则表达式--贪婪模式

  • 使用'?':一个即可
  • 不使用'?':尽量多

基于正则表达式的DOS:响应时间提升,接口吞吐量降低

DDOS

短时间内,来自大量僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,进而雪崩效应,无法响应新请求。

攻击特点:

  • 直接访问ip
  • 任意API
  • 消耗大量带宽

攻击者发出SYN,服务器返回ACK+SYN,攻击者不返回,没有完成三次握手,不能被释放,达到最大连接数

传输层

中间人攻击:

  1. 明文传输
  2. 信息篡改不可知
  3. 对方身份未验证

防御篇

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">