一次耗时的安全测试

news2024/11/14 13:25:49

简介

接到一个安全测试任务,数据包使用安全控件进行了加密。通过开发插件,实现明文测试,最终发现了2个越权。

加解密过程分析

  1. 访问网站首页,需要先安装一个控件。安装完成后,访问网站发现数据包加密处理。
  2. 按照以前的测试思路,先打开发浏览器开发工具,根据关键字“encrypt”进行搜索,搜索得的到的结果非常多,不知道从何分析起。
  3. 无意间查看开发工具的网络请求模块,发现请求127.0.0.1的流量中,有“encrypt”、“decrypt”等关键字(如果Burp 原本抓不到 127.0.0.1 的流量,可在浏览器代理插件的不代理地址中添加 “<-loopback>”)。

分析encrypt接口发现该接口是加密使用的,其请求body是明文数据(json格式)字符串,返回body是对应的密文字符串及hash值。分析decrypt接口发现该接口是解密使用的,其请求body是密文字符串,返回body是对应的明文字符串值。整体过程如下图

插件开发

已经知道了加密、解密过程。为了实现明文测试,需要开发插件支持,插件需要完成以下功能:

  1. 针对请求体/返回体的密文,对密文进行解密(得到明文,方便repeater模块修改明文)。
  2. 针对repeater模块的明文请求,自动完成加密,然后发送请求数据包。

整体架构如下:

# -*- coding: UTF-8 -*-
from burp import IBurpExtender, IMessageEditorTabFactory, IMessageEditorTab, IProxyListener, IHttpListener
from java.io import PrintWriter
from javax.swing import JPanel, JScrollPane, JTextArea, SwingUtilities
from java.awt import BorderLayout
import json
import traceback


class BurpExtender(IBurpExtender, IMessageEditorTabFactory, IProxyListener, IHttpListener):
    def registerExtenderCallbacks(self, callbacks):
        # 注册回调和帮助器对象
        self.callbacks = callbacks
        self.helpers = callbacks.getHelpers()
        self.stdout = PrintWriter(callbacks.getStdout(), True)

        # 设置扩展名称并注册消息编辑器标签工厂
        callbacks.setExtensionName("Encrypt And Decryption")
        callbacks.registerMessageEditorTabFactory(self)

        # 注册代理监听器
        callbacks.registerProxyListener(self)

        self.stdout.println("Encrypt And Decryption")

    def createNewInstance(self, controller, editable):
        # 创建自定义标签的新实例
        return CustomTab(self, controller, editable)

class CustomTab(IMessageEditorTab):
    def __init__(self, extender, controller, editable):
        # 初始化自定义标签
        self.extender = extender
        self.controller = controller
        self.editable = editable

        self.tabPanel = JPanel(BorderLayout())

        # 使用JTextArea实现自动换行
        self.textArea = JTextArea()
        self.textArea.setLineWrap(True)
        self.textArea.setWrapStyleWord(True)
        self.textArea.setEditable(editable)

        scrollPane = JScrollPane(self.textArea)
        self.tabPanel.add(scrollPane, BorderLayout.CENTER)

        self.currentMessage = None
        self.isRequest = False
        self.cache = {}
        self.originalText = ""

    def getTabCaption(self):
        # 返回标签的标题
        return "Encrypt And Decryption"

    def getUiComponent(self):
        # 返回UI组件
        return self.tabPanel

    def isEnabled(self, content, isRequest):
        # 确定标签是否应启用
        self.isRequest = isRequest
        return True

    def setMessage(self, content, isRequest):
        # 设置当前消息,并根据请求/响应进行解密
        self.currentMessage = content
        if content is None:
            self.textArea.setText("")
        else:
            try:
                if isRequest:
                    # 处理请求体解密
                    info = self.extender.helpers.analyzeRequest(content)
                    body = content[info.getBodyOffset():]
                    body_string = body.tostring().decode('utf-8', errors='replace')
                    jsonBody = json.loads(body_string)
                    # 获取密文字符串
                    enStr = jsonBody["enStr"]

                    dencryptData = self.decrypt(enStr)
                    jsonBody["enStr"] = dencryptData
                    formattedBody = json.dumps(jsonBody, indent=4)
                    self.textArea.setText(formattedBody.encode("utf-8").decode("utf-8"))

                else:
                    # 处理响应体解密
                    info = self.extender.helpers.analyzeResponse(content)
                    body = content[info.getBodyOffset():]
                    body_string = body.tostring().decode('utf-8', errors='replace')
                    jsonBody = json.loads(body_string)

                    # 获取密文字符串
                    enStr = jsonBody["enStr"]

                    dencryptData = self.decrypt(enStr)
                    jsonBody["enStr"] = dencryptData
                    formattedBody = json.dumps(jsonBody, indent=4)
                    self.textArea.setText(formattedBody.encode("utf-8").decode("utf-8"))

            except Exception as e:
                # 处理解密过程中发生的错误
                self.extender.stdout.println("Error occurred: {} at line {}".format(str(e), traceback.format_exc()))
                self.extender.stdout.println("Traceback: {}".format(traceback.format_exc()))
                self.textArea.setText(body_string)
                self.originalText = body_string

    def getMessage(self):
        # 获取当前消息,如果已修改则更新消息内容
        if self.currentMessage is None:
            return None
        if self.textArea.isEditable() and self.isTextModified():
            if self.isRequest:
                info = self.extender.helpers.analyzeRequest(self.currentMessage)
            else:
                info = self.extender.helpers.analyzeResponse(self.currentMessage)
            headers = info.getHeaders()
            body = self.textArea.getText().encode('utf-8')
            self.currentMessage = self.extender.helpers.buildHttpMessage(headers, body)
        return self.currentMessage

    def isModified(self):
        # 判断文本是否已被修改
        return self.textArea.isEditable() and self.isTextModified()

    def getSelectedData(self):
        # 获取选中的文本
        return self.textArea.getSelectedText()

    def isTextModified(self):
        # 判断文本内容是否被修改
        return self.textArea.getText() != self.originalText

    def decrypt(self, enStr):
        '''
        解密函数
        :param enStr:
        :return:
        '''
        pass

