探索sqlmap在WebSocket安全测试中的应用

news/2025/3/22 13:16:38/文章来源:https://www.cnblogs.com/test-gang/p/18230593

探索sqlmap在WebSocket安全测试中的应用

WebSocket与HTTP的区别

WebSocket,对于初次接触的人来说,往往会引发一个疑问:既然我们已经有了广泛使用的HTTP协议,为何还需要引入另一种协议?WebSocket又能为我们带来哪些实质性的好处呢?

这背后的答案在于HTTP协议的一个关键限制——通信的发起权始终掌握在客户端手中。简单来说,如果你想知道今天的天气,你(客户端)需要主动向天气服务(服务器)发送请求,而后服务器才会返回你所需的信息。但HTTP协议并不支持服务器主动推送信息给客户端,这在某些应用场景下显得尤为不便。

想象一下,如果你正在参与一个活跃的聊天室,想要实时获取其他用户的消息,使用HTTP协议意味着你需要不断地发起请求来“轮询”服务器,看是否有新的消息产生。这种方式不仅效率低下,还极大地浪费了资源,因为客户端需要不断建立和维护与服务器的连接。

为了解决这个问题,WebSocket协议应运而生。它的出现彻底打破了HTTP协议的局限,实现了真正的双向通信——服务器可以主动推送信息给客户端,而客户端也能随时向服务器发送数据。这种双向、平等、实时的通信模式,使得WebSocket成为了一种高效的服务器推送技术,广泛应用于实时聊天、股票交易、在线游戏等多种场景。

image-20240604101030616

SQLmap简介

SQLMap是一个功能强大的自动化SQL注入工具,主要用于扫描、发现并利用给定的URL中的SQL注入漏洞。

SQLMap主要设计用于测试HTTP(S)协议下的Web应用程序的SQL注入漏洞。它基于HTTP请求和响应来检测和分析SQL注入的可能性。这意味着,SQLMap并不直接支持非HTTP协议的数据库访问或测试,如通过TCP/IP直接连接数据库服务器。

WebSocket转HTTP进行SQLmap扫描

由于SQLMap仅支持HTTP(S)协议,直接用它来扫描WebSocket接口是不可行的。为了克服这一限制,我们可以设计一个中间代理解决方案。具体来说,可以开发一个自定义脚本作为中间层,负责将SQLMap生成的HTTP请求转换为WebSocket消息,并将这些消息发送到WebSocket服务器。同样,这个脚本还需要捕获来自WebSocket服务器的响应,将其转换为HTTP响应格式,然后返回给SQLMap。

需要安装 websocket-client

pip install websocket-client

工具脚本如下:

