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

107 阅读2分钟

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

攻击篇

1. Cross-Site Scripting(XSS)

跨站脚本攻击

<script>altert("xss");</script>

xss = 盲目信任用户的提交内容 + 直接把String转为DOM

特点:

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

例子:

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过滤
    // 如果content是xss,就...
    ctx.body=`<div>${content}</div>`
}

1.1 Stored XSS - 存储型XSS

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

1.2 Reflected XSS - 反射型XSS

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

image.png

1.3 DOM-based XSS- 基于Dom的xss

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

image.png

1.4 Reflected vs DOM- based

区别:完成注入脚本的地方:

image.png

1.5 Mutatition-based XSS

  • 利用浏览器渲染DOM的特性(独特优化)
  • 不同浏览器,会有区别(按浏览器进行攻击)
  • 例子(比较难防御):

image.png

2. Cross-site request forgery(CSRF)

  • 在用户不知情的前提下
  • 利用用户权限(cookie)
  • 构造指定HTTP请求,窃取或修改用户敏感信息 例子: image.png
  • 用户没有访问银行页面
  • 银行页面中特定接口被请求
  • 请求执行成功

3. Injection

3.1 SQL Injection 数据库注入

  • 请求: sql 参数(恶意注入)
  • server: 参数->sql,运行sql code
  • 获取其他数据: 修改、删除数据....

例子:

  • 读取请求字段
  • 直接以字符串的形式拼接sQL语句 image.png image.png

Injection 不止于SQL

  • CLI
  • OS command
  • Server-Side Request Forgery(SSRF)服务端伪造请求 -严格而言,SSRF不是injection,但是原理是类似的 SSRF例子:
  • 请求【用户自定义】的callback URL
  • web server 通常有内网访问权限 image.png

4. Denial of Service(DoS)

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

4.1 ReDos: 基于正则表达式的dos

贪婪匹配中出现的回溯

4.2 Logical DoS

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

4.3 Distributed DoS(DDoS)

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

「不搞复杂的,量大就完事儿了」

攻击特点:

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

例子(洪水攻击): image.png

5. 中间人攻击

image.png

  • 明文传输
  • 信息篡改不可知
  • 对方身份未验证

6. 总结

懂得网络攻击的类型很重要!