web开发安全 | 青训营笔记

76 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天

1.重点内容

  • 攻击篇
    • Cross-Site Scripting (XSS) 跨站脚本攻击

2.详细知识

2.1 攻击篇

2.1.1 Cross-Site Scripting (XSS) 跨站脚本攻击

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序 ——百度百科

产生原因

盲目信任用户提交的内容

特点

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

分类

Stored XSS 存储型xss攻击

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

Reflected 反射型xss攻击

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

DOM-based XSS攻击

和Reflected 类似, 区别在于DOM-based是在浏览器端进行脚本注入, reflected 是在服务器端

mutation-bsed xss

  • 利用浏览器渲染DOM的特性
  • 不同浏览器,会有区别 例如:
<noscript><p title="</noscript><img src=x onerror=alert(1)>">

会被渲染成

<div>
    <noscirpt><p title="</noscript>
    <img src="X" onerror="alert(1)">
    "">"
</div>

2.1.2 CSRF 跨站伪造请求

特点

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

QQ截图20230206175244.png

2.1.3 InjectIion 注入

  • 请求携带的参数是一个sql语句
  • 服务器运行SQLcode
  • 实现数据库操作(获取其他数据, 修改数据..)

例子:

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}
    `) 

不仅只限于SQL 可以是命令行, 系统命令, 服务器端的伪造请求

2.1.4 DOS 服务拒绝

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

基于正则的DOS

请求携带参数为

/^((ab)*)+$/

这样服务器就会去重复匹配(回溯请求), 从而消耗服务器的运算资源

distributed DOS 分布式DDOS

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

2.1.5 中间人攻击

你和服务器的通信被转发到了一个“中间人”(恶意 webView, 路由器等),你的所发送给服务器的信息被中间人恶意篡改

2.2 防御篇

2.2. 1 XSS防御

永远不要相信用户的提交内容

不要将用户提交内容转换成DOM

XSS防御框架

  • 前端

    • 主流的默认框架防御 (vue, react)
    • google-closure-library
  • 服务端(node)

    • DOMPurify

如果必须字符串转DOM, 需要预先对字符串进行处理

上传SVG 也要注意里面可能嵌入XSS脚本

尽量不要让用户自定义跳转,

自定义样式也有肯能导入XSS 攻击

2.2.2 CSRF防御

请求头限制

Origin 限制跨域: 同源请求中,GET + HEAD 不发送

Referer

使用token

QQ截图20230206201222.png

iframe攻击

设置: X-Frame-Options:DENY/SAMEORIGIN

2.2.3 Injection 防御

找到SQL的地方, 使用Prepared statement

2.2.5 防御DDOS

QQ截图20230206202917.png

2.2.4 防御中间人

使用HTTPS