from datetime import datetime
# 导入创建WebSocket连接的库
from websocket import create_connection
# 导入HTTP服务器的基础类和HTTPServer类
from http.server import BaseHTTPRequestHandler, HTTPServer
# 导入用于多线程HTTP服务器的类
from socketserver import ThreadingMixIn
from urllib.parse import unquote
import json
from urllib.parse import urlparse, parse_qs# 定义一个函数,用于发送消息到WebSocket服务器并接收响应
def send_msg(url, date):# 创建一个WebSocket连接ws = create_connection(url, header=extra_headers)# 接收WebSocket服务器的初始响应resp = ws.recv()print(f'====================={datetime.now().strftime("%H:%M:%S")}=====================')print(resp)# 构造要发送的JSON字符串d = date# 打印要发送的JSON字符串print('JSON + + + + + + + + + +')print(d)# 发送JSON字符串到WebSocket服务器ws.send(d)# 接收WebSocket服务器的响应resp = ws.recv()print('RESP + + + + + + + + + +')print(resp)print('==================================================')return resp# 定义一个HTTP请求处理器类
class Handler(BaseHTTPRequestHandler):# 处理GET请求的方法def do_GET(self):# 设置HTTP响应状态码为200(成功)self.send_response(200)# 过滤掉其他请求影响if str(self.path[:3]) == '/ws':url_ws = f'http://{hostname}:{str(serverport)}/ws?' + unquote(self.path[4:])dist_params = parses(url_ws)dates = data_dictkey = type_conversion(dist_params, dates)update_nested_dict(dates, key)par_date = str(dates).replace("'", '"')# 设置响应的内容类型为文本self.send_header('Content-Type', 'text')# 结束HTTP头部信息的发送self.end_headers()# 调用send_msg函数发送参数并接收响应,然后将响应写入HTTP响应体resp = send_msg(ws_url, par_date)self.wfile.write(bytes(resp, "utf-8"))# 定义一个继承自HTTPServer并支持多线程的服务器类
class ThreadingSimpleServer(ThreadingMixIn, HTTPServer):pass# 定义一个函数,用于启动HTTP服务器
def run():# 创建一个服务器实例,监听所有IP地址的9000端口,并使用Handler类处理请求server = ThreadingSimpleServer((hostname, serverport), Handler)try:# 让服务器一直运行,直到接收到键盘中断信号server.serve_forever()except KeyboardInterrupt:pass# 递归函数来提取所有的key
def extract_keys(d, parent_key='', keys=None):if keys is None:keys = []if isinstance(d, dict):for k, v in d.items():new_key = k if not parent_key else f"{parent_key}.{k}"if isinstance(v, dict):extract_keys(v, new_key, keys)else:keys.append(new_key)return keys# 获取所有values
def extract_values(d, values=None):if values is None:values = []if isinstance(d, dict):for k, v in d.items():if isinstance(v, dict):# 如果是嵌套字典或列表,则递归调用if isinstance(v, dict):values.extend(extract_values(v))elif isinstance(v, list):for item in v:if isinstance(item, (dict, list)):# 如果是嵌套在列表中的字典或列表,继续递归values.extend(extract_values(item))else:# 如果列表中的项不是字典或列表,则直接添加values.append(item)else:# 如果值不是字典或列表,则直接添加values.append(v)return valuesdef parses(ws_url):# 使用urlparse解析URLparsed_url = urlparse(ws_url)# 获取查询字符串query_string = parsed_url.query# 使用parse_qs解析查询字符串为字典(注意:如果有多个相同key的参数,值会是列表)params = parse_qs(query_string)return params# 类型转换
def type_conversion(dist_p, ys_date):for key in dist_p:path = key.split('.')val = ys_datefor i in path:val = val[i]try:if isinstance(val, str):dist_p[key] = str(dist_p[key][0])elif isinstance(val, int):dist_p[key] = int(dist_p[key][0])elif isinstance(val, float):dist_p[key] = float(dist_p[key][0])elif isinstance(val, list):dist_p[key] = list(dist_p[key][0][1:-1])except:dist_p[key] = str(dist_p[key][0])return dist_pdef update_nested_dict(d, u):for key, value in u.items():if '.' in key:# 分解嵌套路径keys = key.split('.')sub_dict = dfor k in keys[:-1]:sub_dict = sub_dict.setdefault(k, {})# 更新最后一个键的值sub_dict[keys[-1]] = valueelse:# 直接更新非嵌套键d[key] = valueif __name__ == '__main__':# http服务ip+端口hostname = "localhost"serverport = 9909# WebSocket接口urlws_url = input('Url: ')# 发送内容(数据类型为字符串的字典)send_text = input('\nDate: ')# WebSocket请求头extra_headers = {'Sec-Websocket-Protocol': input('\nSec-Websocket-Protocol: ')}# json格式化请求数据data_dict = json.loads(send_text)# 获取所有的请求数据中所有的key和valueall_keys = extract_keys(data_dict)all_values = extract_values(data_dict)# 根据key和value拼接初始urlurl = f'{hostname}:{str(serverport)}/ws?'for i in range(len(all_keys)):url = url + str(all_keys[i]) + '=' + str(all_values[i]) + '&'if i+1 == len(all_keys):url = url[:-1]# 输出所访问的urlprint("\n" + url)run()

当您运行此程序后,您将被要求输入WebSocket接口的URL、要传输的数据以及Sec-WebSocket-Protocol头部信息(您可以根据项目需求自行调整相关代码,位于168行到175行之间的部分)。随后,程序将返回与WebSocket连接建立过程中使用的HTTP协议的初始URL。

这个URL的生成是基于传输数据的JSON格式进行解析而得到的。当您变更URL中的参数值时,与该参数相对应的JSON数据中的值也会相应地进行调整,并随后被发送到WebSocket接口。所以具备了sqlmap扫描参数的条件,可以通过sqlmap -u "localhost:9909/ws?key1=value1&key2=&value2"命令来进行sqlmap扫描。

image-20240604104633544

当您通过浏览器访问指定的WebSocket接口时,您不仅能够成功地接收到返回的数据,而且在浏览器的控制台中还能清晰地看到发送的请求数据以及相应的响应结果。这一流程确保了数据传输的透明性和可追踪性,为您提供了更加直观和便捷的调试与监控体验。

image-20240604105804672

image-20240604110025306

SQLmap扫描

使用以下命令进行扫描

python sqlmap.py -u "ulr"

image-20240604110946850

扫描中

image-20240604133549966

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/719807.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#开源实用的工具类库,集成超过1000多种扩展方法

