2022-05-13 22:52 于美国
网安引领时代,弥天点亮未来
1.填坑之前的文章,讲解一下实现过程:基于websocket自写子域名在线爆破
2.平时懒得打开python脚本或者软件,基本都是去百度搜索子域名爆破。
3.网上使用的是ajax,平均响应一次大小在200-300。
4.如果使用websocket,平均响应一次大小30-40。
5.因为http响应包把这响应头大小也包含进去了。
6.还有就是ajax需要频繁和服务器进行三次握手,但是websocket只要建立一次链接,只要浏览器不关闭就可以长时间进行通信。
7.websocket框架使用的workerman,至于框架特性和优点,自行查询官网文档
https://www.workerman.net
8.我这使用的是webman,基于workerman容器的超高性能HTTP框架。
9.首页代码其实也没啥的,引入html模板。
10.前端模板其实也没啥的,就是链接websocket服务端,监听服务端onopen连接成功事件和服务端onmessage消息接受的事件,根据对应的事件响应类型执行对应的js代码。
11.根据官网给的手册,可以进行自定义其他进程,也就是多进程。
12.我总共定义了额外两个进程,分别监听端口12345和6666。
13.直接php start.php start启动服务。
14.12345就是对外的websocket协议,具体代码逻辑如下。
15.当客户端建立链接成功后,后端会触发onConnect函数,然后计算mysql数据库内总共字典数量,保存到$connection里面,因为有魔术方法在,当dict_count不存在会自动设置这个值,并且全局生效,只要浏览器客户端不关闭dict_count变量会一直生效,所以我代码写在这个位置,用户第一次连接的时候计算总数,不需要每次请求计算,不然太浪费性能了,只要浏览器不关闭,可以重复使用dict_count变量。
16.最后任务通过后端异步AsyncTcpConnection会分给6666端口,为什么?
17.因为12345端口主要是为了接受请求,计算字典总数,分发任务,返回结果,如果在这个进程解析域名,可能会导致其他客户端的堵塞了,所以异步交给6666端口,等处理完之后再返回给客户端。
18.6666端口代码逻辑如下,通过gethostbyname解析域名,然后根据解析结果返回数据。
19.这个时候异步任务结束,会再次触发AsyncTcpConnection里面onMessage函数,再次执行$connection->send,这个结果就是发送给浏览器的。
20.所以有的时候前端看到的数字顺序是乱,那是因为后端异步执行任务返回的结果。
21.12万的字典,如何知道当前爆破到第几个了哪?前面已经说过了,$connection是全局变量,只要客户端不关闭,保存的变量会一直存在,例如这个特性,每次解析进行叠加。(开始爆破的时候会进行初始化)
22.12万的字典如何保存?保存在mysql数据库.根据current_dict_count的数值,可以知道当前爆破到第几个子域名了。
23.最后一个就是数据库了,主键id的最大数值需要和字典数量一样,这样可以使用where语句的id和current_dict_count的当前爆破到数量进行同步。
24.如果主键id和总数对不上,可能导致where的时候会乱掉,如果用limit语句的话,就不需要在意主键id和总数对上,但是测试下来,长时间爆破,where的语句执行速度比limit快,limit越到后面,速度也就越慢了,所以使用where代替limit,前提是主键id要和总数对上。
25.总结以下几点:
(1).12345端口进程负责对外websocket服务开放,不需要启动太多进程,主要处理字典计算,任务接受,分发和结果返回。
(2).6666端口进程负责异步处理比较耗时解析任务,这个需要启动多一点的进程,我启动了50个。
(3).where比limit执行效率高,所以最后选择where,但是主键id必须和字典总数对上。
26.整体代码其他地方还有待完善。
28.早期PHP码农一枚。
29.欢迎大家关注弥天安全实验室公众号。
知识分享完了
喜欢别忘了关注我们哦~
学海浩茫,
弥 天
安全实验室
原文始发于微信公众号(弥天安全实验室):websocket子域名在线爆破源码讲解
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论