Web安全学院
Web安全学院
  • 首页
  • 译序
  • 学习路线
  • 前篇
    • Web应用程序安全测试
    • 动态应用程序安全测试(DAST)
    • 带外应用程序安全测试(OAST)
  • 服务器端主题
    • SQL注入
      • SQL注入
      • SQL注入UNION攻击
      • 在SQL注入攻击中检索数据库
      • SQL盲注
      • SQL注入速查表
    • 认证
      • 认证漏洞
      • 基于密码登录中的漏洞
      • 多因素认证中的漏洞
      • 其他认证机制中的漏洞
      • 如何保护你的认证机制
    • 目录遍历
      • 目录遍历
    • 命令注入
      • OS命令注入
    • 业务逻辑漏洞
      • 业务逻辑漏洞
      • 业务逻辑漏洞示例
    • 信息泄露
      • 信息泄露漏洞
      • 如何发现并利用信息泄露漏洞
    • 访问控制
      • 访问控制漏洞与权限提升
      • 不安全的直接对象引用(IDOR)
      • 访问控制安全模型
    • 文件上传漏洞
      • 文件上传漏洞
    • 条件竞争
      • 条件竞争
    • 服务器端请求伪造(SSRF)
      • 服务器端请求伪造(SSRF)
      • 盲SSRF漏洞
    • XXE注入
      • XML外部实体(XXE)注入
      • XML实体
      • 发现并利用盲XXE漏洞
  • 客户端主题
    • 跨站脚本(XSS)
      • 跨站脚本
      • 反射型XSS
      • 存储型XSS
      • 基于DOM的XSS
      • XSS上下文
        • 跨站脚本上下文
        • 客户端模版注入
      • 利用跨站脚本漏洞
      • 内容安全策略
      • 悬空标记注入
      • 如何防范XSS漏洞
      • 跨站脚本(XSS)速查表
    • 跨站请求伪造(CSRF)
      • 跨站请求伪造(CSRF)
      • XSS与CSRF
      • 绕过CSRF令牌验证
      • 绕过SameSite Cookie限制
      • 绕过基于Referer的CSRF防御
      • 如何防范CSRF漏洞
    • 跨域资源共享(CORS)
      • 跨域资源共享(CORS)
      • 同源策略(SOP)
      • CORS和Access-Control-Allow-Origin响应标头
    • 点击劫持
      • 点击劫持(UI伪装)
    • 基于DOM的漏洞
      • 基于DOM的漏洞
      • 控制Web消息源
      • 基于DOM的开放重定向
      • 基于DOM的Cookie操纵
      • 基于DOM的JavaScript注入
      • 基于DOM的document-domain操纵
      • 基于DOM的WebSocket URL投毒
      • 基于DOM的链接操纵
      • Web消息操纵
      • 基于DOM的Ajax请求标头操纵
      • 基于DOM的本地文件路径操纵
      • 基于DOM的客户端SQL注入
      • 基于DOM的HTML5 Storage操纵
      • 基于DOM的客户端XPath注入
      • 基于DOM的客户端JSON注入
      • DOM-data操纵
      • 基于DOM的拒绝服务
      • DOM破坏
    • WebSocket
      • 测试WebSocket安全漏洞
      • 什么是WebSocket?
      • 跨站WebSocket劫持
  • 进阶主题
    • 不安全的反序列化
      • 不安全的反序列化
      • 利用不安全的反序列化漏洞
    • 测试GraphQL API
      • 测试GraphQL API
      • 什么是GraphQL?
    • 服务器端模板注入
      • 服务器端模板注入
      • 利用服务器端模板注入漏洞
    • Web缓存投毒
      • Web缓存投毒
      • 缓存设计缺陷的利用
      • 缓存实现缺陷的利用
    • HTTP Host标头攻击
      • HTTP Host标头攻击
      • 如何识别和利用HTTP Host头的漏洞
      • 密码重置投毒
    • HTTP请求走私
      • HTTP请求走私
      • 查找HTTP请求走私漏洞
      • 利用HTTP请求走私漏洞
      • 高级请求走私
        • 高级请求走私
        • HTTP/2降级
        • 响应队列投毒
        • HTTP/2专属载体
        • HTTP请求隧道
      • 浏览器驱动的请求伪造
        • 浏览器驱动的请求伪造
        • CL.0请求走私
        • 客户端异步攻击
        • 基于暂停的异步攻击
    • OAuth认证
      • OAuth 2.0认证漏洞
      • OAuth授权类型
      • OpenID Connect
      • 如何防范OAuth认证漏洞
    • JWT攻击
      • JWT攻击
      • 在Burp Suite中使用JWT
      • 算法混淆攻击
    • 原型污染
      • 什么是原型污染?
      • JavaScript原型和继承
      • 客户端
        • 客户端原型污染漏洞
        • 通过浏览器API进行原型污染
      • 服务器端
        • 服务器端原型污染
      • 预防原型污染漏洞
    • 基本技能
      • 基本技能
      • 使用编码混淆攻击
      • 在手动测试中使用Burp Scanner
