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

44 阅读2分钟

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

安全问题很常见,会危害用户、公司、程序员

  1. 攻击
  2. 防御

攻击

XSS——Cross-Site Scripting 跨站脚本攻击

主要利用了盲目信任用户的提交内容

特点

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

XSS 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: "I",
        content: `<script>alert("xss");</script>`
    });
});
ctx.body = `
	<div>
		<script>alert("xss");</script>
	</div>`;

XSS按性质可以分为几类:

  • 存储型XSS攻击——Stored XSS

    • 恶意脚本被存在数据库中
    • 访问页面→读数据 ≡ 被攻击
    • 危害最大,对全部用户可见
  • 反射型XSS攻击——Reflected XSS

    • 不涉及数据库
    • 从 URL 上攻击
  • DOM-based XSS Demo

Reflected vs DOM-based

完成注入脚本的地方不一样

Reflected在服务端进行注入

DOM完全在浏览器这一侧完成整个闭环

  • Mutation-based XSS
    • 利用了浏览器渲染DOM的特性(独特优化)
    • 不同浏览器,会有区别(按浏览器进行攻击)

CSRF——Cross-site request forgery 跨站伪造请求

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

CSRF demo

  1. 用户没有访问银行页面
  2. 银行页面中的特定接口被请求
  3. 请求执行成功

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

image-20220801220439879

Injection

SQL Injection

image-20220801220705596

Injection 不止于 SQL

  • CLI
  • OS command
  • Server-Side Request Forgery(SSRF),服务端伪造请求
    • 严格而言, SSRF 不是 injection,但是原理类似

DoS——Denial of Service

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