• 【BurpSuite】插件学习之dotnet-Beautifier


    【BurpSuite】插件开发学习之dotnet-Beautifier

    前言

    插件开发学习第3套。前置文章:

    【BurpSuite】插件学习之Log4shell
    【BurpSuite】插件学习之Software Vulnerability Scanner

    dotnet-Beautifier

    https://github.com/PortSwigger/dotnet-beautifier.git
    逻辑代码在

    |____src
    | |____burp
    | | |____DotNetBeautifierTab.java
    | | |____BurpExtender.java
    
    • 1
    • 2
    • 3
    • 4

    IMessageEditorTab

    继承的是IMessageEditorTab

    public class DotNetBeautifierTab implements IMessageEditorTab 
    
    • 1

    在这里插入图片描述

    getTabCaption()

    返回自定义选项卡上显示的标题

    @Override
        public String getTabCaption() {
            return "Beautify.NET";
        }
    
    • 1
    • 2
    • 3
    • 4

    效果
    在这里插入图片描述

    isEnabled()

    什么时候会展示,什么时候会隐藏

    @Override
        public boolean isEnabled(byte[] content, boolean isRequest) {
            if (isRequest) {
                IRequestInfo requestInfo = helpers.analyzeRequest(content);
                for (IParameter parameter : requestInfo.getParameters()) {
                    if (helpers.urlDecode(parameter.getName()).contains("$"))
                        return true;
                }
            }
            return false;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    setMessage()

    用新的content去替换旧的

    public void setMessage(byte[] content, boolean isRequest) {
            messageEditor.setMessage(beautifyContent(content), isRequest);
        }
    
    • 1
    • 2
    • 3

    核心的就是

    if (parameterName.contains("$")) {
                    String[] fragments = parameterName.split("\\$");
                    simplifiedParameterName = fragments[fragments.length - 1];
                } else if (parameterName.matches("^__(VIEWSTATE|PREVIOUSPAGE|EVENTVALIDATION)$")
                        && parameter.getValue().length() != 0) {
                    simplifiedParameterName = parameterName;
                    parameterValue = "";
                } else {
                    continue;
                }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    判断是否有$,或参数名匹配了^__(VIEWSTATE|PREVIOUSPAGE|EVENTVALIDATION)$
    然后remove旧的,保存新的

    newContent = helpers.removeParameter(newContent, parameter);
                newContent = helpers.addParameter(
                        newContent,
                        helpers.buildParameter(
                                helpers.urlEncode(simplifiedParameterName),
                                (parameterValue != null)?parameterValue:parameter.getValue(),
                                parameter.getType()
                        )
                );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    nameTracker

    缓存队列,每次set之前吧目标参数保存到这个里面

    优化

    仔细想想,其实Proxy Options里面是有Match and Replace的功能
    在这里插入图片描述
    完全可以实现这个插件的功能。
    但是插件的实现方式可以学习,应用方向可以放在replace不太好做的地方。优化方向可以是:编码(base64、UTF8<->GBK、RSA爆破)

    优化代码

    还没写

  • 相关阅读:
    八大排序源码(含优化)
    Factuality Challenges in the Era of Large Language Models
    Java类实现某个接口后,是否需要实现接口中的所有方法?
    go 函数
    Windows下SpringBoot连接Redis的正确使用姿势
    JVM+java的类加载机制
    力扣(566.303)补8.25
    opencv: 解决保存视频失败的问题
    《美团机器学习实践》读后感和一点思考
    计算机毕业设计Java幼儿校园通系统的设计与实现(系统+程序+mysql数据库+Lw文档)
  • 原文地址:https://blog.csdn.net/xiru9972/article/details/126463735