前言 今天大姚给大家分享一个C#开源(MIT License)、免费、实用且强大的工具类库,集成超过1000多种扩展方法增强 .NET Framework 和 .NET Core的使用效率:Z.ExtensionMethods。 直接项目引入类库使用 在你的对应项目中NuGet包管理器中搜索:Z.ExtensionMethods安装即可使用。…

Windos bat批处理脚本,判断是终端命令行运行,还是双击运行

前言全局说明判断是终端命令行运行,还是双击运行一、说明二、文件名:t_echo.bat @echo offecho %CMDCMDLINE% | find "/c" >nul if %errorlevel% equ 0 (echo.echo [ INFO ] 脚本 %~nx0 是双击运行echo.pause ) else (echo.echo [ INFO ] 脚本 %~nx0 在命令行下…

kali简单安装docker和docker-compose

kali简单安装docker和docker-compose 更新kali安装docker sudo apt-get install docker.io安装docker-compose sudo apt-get install docker-compose检查docker和docker-compose sudo docker -v sudo docker-compose -v Pilot-Web靶场安装测试 开启容器 sudo sh init.sh -up -i…

Origin2024如何绘制3D彩色饼图?

饼图是科研中经常用到的图表之一,当我们需要展示部分占整体的比例时,相信很多人都会想到饼图,可以非常直观地体现各部分的占比,之前给大家分享了Origin绘制2D饼图,本期给大家分享绘制3D饼图的操作方法:操作步骤: 1、打开Origin2024软件,然后在Book1中输入如下示例数据,…

在线加密/解密工具

在线文本加密、解密,使用CryptoJS对文本进行AES, TripleDES, Rabbit, RC4, DES加解密。在线AES、DES加密/解密工具

【Socket】解决TCP粘包问题

TCP粘包是指在使用TCP协议进行数据传输时,发送方连续发送的多个数据包在接收方收到时被黏合成一个大的数据包。这种现象可能会导致接收方无法正确解析数据,从而影响应用程序的正常运行。一、介绍 TCP一种面向连接的、可靠的、基于字节流的传输层协议。 三次握手:客户端发送服…

省钱攻略:阿里云99元服务器续费到2027年方法

阿里云99元服务器续费到2027年方法阿里云99元服务器新老用户均可以买!!! 你没看错,老用户可以买!2核2G3M固定带宽,不限流量!! 并且续费不涨价,原价99元即可续费,一直可以续费到2027年,相当于396元买4年 99元服务器 (买4年396元) 新老用户同享 云服务Q 器活动入口: 》》》传…

代码随想录算法训练营第二十四天 | 回溯算法 77.组合

回溯算法理论基础 文章讲解 视频讲解回溯是递归的副产品,只要有回溯就会有递归 回溯的本质是琼剧,所以效率不高回溯法可以解决的问题组合问题 切割问题 子集问题 排列问题 棋盘问题如何理解回溯回溯算法的问题都可以抽象为树形结构 集合的大小就构成了书的快读,递归的深度就…

neural network structure 神经网络

分类 多层感知神经网络——最基础 卷积神经网络——善于图像识别 长短期记忆网络——善于语音识别 多层感知——数字识别 以一张28*28像素的单个数字图片为例,输出对应0-9 ![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml17560\wps1.jpg) 每个像素点的灰度值0-1,即…

Windows bat批处理特殊符号路径处理()圆括号、空格

前言全局说明Windows bat批处理特殊符号路径处理()圆括号、空格 遇到特殊符号路径报 \ was unexpected at this time. 错误一、说明 环境: 版本:Windows 11 家庭版 版本:23H2 操作系统版本:22631.3593二、带括号的路径 2.1 目的:判断,路径下 D:\temp\aa^(1^)\desktop.ini 的…

导出谷歌地图提供的各类地图可视化样式的方法

本文介绍在谷歌地图API(Google Maps APIs)中,设计地图样式并将设计好的样式通过JSON或URL导出的方法~本文介绍在谷歌地图API(Google Maps APIs)中,设计地图样式并将设计好的样式通过JSON或URL导出的方法。首先,进入Google Maps APIs网站。在弹出的窗口中我们可以看到,目…

雷池WAF-动态防护新功能体验

雷池WAF 雷池WAF(Web Application Firewall,网络应用防火墙)是由长亭科技开发的一个网络安全产品,它专注于保护Web应用免受黑客攻击。 今天主要讲的是长亭雷池最近新出的功能:动态防护安装 雷池WAF支持多种安装方式:sh脚本安装、离线安装、牧云助手安装 本篇文章以牧云助…