Web开发的安全之旅 | 青训营笔记

121 阅读3分钟

Web开发的安全之旅 | 青训营笔记

这是我参与【第四届青训营】笔记创作活动的第5天

一、攻击篇
Cross-Site Scripting(XSS)

Cross-site scripting(XSS)是一种安全漏洞,攻击者可以利用这种漏洞在网站上注入恶意的客户端代码。若受害者运行这些恶意代码,攻击者就可以突破网站的访问限制并冒充受害者

特点:

  • 通常难以从UI上感知
  • 窃取用户信息
  • 绘制UI,诱骗用户点击/填写表单

demo:

public async submit(ctx){
  const {content,id} = ctx.request.body;
  //没有对content过滤
  await db.save({
    content,
    id
  });
}
​
public async render(ctx) {
  const {content} = await db.query({
    id: ctx.query.id
  });
  //没有对content过滤
  ctx.body = `<div${content}</div>`
}

可以直接提交恶意脚本

//提交
fetch("/submit",{
  body: JSON.stringify({
    id: "1",
    content: `<script>alert("xss");</script>`
  });
});
ctx.body = `
  <div>
    <script>alert("xss");</script>
  </div>`;

Stored XSS

  • 恶意脚本被存在数据库中
  • 访问页面——读数据——被攻击
  • 危害最大,全部用户可见

Reflected XSS

  • 不涉及数据库
  • 从URL上攻击

demo:

host/path/?param=<script>alert('123')</script>

public async render(ctx) {
  const {param} = ctx.query;
  ctx.status = 200;
  ctx.body = `<div>${param}</div>;`
}

DOM-based XSS

  • 不需要服务器的参与
  • 恶意攻击的发起 + 执行,全在浏览器完成

demo:

host/path/?param=<script>alert('123')</script>

Browser:

const content = new URL(location.herf).searchParams.get("param");
const div = document.createElement("div");
//恶意脚本注入
div.innerHTML = content;
document.body.append(div);

Reflected和DOM-based XSS的区别

image-20220803100133896

Mutation-based XSS

  • 利用了浏览器渲染DOM的特性(独特优化)
  • 不同浏览器,会有区别

image-20220803100343389

Cross-site request forgery(CSRF)

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

CSRF——GET

<a href="https://bank.com/transfer?to=hacker&amount=100">点我抽奖</a>
<img style="display:none;" src="https://bank.com/transfer?to=hacker&amount=100">

CSRF——beyond GET

<form action="https://bank/transfer_tons_of_money" method="POST">
   <input name="amount" value="10000000000000" type="hidden"></input>
   <input name="to" value="hacker" type="hidden"></input>
</form>
Injection

SQL Injection

image-20220803101229426

  • 读取请求字段
  • 直接以字符串的形式拼接SQL语句
SSRF
  • 请求用户自定义的callback URL
  • web server通常有内网访问权限
public async webhook(ctx) {
  //callback 可能是内网URL
  ctx.body = await fetch(ctx.query.callback);
  //访问callback===暴露内网信息
}
Denial of Service(DoS)

以某种特定请求方式消耗服务器资源,导致请求挤压服务崩溃

ReDos:基于正则表达式的DoS

image-20220803102117471

Logical DoS

  • 耗时的同步操作
  • 数据库写入
  • SQL join
  • 文件备份
  • 循环执行逻辑

image-20220803102237885

Distributed DoS(DDoS)

短时大量僵尸设备请求,服务器不能及时处理,导致请求堆积,服务器崩溃,无法响应新请求

攻击特点:

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

image-20220803102515810

中间人攻击
  • 明文传输
  • 信息篡改不可知
  • 对方身份未验证

image-20220803102636459

二、防御篇
XSS
  • 永远不信任用户提交的内容
  • 不要将用户提交的内容直接转换成DOM

image-20220803102850014

防御工具

前端:

  • 主流框架默认防御XSS
  • google-closure-library

服务器端(Node)

  • DOMPurity

❌❌

  • string -> DOM
  • 上传svg
  • blod动态生成script
  • 自定义跳转链接
  • 自定义样式

防御策略:

Same-origin Policy

image-20220803104344938

Content Security Policy(CSP)

  • 确定源是否安全
  • 来自安全源的脚本执行,否之抛错
  • 禁止eval + inline script
CSRF

image-20220803104641691

image-20220803104702673

Injection
  • 找到项目中查询SQL的地方
  • 使用prepared statement
PREPARE q FROM 'SELECT user FROM users WHERE gender = ?';
SET @gender = 'female';
EXECUTE q USING @gender;
DEALLOCATE PREPARE q;

Injection beyond SQL

  • 最小权限原则

    • ❌sudo || root
  • 建立允许名单过滤

    • ❌rm
  • 对URL类型参数进行协议、域名、ip等限制

    • ❌访问内网
DoS

Regex DoS

  • Code Review
  • 代码扫描,正则性能测试
  • ❌用户提供的正则

Logical DoS

  • 分析代码中的性能瓶颈
  • 限流

DDoS

  • 流量治理

    • 负载均衡
    • API网关
    • CDN
  • 快速自动扩容

  • 非核心服务降级

中间人

使用HTTPS协议

  • 可靠性:加密
  • 完整性:MAC验证
  • 不可抵赖性:数字签名

image-20220803110422302

\