“针对repeater模块的明文请求,自动完成加密”使用burp开发时没有成功,没有找到原因。处于项目时间紧迫,使用了mitmproxy作为burp的上游代理,开发脚本,完成对明文加密。

from mitmproxy import http
import json


def request(flow: http.HTTPFlow) -> None:

    if (flow.request.host == "targetHost") and not checkSuffix(flow.request.path) and "targetPath" in flow.request.path and flow.request.method == "POST":
        if "application/json" in flow.request.headers.get("content-type"):
            try:
                bodyJson = flow.request.json()
                # 如果是请求是明文进行加密操作
                if ":" in bodyJson["enStr"]:
                    bodyJson["enStr"] = encrypt(bodyJson["enStr"])
                    # 发送密文请求到目标服务器
                    flow.request.set_text(json.dumps(bodyJson))
            except Exception as e:
                print("error", str(e))


def checkSuffix(url):
    extension = url.split('.')[-1].lower()
    return extension in ['js', 'png', 'jpg', 'jpeg']


def encrypt(plan_txt):
    '''
    加密方法
    :param plan_txt:
    :return:
    '''
    pass

测试结果

通过以上插件,修改数据包的参数发现越权2个(常规思路)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于springboot+vue实现的在线商城系统

系统主要功能&#xff1a; &#xff08;1&#xff09;商品管理模块&#xff1a;实现了商品的基本信息录入、图片上传、状态管理等相关功能。 &#xff08;2&#xff09;商品分类模块&#xff1a;实现了分类的增删改查、分类层级管理、商品分类的关联等功能。 &#xff08;3&…

不懂编程的都觉得AI要取代程序员了,程序员自己却在偷着乐?真相是…

最近&#xff0c;AI写代码的新闻满天飞&#xff0c;不懂编程的人都觉得AI要逆天了&#xff0c;程序员马上就要失业了&#xff01;但奇怪的是&#xff0c;程序员群体——这帮最懂代码、最常使用AI编程工具的人&#xff0c;怎么反而觉得AI取代不了他们呢&#xff1f;&#x1f914…

TD综合教程——噪波球和正交线性脉冲(附思路和工程文件)

一、噪波球 整体思路&#xff1a; 渲染三件套&#xff1a;Geometry COMP、Camera COMP、Render TOP 在此基础上进行pbr MAT材质和environment COMP环境光渲染 使sphere TOP&#xff08;球体&#xff09;更加柔和&#xff0c;将类型改为NURBS Twist TOP&#xff08;扭曲&#x…

C++---内存管理

1 C/C内存分布 栈区&#xff1a;由编译器自动分配和释放&#xff0c;存放运行时候的局部变量&#xff0c;函数参数&#xff0c;返回数据&#xff0c;返回地址。 堆区&#xff1a;一般由程序员自己分配&#xff0c;然后自己释放&#xff0c;例如栈的实现malloc开辟的数组空间。…

尝试开发油猴(Tampermonkey)脚本

篡改猴 (Tampermonkey) 是拥有 超过 1000 万用户 的最流行的浏览器扩展之一。 它适用于 Chrome、Microsoft Edge、Safari、Opera Next 和 Firefox。 有些人也会把篡改猴(Tampermonkey)称作油猴(Greasemonkey)&#xff0c;尽管后者只是一款仅适用于 Firefox 浏览器的浏览器扩展…

UE5 Linux编译流程(实战)

文章目录 概述setup.sh2.GenerateProjectFiles.sh3.make其他的 小结 概述 之前写过一篇linux上代码的流程&#xff0c;这一篇&#xff0c;补下编译流程。4.26还是4.27的时候&#xff0c;做过编译&#xff0c;那会刚出来&#xff0c;当时编译用的是QT&#xff0c;跟着文档&…

传输大咖40 | 医药行业跨国文件传输的挑战与解决方案

