Websocket长连接接口渗透测试过程随记_websockets建立连接 渗透测试

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

# 1 前言

最近接到公司的一个API接口测试的项目,除了常规的HTTP协议的API接口外,其中还有一部分是需要测试Websocket接口的。

回想了一下除了之前复现Jumpserver漏洞时候用过Websocket,以外就没有对它有过什么研究了。

这次也算是第一次与它交手,开始测试的时候就不是很顺利,但是好在最后解决了,故在此做下简单的记录。


# 2 希望达到的目标

能够使用Burpsuite来测试Websocket接口。


# 3 测试过程

1、使用Burpsuite自带的Websocket建立连接(失败)


2、使用浏览器插件测试(失败)

这里使用的是一款叫做“WebSocket King”的chrome插件进行测试的。

但是使用插件多次连接WS接口发现都是403,研究了一番后发现,目标会检测Origin头,如果不是自己站点,就直接返回403,因此需要用Burp来修改请求头。

修改了请求头后,浏览器插件终于可以正常连接到目标了,可以看到已经收到了来自服务器的Ping包。

这里要说明一下,该Websocket接口存在心跳检测的机制,服务端会定期向客户端发送ping包,需要客户端回复pong包来证明存活。

然而在我寻找了插件的各个角落,也没有发现存在自动回复pong包的功能,很遗憾这种方法失败。


3、既然没有现成的工具(也许是我没找到),只能自己造了,思路非常简单,如下:

  • 能够自动给服务器回复pong包
  • 能够将流量打到Burpsuite上
  • 使用Python编写代码

基于以上思路,开始搜索python相关的websocket的教程,最后发现利用“websocket-client”库,可以很便捷的实现我的需求,代码如下:


import websocketfrom websocket._exceptions import *from urllib.parse import urlparseimport json

url = "wss://xxxxxxxx.com/xxxxxxxx"
# proxy = ""proxy = "http://127.0.0.1:8080"
options = {}
if proxy != "":    p = urlparse(proxy)    options["http_proxy_host"] = p.hostname    options["http_proxy_port"] = p.port
ws = websocket.create_connection(url, **options)
while True:    try :        data = ws.recv()        print(data)        j = json.loads(data)        if j["type"] == "ping":            send_data = '{"type":"pong","data":"%s"}' % j["data"]            print(send_data)            ws.send(send_data)
    except WebSocketConnectionClosedException:        print("[!] Connection to remote host was lost.")        break
ws.close()

ps:临时使用的代码,请不要在意编写细节

使用起来还是很方便的,脚本中的代理服务器指向Burpsuite,然后开始运行,发现数据包ping、pong正常交互。

打开bp,找到repeater,新建一个websocket会话,选择刚刚已经建立连接的Websocket会话,并点击下方的Attach。

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

bbs.csdn.net/topics/618631832)**

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 21
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是在Linux操作系统下使用nopoll工具建立WebSocket连接的简单教程: 1. 安装nopoll工具 nopoll是一个C语言编写的轻量级WebSocket客户端和服务器库,可以用于与WebSocket服务器进行通信。可以通过以下命令安装nopoll: ``` sudo apt-get install libnopoll-dev ``` 2. 编写测试程序 以下是一个简单的nopoll示例程序,用于建立WebSocket连接并向服务器发送一条消息: ``` #include <stdio.h> #include <stdlib.h> #include <nopoll.h> int main(int argc, char **argv) { nopoll_ctx *ctx; nopoll_conn *conn; nopoll_bool ret; const char *msg = "Hello, WebSocket!"; /* 初始化nopoll库 */ nopoll_library_init(); /* 创建WebSocket客户端上下文 */ ctx = nopoll_ctx_new(); /* 建立WebSocket连接 */ conn = nopoll_conn_new(ctx, "ws://localhost:8080", "my-protocol", NULL, NULL, NULL); /* 检查连接是否成功建立 */ if (nopoll_conn_is_ok(conn) != nopoll_true) { printf("Failed to connect to WebSocket server!\n"); return EXIT_FAILURE; } /* 发送消息到服务器 */ ret = nopoll_conn_send_text(conn, msg, strlen(msg), 0); if (ret != nopoll_true) { printf("Failed to send message to WebSocket server!\n"); nopoll_conn_close(conn); return EXIT_FAILURE; } /* 关闭连接并释放资源 */ nopoll_conn_close(conn); nopoll_ctx_unref(ctx); /* 释放nopoll资源 */ nopoll_library_exit(); return EXIT_SUCCESS; } ``` 注意:在编译程序时需要链接nopoll库,可以通过以下命令编译程序: ``` gcc -o test test.c -lnopoll ``` 3. 运行测试程序 将编译生成的可执行文件运行即可建立WebSocket连接并向服务器发送消息: ``` ./test ``` 如果一切正常,可以在服务器端看到接收到的消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值