freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

针对某系统XXE漏洞分析
Met32 2024-02-22 16:57:06 150074

1.XXE分析

某系统XXE漏洞分析,去年的东西,目前补丁以及新版本已经修复。

由于网上文章调用栈不全,为此分析

首先在Filter中CTPSecurityFilter中有校验

完整doFilter如下:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
    CanalMapMonitor.startMonitor((HttpServletRequest)request);

    try {
        TraceFilter.insertIntoMDC((HttpServletRequest)request);
        String queryString = ((HttpServletRequest)request).getQueryString();
        if (null != queryString) {
            Matcher matcher = this.pattern.matcher(queryString);
            if (matcher.find()) {
                securityLogger.info("url包含敏感信息:" + ((HttpServletRequest)request).getRequestURL() + "?" + queryString);
            }
        }

        String tenantId;
        if (SystemEnvironment.isCloudDeployMode()) {
            StringBuffer url = ((HttpServletRequest)request).getRequestURL();
            String uri = ((HttpServletRequest)request).getRequestURI();
            String scheme = request.getScheme() + "://";
            String contextUrl = url.substring(scheme.length(), url.length() - uri.length());
            tenantId = MultiTenantConfigInitializer.getTenantIdByDomainName(contextUrl);
        } else {
            if (contextName == null) {
                contextName = SystemEnvironment.getContextPath().substring(1);
            }

            tenantId = contextName;
        }

        AppContext.removeThreadContext("REQUIRE_CHECK_GUEST");
        AppContext.removeThreadContext("REQUIRE_VALIDATE_USER_ROLE");
        AppContext.setCurrentTenantId(tenantId);
        CTPSecurityFilter.Result result = authenticate(request, response);
        if (result.getAuthenticator().directReturn((HttpServletRequest)request)) {
            return;
        }

        User currentUser = AppContext.getCurrentUser();
        if (currentUser != null) {
            try {
                LoginOpt.refreshOnlineUser(currentUser);
            } catch (BusinessException var34) {
                logger.error("", var34);
            }
        }

        if (result.getResult()) {
            StringBuilder resourceKey = new StringBuilder();
            if (this.isProtectedUri((HttpServletRequest)request, resourceKey)) {
                try {
                    Entry entry = SphU.entry(resourceKey.toString());
                    Throwable var10 = null;

                    try {
                        filterChain.doFilter(request, response);
                    } catch (Throwable var33) {
                        var10 = var33;
                        throw var33;
                    } finally {
                        if (entry != null) {
                            if (var10 != null) {
                                try {
                                    entry.close();
                                } catch (Throwable var31) {
                                    var10.addSuppressed(var31);
                                }
                            } else {
                                entry.close();
                            }
                        }

                    }
                } catch (BlockException var36) {
                    this.sendErrorWhenNotHttp(response);
                }
            } else {
                filterChain.doFilter(request, response);
            }
        } else if (response instanceof HttpServletResponse) {
            try {
                result.getAuthenticator().afterFailure((HttpServletRequest)request, (HttpServletResponse)response);
            } catch (Exception var) {
                throw new IOException(var);
            }
        } else {
            this.sendErrorWhenNotHttp(response);
        }
    } finally {
        AppContext.removeCurrentTenantId();
        AppContext.clearThreadContext();
        TraceFilter.clearMDC();
        CanalMapMonitor.stopMonitor();
    }

}

跟进authenticate方法

image-20231023164100432

此处判断为如下:

private static boolean isV3xAjax(String uri, HttpServletRequest request) {
    return uri.endsWith("getAjaxDataServlet");
}

并将该map进行了设置

image-20231023164410657

在authenticate中,可以发现获取了GET参数获取到了S和M

可试读前30%内容
¥ 9.9 全文查看
9.9元开通FVIP会员
畅读付费文章
最低0.3元/天
# web安全 # 漏洞分析
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 Met32 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
Met32 LV.4
o.0
  • 16 文章数
  • 29 关注者
一文读懂Xpath注入与利用
2023-12-18
剖析哥斯拉WebShell管理工具
2023-09-04
浅析白盒白名单SQL注入绕过利用
2023-08-02
文章目录