来一场Web开发的安全之旅,看看hacker是怎么攻击你的 | 青训营笔记

143 阅读4分钟

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

从两个角度看Web安全

一、hacker——攻击

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

在安全内容里注入

<script>alert("xss");</script>

作为开发者来看,XSS主要利用了两点

  • 盲目信任用户的提高的内容
  • 将string->DOM

XSS的三个特点

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

用户可能的造成后果:

  • 隐私泄露
  • 机器被利用

我们用一个小demo来认识XSS:

image.png

image.png

XSS分类:

  • Stored XSS:
  1. 恶意脚本被存在数据库中;
  2. 访问页面->读数据=被攻击;
  3. 危害最大,对全部用户可见
  • reflected XSS:
  1. 不涉及到数据库
  2. url上攻击
host/path/?param=<script>alert('123')</script>

image.png

  • DOM-based XSS:
  1. 不需要服务器的参与
  2. 恶意攻击发起+执行,全在浏览器完成 用的url相同:
host/path/?param=<script>alert('123')</script>

image.png

  • Mutation-based XSS:
  1. 利用了浏览器渲染DOM的特性(独特优化)
  2. 不同浏览器,会有区别(按浏览器进行攻击)

image.png

可能有人会分不清Relected和DOM-based,让我们看看他们的不同

image.png

跨站轨道请求Cross-site request forgery(CSRF)

CSRF的特点

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

看一个日常会看到的安全问题————银行卡里莫名就少了一大笔钱

image.png

  • CSRF--GET image.png

  • CSRF--beyond GET image.png

Injection

  • SQL Injection: image.png

当你读取请求字段,直接以字符串形式拼接SQL语句时,发现被动删库了! image.png

还有CLI、OS command、Server-Side Request Forgery等,感兴趣可以去了解啦

服务拒绝Denial of Service(Dos)

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

  • ReDos:基于正则表达式的DoS image.png 导致响应时间不断增加接口吞吐量不断减少

  • DDoS(Distributed DoS)

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

攻击特点: 直接访问IP;任意API;消耗大量带宽(耗尽)

image.png

传输层:

中间人攻击:利用明文传输;信息篡改不可知;对方身份未验证

对于开发者——防御

对于XSS:

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

在前端怎么解决?

  • 主流框架(vue、react):默认防御XSS,google-closure-library
  • 服务端(Node):DOMPurify,完成字符串的转译

如果一定要转为DOM,注意

  1. 如果是string->DOM,并调用DOMParser API,一定要将string进行转译
  2. 上传svg时,对svg进行扫描检查
  3. 不要让用户自定义跳转链接,要的话进行检查
  4. 对于自定义样式
image.png

SOP(Same-origin Policy):协议、域名、端口相同,进行HTTP请求时同源可以,跨域得看服务器的设置啦

CSP:

  • 可以定义哪些源(域名)被认为时安全的
  • 来自安全源的脚本可以执行,否则直接抛错
  • 对 eval+inline srcipt直接说no

防御模式:

image.png

image.png

image.png

对iframe攻击:

image.png

ani-pattern:要知道GET!=GET+POST

避免用户信息被携带:SmaeSite Cookie 限制的是Cookie domain和页面域名 image.png

问题来了--依赖Cookie的第三分服务怎么办?(内嵌一个x站播放器,识别不了用户登录态,发不了弹幕)

Set-Cookie: SameSite=Node;Secure;

让我们对比一下SameSite和Cors:

image.png

Injection :

  • Injection SQL: 找到项目中使用SQL的地方,并使用prepared statement

  • Injection beyond SQL

image.png

  • RegexDoS

image.png

  • DDos

image.png

传输层(防御中间人):

HTTPS主要包括HTTP和TLS

其中TLS:

image.png

HTTP有三个特性

  • 可靠性:加密
  • 完整性:mac验证
  • 不可抵赖性:数字签名

HTTP->HTTPS

image.png

静态资源被劫持纂改?对比hash! image.png 用SRI,即判断标签hash(原始内容hash)与实际hash是否一样

写在最后

  • 安全无小事
  • 使用的依赖成为最薄弱的一环(npm install也有可能有危险)
  • 保持学习的心态

有兴趣可以还可以去了解left-padeslint-scopeevent-stream事件