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

59 阅读3分钟

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

本节课主要讲解Web安全,分为两个部分。

作为一个hacker--攻击者

作为一个开发者--防御

那接下来我们先从攻击者的方面入手

攻击篇

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

XSS主要利用盲目信任使用者提交的内容,将恶意脚本放进我们使用的页面,还有另外一种方式是我们直接将字符串读出来生成dom结构

1659331309177.png

XSS的一些特点

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

Stored XSS(储存型XSS)

存储型XSS有以下几个特点

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

Reflected XSS(反射型XSS)

DOM-based XSS(基于DOM的XSS攻击方式)

  • 不需要服务器的参与

  • 恶意攻击的发起+执行,全在浏览器完成

mutation-based XSS(基于mutation的XSS攻击)

  • 利用了浏览器渲染DOM的特性(独特优化)

  • 不同浏览器,会有区别(按浏览器进行攻击)

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

在用户不知情的前提下

利用用户权限(cookie)

构造指定的HTTP请求,窃取和修改用户敏感信息

CSRF demo

1659332355166.png

CSFR--GET(构造get请求)

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

CSRF-beyond GET(构造post请求)

攻击者可以伪造form表单发送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>

Injection(注入攻击)

注入攻击,尤其是SQL注入(SQLi攻击) 和跨站(xss),它们不仅危险并且普遍,特别是遗留在程序里面,还有许多种类的注入攻击,像代码注入、CRLF注入、Email头注入......

比如SQL注入攻击:攻击者注入sql语句来读取和修改数据 库数据,在高级sql注入案例中,攻击者能执行sql语句写服务器上的任意文件和甚至执行系统命令,这会导致系统沦丧

image.png

防御篇

XSS

xss的防御方法核心理念:

  1. 永远不信任用户提交的内容
  2. 永远不会把用户提交的东西直接转成DOM

如果用户硬要生成动态DOM树,以下方法可能会有所帮助 1.对用户上传的string进行过滤

2.用户上传svg,对svg进行过滤

3.用户自定义的链接,a标签一定要慎重,最好不要让用户可以自定义链接

4.自定义的样式要慎重,因为background中也可以嵌套URL

Content Security Police(CSP)

image.png

只允许加载同源的所有资源

default-src 'self';

支持*号匹配

default-src 'self' https://.ccc.com:;

只允许加载同源的脚本

script-src 'self';

只允许加载同源的和www.ccc.com的脚本

script-src 'self' www.ccc.com;

CSRF的防御

csrf是通过伪造请求,那么我们可以通过限制请求来进行防御

image.png

image.png

token

Token,就是令牌,最大的特点就是随机性,在访问网站时,登录账号密码时,网站会返回一个标志性令牌,token,让黑客和其他垃圾网站猜不出来,提高了安全性

image.png

总结

  • 安全无小事

  • 使用的依赖(npm package,甚至是NodeJS)可能成为最薄弱的环节

    • left-pad事件
    • eslint-scope事件
    • event-stream事件
  • 保持学习心态