在当今全球化浪潮的推动下&#xff0c;医药健康领域的国际合作变得越发密切。无论是共享临床试验的数据&#xff0c;还是协作推进新药的研发&#xff0c;一个高效的文件传输系统都显得尤为关键&#xff0c;它直接关系到整个行业的快速进步。但是&#xff0c;当文件跨越国界进行…

Redis缓存击穿、缓存穿透、缓存雪崩场景描述及解决方案

Redis缓存击穿、缓存穿透、缓存雪崩场景描述及解决方案 缓存穿透 用户请求了很多既不存在于redis也不存在于数据库的无效数据请求&#xff0c;导致redis无法拦截&#xff0c;最终所有请求都落在数据库中 解决方案&#xff1a;缓存空对象&#xff08;会导致redis中存了很多垃…

The Magic Loop-快速职业发展的框架

前言 在 B2B 系列中短暂休息一下&#xff0c;我很高兴为你带来 Ethan Evans 的重要客座文章。在 Amazon 的 15 年里&#xff0c;Ethan 帮助发明了 Prime Video、Amazon Video、Amazon Appstore、Prime Gaming&#xff08;以前称为 Twitch Prime&#xff09;和 Twitch Commerce…

电阻器件选型

电阻参数 一般都是&#xff08;前面数字x10^末尾数字&#xff09;&#xff0c;如下面的例子 大概清楚电阻的结构即可&#xff0c;无需掌握 电阻器安装在陶瓷基板的上面&#xff1b;在每一端都有内部金属电极&#xff0c;使其与厚膜电阻体接触&#xff1b;电阻原件的成分是金…

第144天:内网安全-Linux权限维持OpenSSHPAM后门SSH软链接公私钥登录

目录 案例一&#xff1a; 权限维持-Linux-替换版本-OpenSSH 后门 案例二&#xff1a; 权限维持-Linux-更改验证-SSH-PAM 后门 案例三&#xff1a; 权限维持-Linux-登录方式-软链接&公私钥&新帐号 ssh软链接 公私钥 新帐号 案例一&#xff1a; 权限维持-Linux-替换…

一. Unity实现虚拟摇杆及屏幕自适应功能

手游里面很多类型的游戏都需要用到遥感功能&#xff0c;例如王者荣耀&#xff0c;和平精英等&#xff0c;之前的摇杆功能都是用类似于Easy Touch的插件进行开发的&#xff0c;今天不借助任何插件来实现虚拟摇杆的功能。 一般虚拟摇杆的组成都是由轮盘和遥感的点组成&#xff0c…

二百六十二、Java——打开别人项目时缺少maven配置,无法运行文件

一、目的 在打开别人的项目时&#xff0c;发现Java文件类型显示出错&#xff0c;没有application&#xff0c;无法运行文件 二、报错原因 项目缺少maven配置 三、解决措施 File——Setting——Maven 修改Maven的配置&#xff0c;指向Maven路径 四、重启项目 文件恢复正常…

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(wa…

跨境外贸业务使用新加坡裸机云站群服务器优势

在全球化的今天&#xff0c;跨境外贸业务正变得越来越普遍。随着互联网技术的发展&#xff0c;越来越多的企业选择使用云计算服务来支持其国际业务。新加坡作为一个国际金融中心和亚洲的数据枢纽&#xff0c;提供了优质的网络基础设施&#xff0c;使其成为设置裸机云站群服务器…

【vue3|第28期】 Vue3 + Vue Router:探索路由重定向的使用与作用

日期&#xff1a;2024年9月8日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉在这里插入代码片得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对…

第18届世界杰出华人奖得主王傲山:承父业展关怀,体现“圆桌”精神

王傲山博士是“保二代”&#xff0c;由父亲言传身教及自孩提时代刻在骨子里的氛围&#xff0c;让他理所当然地传承父亲保险助人为乐的精神。在保险行业打滚两旬余&#xff0c;他成就多项傲人的成绩、取得个人成就的同时&#xff0c;以更高的指标作为团队精神&#xff0c;秉持追…

苹果手机qq原文件失效怎么恢复?4个方法,让失效变有效!

热门提问&#xff1a;在QQ上的文件忘记下载了&#xff0c;文件已经过期且无法打开&#xff0c;有什么方法可以恢复这些失效的文件呢&#xff1f; 小编这里有4个靠谱的方法&#xff0c;可以解决苹果手机QQ原文件失效怎么恢复的问题。只要大家掌握了这4个方法&#xff0c;让苹果…

【如何在鼠标右键添加Typora软件(使用脚本)】

下载Typora后&#xff0c;希望右键新建文件时候&#xff0c;可以新建md文件。 使用下面的注册脚本就可以实现&#xff1a; Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\.md] "Typora.md" "Content Type""text/markdown" "Per…

C语言---函数指针基础总结万字(4)

一、 函数 1.函数是一段可以重复执行的代码。 它可以接受不同的参数&#xff0c; 完成对应的操作。 下面的例子就是一个函数 int plus(int n) {return n; }上面的代码声明了一个函数plus()。 2.函数声明的语法有以下几点&#xff0c;需要注意。 返回值类型。 函数声明时&a…