网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事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。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
bbs.csdn.net/topics/618631832)**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!