Powered by GitBook
On this page
  • HTTP与WebSocket有何区别?
  • 如何建立WebSocket连接?
  • WebSocket消息长什么样?
  1. 客户端主题
  2. WebSocket

什么是WebSocket?

WebSocket是一种通过HTTP启动的双向、全双工通信协议。通常用于现代Web应用程序中的数据流和其他异步流量。

在这一节,我们将讲解HTTP和WebSocket之间的区别,描述如何建立WebSocket连接,并概述WebSocket消息的结构。

HTTP与WebSocket有何区别?

大多数Web浏览器和网站之间的通信使用的是HTTP。使用HTTP时,客户端发送请求,服务器返回响应。通常,响应会立即发生,事务就完成了。即使网络连接一直保持打开状态,这种机制也会用于单独的请求和响应事务。

一些新型网站使用的是WebSocket。WebSocket连接是通过HTTP启动的,通常持续时间较长。消息可随时向任何一方发送,并且不具有事务性质。连接通常处于打开和空闲状态,直到客户端或服务器准备好发送消息。

WebSocket在一些特定情况下尤其有用,特别是在需要低延迟或服务器发起消息的场景,例如实时的金融数据流。

如何建立WebSocket连接?

WebSocket连接通常使用客户端JavaScript创建,如下所示:

var ws = new WebSocket("wss://normal-website.com/chat");

注意

wss协议通过加密的TLS连接建立WebSocket,而ws协议则使用未加密的连接。

为了建立连接,浏览器和服务器通过HTTP进行WebSocket握手。浏览器发起的WebSocket握手请求如下:

GET /chat HTTP/1.1
Host: normal-website.com
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: wDqumtseNBJdhkihL6PW7w==
Connection: keep-alive, Upgrade
Cookie: session=KOsEJNuflw4Rd9BDNrVmvwBF9rEijeE2
Upgrade: websocket

如果服务器接受连接,就会返回类似如下的WebSocket握手响应:

HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=

此时,网络连接保持打开,并且可以用于向任何一方发送WebSocket消息。

注意

WebSocket握手消息有几个特性值得注意:

  • 请求和响应中的Connection和Upgrade标头表明这是一个WebSocket握手。

  • Sec-WebSocket-Version请求标头指定客户端希望使用的WebSocket协议版本。通常是13。

  • Sec-WebSocket-Key请求标头包含一个Base64编码的随机值,该值应在每次握手请求中随机生成。

  • Sec-WebSocket-Accept响应标头包含一个哈希值,该哈希值是由Sec-WebSocket-Key请求标头中的值与协议规范中定义的特定字符串拼接并哈希而成。这样做是为了防止因服务器或缓存代理配置错误而产生的误导性响应。

WebSocket消息长什么样?

一旦建立了WebSocket连接,客户端或服务器就可以在任何一方异步发送消息。

可以使用客户端JavaScript从浏览器发送类似如下这样简单的消息:

ws.send("Peter Wiener");

原则上,WebSocket消息可以包含任何内容或数据格式。在现代应用程序中,往往使用JSON在WebSocket消息中发送结构化数据。

例如,使用WebSocket的聊天机器人应用程序可能会发送如下消息:

{"user":"Hal Pline","content":"I wante to be a Playstation growing up, not a device to answer your inane questions"}
Previous测试WebSocket安全漏洞Next跨站WebSocket劫持

Last updated 1 year ago