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

160 阅读4分钟

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

安全问题“很常见”,发生安全事故会危害,用户,公司,程序员

两个角度看web安全:

  • 假如你是一个hacker--攻击
  • 假如你是一个开发者--防御

一.攻击篇

Cross-Site Scripting(xss)--跨栈脚本攻击 在网页中攻击者通过一种方式把恶意脚本注入进来当用户访问页面,脚本就会被运行,用户信息就会被监控,用户电脑会被控制

1.xss主要利用了:

  • 作为开发者,盲目信任用户提交的内容
  • 作为开发者,直接将用户提交的字符串转化为了demo
xss= string->Dom
 -document.write
 -element.innerHTML=anyString
 -SSR(user_data) // 伪代码 

xss的一些特点:

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

eg: 没有进行过滤的开发者代码 image.png

黑客可以直接提交恶意脚本

1659284444384.png

xss的分类:

  • 存储型的xss(stored xss)
  • 恶意脚本被存在数据库中
  • 其他用户访问页面->读数据=被攻击
  • 危害最大,对全部用户可见

eg: 若黑客上传了一个带有xss的视频,那么当其他用户看这个视频的时候,用户就会被这个视频攻击,用户的隐私信息会被盗用,账号也会被盗用

2.反射性xss(Refleted xss)

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

eg:

1659284853843.png

上面是url,下面是服务器代码,服务器代码会读取这个url并且生成HTML片段,如果攻击者把这个字段设计成xss片段,那么当用户访问这个页面的时候就会被攻击

3.DOM攻击(DOM-based xss)

  • 不需要服务器的参与
  • 恶意攻击的发起+执行,全在浏览器中完成

eg:

1659285155576.png

环境改变,这里在浏览器中,在浏览器中从url中读取指定的参数,创建指定的html标签,把这个参数对应的值,写到html标签的属性之中 再插入到具体代码中。

4.Reflected与DOM-based的区别

他们完成注入脚本的地方不同,反射性xss在服务端进行注入,Dom xss用浏览器来完成整个闭环

1659287472727.png

5.基于Mutation类型的攻击(Mutation-based xss)

  • 利用了浏览器渲染DOM的特性(独特优化)
  • 不同浏览器,会有区别(按浏览器攻击) eg:

1659287650634.png

在很多浏览器中很多xss过滤中都会吧这段titlt属性当做正常的字符串属性,合法合理,但是如果这段代码放入浏览器中进行渲染,就会得到下面图片的结果

6.跨站伪造请求(CSRF)

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

eg:

1659288035780.png

当用户打开了一个恶意网页,这个恶意页面中攻击者构造了一个http请求,也就是向银行发起了一个转账请求,而这个请求是另外一个域名,银行接到了这个请求,这个请求的cookie正确,那么银行便会同意这个请求,那么用户就损失了一笔财产

常见的伪造请求-GRT请求:

1659288312728.png

6.注入(Injection)

常见的注入攻击-SQl注入攻击

1659288467264.png

其他的注入攻击:

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

二.防御篇

1.xss

  • 永远不信任用户提交的内容
  • 不要将用户提交的内容直接转换成DOM而是转成String

防御xss的现成工具:

前端:

  • 主流框架默认防御xss
  • google-closuer-library

服务端(node:

  • DOMPurify

2.CSRF

  • if 伪造请求=异常来源
  • then 限制请求来源 -> 限制伪造请求
  • Origin
  • 永远请求中,GET+HEAD不发送
  • Referer

3.Injection

  • 找到项目查询SQL的地方
  • 使用 prepared statement

三.事件案例和推荐读物

1.案例事件

npm 博客存档:kik、left-pad 和 npm (npmjs.org)

恶意软件包的事后分析 发布于 2018 年 7 月 12 日 - ESLint - 可插拔 JavaScript Linter

npm 博客存档:有关事件流事件的详细信息 (npmjs.org)

2.推荐读物

Web 应用程序安全:现代 Web 应用程序的利用和对策 第 1 版

SameSite 那些事 | 怡红院落 (imnerd.org)

关于 Web 安全突然想到的 ·第32期 ·安格斯福/日记 (github.com)