Web开发中的安全问题(一)| 青训营笔记

96 阅读2分钟

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

一、XSS

跨站脚本攻击(Cross Site Scripting,简称 xss)是最为常见攻击 Web 网站方法,攻击者通过注入非法的 html 标签或者 js 代码,来控制用户浏览器。
原理是攻击者往 Web 页面里插入可执行的网页脚本代码,当用户浏览该页之时,嵌入其中 Web 里面的脚本代码会被执行,从而盗取用户信息或侵犯用户安全隐私image.png

特点

  1. 通常难以从UI上感知(暗地执行脚本)
  2. 窃取用户信息(cookie/token),不经意间帮助攻击者发送恶意请求
  3. 绘制UI(例如alert),诱骗用户点击/填写表单,骗取用户个人信息

xss攻击分类

存储型xss

持久型 XSS 漏洞,一般存在于表单提交等交互功能,入侵者利用 XSS 漏洞,将内容经正常功能提交进入数据库持久保存,当前端页面通过接口获得数据库中的注入代码,将其渲染执行,从而危害用户安全。存储型xss为什么叫存储型,就是因为数据长期存在于数据库中,每次读取数据渲染后都会产生威胁,危害面广且危害最大,对全部用户可见。

graph LR
访问页面 --> 读取数据 --> 被攻击

这其中的漏洞有:

  • post请求后没有转义直接入库
  • 数据库取出数据给前端之前没有转义
  • 前端拿到数据直接渲染,不做处理

反射型xss

一般是通过给别人发送带有参数的 URL, URL 地址被访问时,带有的参数被 HTML 解析、执行。反射型xss不涉及数据库攻击,从URL上进行攻击。
需要诱骗用户点击,反馈率低,较难发现和响应修复。
demo:URL :host/ path/?param=<script>alert('123')</ script>

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

Dom xss

该攻击很大原因是因为客户端脚本处理逻辑导致的安全问题。例如对传入的内容不做筛选,直接作为dom进行插入,而入侵者就可以在传入的内容做手脚。
DOM xss 不需要服务器的参与,恶意的发起加执行,全在浏览器完成。
相同的URL:host/ path/?param=<script>alert('123')</ script>

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

与反射型的XSS对比,反射型的脚本注入是从服务器注入,而DOM XSS是在浏览器就完成注入。

二、CSRF

CSRF(Cross Site Request Forgery),即跨站请求伪造,是一种常见的Web攻击,它利用用户已登录的身份,在用户毫不知情的情况下,以用户的名义,构造指定 HTTP 请求,完成非法操作,窃取或修改用户敏感信息。
受到 CSRF 攻击的要求为:

  • 用户已经登录了站点 A,并在本地记录了cookie
  • 在用户没有登出站点 A 的情况下(也就是 cookie生效的情况下),访问了恶意攻击者提供的引诱危险站点 B (B 站点要求访问站点A)。
  • 站点 A 没有做任何 CSRF 防御

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

三、注入攻击

SQL注入

SQL注入攻击(SQL Injection),被广泛用于非法获取网站控制权,是发生在应用程序的数据库层上的安全漏洞。在设计程序,忽略了对输入字符串中夹带的SQL指令的检查,被数据库误认为是正常的SQL指令而运行,从而使数据库受到攻击,可能导致数据被窃取、更改、删除,以及进一步导致网站被嵌入恶意代码、被植入后门程序等危害。 demo:

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}
    `)
    crx.body = renderForm(result)
}
fetch("/api",{
    method:"POST",
    headers:{
        "Content-Type": "application/json"
    },
    body: JSON.stringily({
        username : "any;DROP TABLE table;",
    })
})

被动删库跑路

其他注入

注入攻击不止SQL,还有:

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