web开发安全- 攻击篇|青训营

90 阅读2分钟

攻击篇

假如你是一个hacker——攻击者

1. 跨站脚本攻击:Cross-Site Scripting(XSS)

xss主要攻击方式是想方设法的把恶意的脚本语言放进我们的页面中。

image.png

image.png

1.1. XSS 攻击条件

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

  • string -> DOM ( 直接把字符串读出来生成dom结构 )

    • document.write

    • element.innerHTML = anyString

    • SSR(user_data) // 伪代码

1.2. XSS 攻击特点

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

1.3. 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>`
}

这个demo是模仿接受用户请求,然后把用户请求的内容存进数据库中,render接口是从数据库中读取内容,返回给HTML

这两次操作都没有对用户提交的内容进行任何过滤。

如果我是攻击者,就可以在我提交的内容content中做手脚。

//提交的时候
fetch("/submit",{
    body:JSON.stringfy({
        id:"1",
        content:`<script>alert("XSS");</script>`
    })
})
​
//读取
ctx.body = `
    <div>
        <script>alert("XSS");</script>
    </div>
`

那么数据把我的content内容返给HTML的时候,页面就会出现“XSS”的弹窗。

这就是最简单的XSS的攻击方式。

1.4. 分类

类别特点举例
Stored XSS1. 恶意脚本被存在数据库中 2. 访问页面 -> 读数据 === 被攻击 3. 危害最大,对全部用户可见某个视频网站存在XSS漏洞,某人上传一段视频,之中插入一段XSS恶意脚本,之后所有观看该视频的用户都会被XSS攻击
Reflected XSS1. 不涉及数据库 2. 从 URL 上攻击image.png image.png
Dom-based XSS1. 不需要服务器的参与 2. 恶意攻击的发起+执行,全在浏览器完成image.png image.png
Mutation-based XSS1. 利用了浏览器渲染 DOM 的特性(独特优化) 2. 不同浏览器,会有区别(按浏览器进行攻击)image.png 以上HTML片段在Chrome浏览器中渲染为如下: image.png
  • Reflected XSS与Dom-based XSS完成注入脚本的地方:

image.png

2. 跨站伪造请求:Cross-site request forgery(CSRF)

实际上就是用户不知情的情况下,利用用户的权限,伪造用户请求来窃取或者修改用户的敏感信息。

image-20210906120009274.png

举个栗子:

假如有一封垃圾邮件或者垃圾短信,里面有一个恶意链接B,点进去之后,恶意的页面B里面包含了一个请求A,这时候虽然你没有点击请求A,但是B会自动帮你请求,这时候A请求就会带着你进入到B页面的cookie等个人信息,从而达到访问A服务器的目的

image-20210906120420258.png

所以所有的未知的链接一定要慎点,即使你想着你就进去看看,不乱点,也会在不知情的情况下被窃取信息访问别的服务器。

2.1. 特点

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

2.2. 构造get请求(CSRF-GET)

<a href = "https://blank.com/transfer?to=hacker&amount=100">点我抽奖</a>

上面这个主动的请求,需要用户主动点击;下面这个就是在用户访问页面的时候就会自动发起的请求,攻击者创建一个看不见的img标签,img的src属性就是恶意请求,从而达到用户一访问页面就会发送请求的目的

<img style = "dispaly:none" src="https://blank.com/transfer?to=hacker&amount=100" />

2.3. 构造post请求(CSRF-beyond GET)

攻击者可以伪造form表单发送post请求,从post发送任何自己想要发送的数据

<form action = "https://blank.com/transfer?to=hacker&amount=100" method="POST">
    <input name="amount" value="10000000000" type="hidden">
    <input name="to" value="hacker" type="hidden">
</form>

3. 注入:Injection

3.1. SQL Injection

注入攻击一般是sql注入,在请求上会有sql的参数,这个参数就会被攻击者利用.

image.png

举个栗子:

这是一个服务端接口,服务端接口会从请求中读取字段,以字符串的形式拼接到sql查询语句

public async renderForm(ctx) {
    const { username,form_id } = ctx.query
    const result = await sql.query(`
        SELECT a, b c FROM table
        WHERE username = ${username}
        AND form_id = ${form_id}
    `)
    ctx.body = rederForm(result)
}

攻击者可以构造一个请求,传递一个username,username的内容可以是任意字符串,下面这个就能达到删库的目的

image-20210906133858193.png

3.2. 不止于SQL

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

4. 服务拒绝:Denial of Service(DoS)

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

  1. 特点

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

类别特点举例
ReDoS:基于正则表达式的 DoS
Logical DoS1. 耗时的同步操作 2. 数据库写入 3. SQL join 4. 文件备份 5. 循环执行逻辑image.png
Distributed DoS(DDoS)短时间内,来自大量僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,进而雪崩效应,无法响应新请求(不搞复杂的,量大就完事儿了) 1. 直接访IP 2. 任意API 3. 消耗大量带宽(耗尽)image.png

5. 中间人攻击

造成原因:

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