第2篇:区分Spring与Struts2框架的几种新方法

article/2025/8/16 12:45:27

Part1前言

在近几年的HW比赛、红队项目中,攻击队在外围打点时,越来越依赖于对Java站点的漏洞挖掘。Java站点的主流框架大致就是两个:Struts2系列(包括Webwork等)及Spring系列(包括Spring MVC、SpringBoot等)。很多攻击队员在查找网站漏洞时,由于无法判断出网站所使用的框架,对于.do结尾的网站上去就是用Struts2工具、Spring漏洞工具开扫,这样的做法效率极低,容易被WAF封禁IP,进而导致错过相关漏洞。

6e6b9396031a03c2d98e2f074959932f.png

网上的区分Struts2与Spring的方法,大多数是通过查看.do及.action后缀、网页报错、网站error异常、浏览器favicon.ico图标、Struts2拦截器报错等等,但是这些方法适用范围比较窄。

本人前几年在调试分析S2-016、S2-032等漏洞的时候,无意中发现了几个特别简单实用的方法,现分享给大家。简单来说,就是利用Struts2框架和Spring框架在处理一些特殊的URL路径时,返回结果不一样的特性。

Part2方法汇总

方法1、URL中添加不存在路径

在URL的反斜杠部分添加网站不存在的路径,最好是随机字符串组成的较长路径,如果返回同样的页面,则大概率是Struts2框架,如果返回404或者是报错,则大概率是Spring框架。

比如说:http://192.168.237.128:8080/struts2_032/example/aaaaaa1/bbbbbbbb2/ccccccccc3/HelloWorld.action

在Struts2框架下,完全可以正常返回页面。

1d03d3b31dc50e35a80b016ac5108d3c.png

而Spring框架会出错

f58876cf9a9d7b171b9641b239784570.png

具体判断过程应参考如下步骤,一会儿讲讲具体原因:

对于如下URL:http://127.0.0.1:9999/S2_016_war/barspace/login.do

第1步:

在最后右边反斜杠处添加一个不存在的路径/xxxxxxxxxx/,如下所示:

http://127.0.0.1:9999/S2_016_war/barspace/xxxxxxxxx/login.do 返回与原URL相同页面,则是Struts2框架

http://127.0.0.1:9999/S2_016_war/barspace/xxxxxxxxx/login.do 返回与原URL异同页面,则是Spring框架

第2步:

如果两个URL均报错、或者均正常,无法区分,那么继续在前一个反斜杠处添加一个不存在的路径,如下所示:

http://127.0.0.1:9999/S2_016_war/xxxxxxxxx/barspace/login.do 返回与原URL相同页面,则是Struts2框架

http://127.0.0.1:9999/S2_016_war/xxxxxxxxx/barspace/login.do 返回与原URL异同页面,则是Spring框架

第3步:

如果还是没法区分,继续在前一个反斜杠处添加一个不存在的路径,如下所示:

http://127.0.0.1:9999/xxxxxxxxx/S2_016_war/barspace/login.do 返回与原URL相同页面,则是Struts2框架

http://127.0.0.1:9999/xxxxxxxxx/S2_016_war/barspace/login.do 返回与原URL异同页面,则是Spring框架

按照前面的步骤,依次添加不存在的路径,直到URL根目录为止。

原理1:Struts2的URL构造

如果了解Struts2框架的读者,一眼就能看明白这种方法的原理,对于其他读者,要想弄明白这个方法的原理,首先需要看一下Struts2的URL构造:

Struts2站点的URL路径包括四部分组成:工程名+namespace命名空间+action名+Struts2扩展名,举个例子,对于如下URL:http://127.0.0.1:9999/S2_016_war/barspace/login.action

如果在Struts2框架中,大致应该这样去分析这个URL:

/S2-016-war/部分是war包部署的工程名,也可以说是项目名、上下文等等,说法不一。

/barspace/部分是Struts2的命名空间namespace。

/login部分是Struts2的action名,指向具体处理请求的Java类。

.action部分是Struts2的扩展名,也可以定义为.do、.dw等等。

参考如下的struts.xml配置文件:

b78c9f0a79508aaac05e2ee4cae44f35.png

同样对于URL:http://127.0.0.1:9999/S2_016_war/barspace/login.action

如果网站应用直接部署在Tomcat根目录下,则工程名可以为空,此时URL如下所示:

http://127.0.0.1:9999/barspace/login.action

如果namespace设置为空,则URL如下:

http://127.0.0.1:9999/login.action

如果Struts2请求的扩展名为空,则URL如下:

http://127.0.0.1:9999/login(由此可见,这种URL路径也可能是Struts2框架的)

其中namespace可以配置为/barspace/spac1、action也可以配置为/login/user.action。这也是为什么有时候,我们需要在URL的每一个反斜杠前都添加一次不存在URL路径的原因,因为很难直接从URL中判断出哪一部分是namespace、哪一部分是action名。

原理2:Struts2向上查找action名

在了解了Struts2的URL构造之后,接下来看一下如下URL,在Struts2下是可以返回正常页面的:http://127.0.0.1:9999/S2_016_war/barspace/aaaaaaaaaa1/bbbbbbbb2/ccccccccc3/ddddddddddddd4/login.action

因为按照Struts2框架规则,首先会在当前路径下找action名login,如果没有找到去上一层找,还没有找到会去上上层找,一直找到应用程序的根路径为止。层层向上查找,直接找到应用程序为止。(真实的流程比这个复杂)

注:在网站的前端如果有nginx时,这种方法可能会无效,因为nginx可能会配置一些特殊URL转发,这时候就是nginx转发优先了。

方法2、URL添加/struts/domTT.css

在URL的Web应用根目录下添加/struts/domTT.css,如果返回css代码,那么99%是Struts2。

注:这个domTT.css文件在网站源码文件中是找不到的,用磁盘搜索的方式搜索不到的,那为什么能访问到呢,因为这个文件在Struts2的jar包中。

原理:凡是以/struts开头的URL,Struts2的过滤器都会到struts2-core-2.0.x.jar:/org/apache/struts2/static/下面去找资源,然后读取此文件内容。

举例如下:

http://192.168.237.128:8080/struts2_032/example/HelloWorld.action

270d4378e4b1c2e171900fb61c073cfd.png

在网站根目录下添加/struts/domTT.css后访问,返回css代码。

http://192.168.237.128:8080/struts2_032/struts/domTT.css

3f8a67386029fba9cc4e42fffe0ef427.png

注: 有一些低版本的Struts2框架,domTT.css文件不存在,需要更换为其它静态文件路径。

方法3、404、500响应码返回信息

输入一个不存在的路径,返回404页面,或者传入一些乱码字符,造成当前页面500响应码报错,抛出异常信息。

Struts2常用的关键字有这些:例如no action mapped、struts2、namespace、defined for action等。

d60e307d0ae4c64f73e12297881ad62e.png 9414f4d7a3f502d6bbf234b373b3073e.png 77b79781b522eaf85eea2abf1568b7a0.png

Spring的报错信息如下:含有Whitelabel Error Page 关键字

a5dc302968aee3ac9a2f28c3c0da3d3f.png

方法4:看网站图标favicon.ico

注意看下图的左上角,有一片小绿叶的图标,那基本上就是Spring了,而Struts2框架没有常用的favicon.ico图标。

d0e9589d28424c8379047a30ca71426b.png

Part3总结:

  1. URL扩展名不能用于区分Struts2、Spring框架,.do结尾的URL可能是Struts2、也可能是Spring,具体看程序员在配置文件中怎么写。

  2. 利用处理特定URL时返回页面不相同的方法,可以区分不同的框架。

  3. 总结各种报错信息,可以区分不同Web应用所采用的框架。

  4. 多调试分析一下公开的漏洞,也会发现很多有趣的东西。还有其它的方法,有待大家挖掘。


后续还会分享几个区分Fastjson与Jackson,Tomcat与Weblogic中间件的方法。

网络安全abc123

专注于红队、蓝队技术分享,每周一篇


http://chatgpt.dhexx.cn/article/WNnCEO5g.shtml

相关文章

基于Struts2框架的名片管理系统

目录 1、系统设计 2、数据库设计 3、系统管理 4、用户管理 5、名片管理 本篇博文将分享一款基于Struts2框架的名片管理系统,JSP引擎为Tomcat9.0,数据库采用的是MySQL5.5,集成开发环境为Eclipse IDE for Java EE Developers。 名片管理系…

IntelliJ IDEA2021.2搭建struts2框架

在网上看了很多IDEA搭建struts2的教程,搭建后总是无法启动服务器,下面介绍2021版本如何正确搭建struts2框架。 一、首先去struts2官网下载所需包 官网传送门 下载后进行解压 all是完整包,体积较大;min是官方提供的对于初学者的基…

【Struts2】Struts2框架创建web项目的6个步骤

Struts2框架创建web项目的6个步骤 1.创建WEB项目 2.导入Struts2核心jar包 3.在web.xml文件中配置前端控制器filter ※如果Struts2框架是2.1.3之后的版本,版本核心控制器为org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter。 ※如果Stru…

struts2框架学习

STRUTS2笔记 实现原理struts2项目搭建action概述在action中访问web资源Servlet解耦的方式是怎样的呢?通过xxxAware接口获取web资源 实现原理 先放一张很俗的框架图: 是不是看着很复杂?其实简单的讲这个古老的框架将我们平时使用的springMVC中的controller使用过…

Struts2框架 下载和配置

官网下载 进入后,下载all版本的: 下载解压后,出现以下界面,由于struts的jar包并不全部需要,故需要进入示例程序中的apps目录导入jar包: 解压其中的struts2-black.war包: 进入WEB-INF目录中&…

Struts2基本架构

Struts2基本架构 1、Struts2执行流程2、web.xml配置3、Action控制器3.1、核心控制器3.2、业务控制器 4、Result配置5、struts.xml核心配置5.1、constant元素5.2、package元素5.3、配置文件加载顺序 1、Struts2执行流程 如下例子: 执行流程如下: 浏览器…

struts2框架详解

一、struts2简介 Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技…

Struts2框架简单入门

Struts2框架简单入门 1、前言2、Struts2简介2.1、Struts2介绍2.2、Struts2优缺点2.2.1、优点2.2.2、缺点2.2.3、Struts2获取 3、入门案例3.1、pom依赖3.2、web.xml配置3.3、准备页面3.4、编写Action控制器3.5、编写核心配置文件struts.xml3.6、部署测试3.6、注意点3.7、小结 1、…

数学符号的各种含义

类型符号数学理论 类型符号 类型代表符号符号说明整数Z自然数N实数R实数讲解正整数N或N*负数N-有理数Q有理数的讲解范数范数的讲解Sgn函数Sgn数学上的符号函数或者计算机语言中的返回函数。详细 数学理论 类型代表符号符号说明收敛性收敛性讲解线性代数线性代数理论&#xff0…

数学常识--数学符号常识

目录 1、科学计数法中的E 2、自然指数e 3、连加符号 4、连乘符号 1、科学计数法中的E 在科学计数法中,E一般用来表示期望,可以用带“E”的格式表示。 E 表示将前面的数字乘以 10 的 n 次幂。 1.23E10,即 1.23 乘以 10 的 5 次幂 123000…

数学符号3

20220730 矩阵求和符号放在最外面和分别乘到里面的每一项,都是一样的 20220602 下面的式子拆成上面两部分,就好理解了 maxD 部分 表示 左边的左项,生成器给定的情况下,判别器给出的值越大越好,越认为其为真实图像 1 越好。 z ~…

常用数学符号的英文读法

(一) 基本运算(加减乘除、乘方、开方) 1.加法 相关符号: 举例: 1 2 3 augend addend sum 相关词汇:addition 加法、plus sign 加号、plus symbol 加号、augend 被加数、addend 加数、su…

母版页的工作原理

ASP.NET 母版页概述 使用 ASP.NET 母版页可以为应用程序中的页创建一致的布局。单个母版页可以为应用程序中的所有页(或一组页)定义所需的外观和标准行为。然后可以创建包含要显示的内容的各个内容页。当用户请求内容页时,这些内容页与母版页…

母版页(布局页)视图

MVC教程八:母版页(布局页)视图 一、母版页介绍和使用 母版页的扩展名为".cshtml",也叫做视图布局页,它相当于网页的模板。在其他网页中,只要引用了母版页,母版页的页面内容就可以自动显示出来,…

VS2019 asp.net母版页布局的创建与使用

asp.net母版页布局使用 工具 Visual Studio 2019 方法/步骤 1.打开Visual Studio 2019,点击【文件】在网站根目录上单击右键,选择【添加新项】 2.在弹出的【添加新项】选择【母版页】默认使用名称,点击【添加】 打开母版页的拆分界面&#…

ASP.NET中的母版页

何为母版页,顾名思义母版就是模版,就像在PPT里面的板式或主题一样,大框架已经有了,我们的任务就是向里面添加具体的内容。这样我们制作的所有幻灯片的外观大体都是一样的。 在ASP.NET中母版页有两种作用,一是提高代码的复用(把相同的代码抽出来),二是使整个网站…

母版页的详细使用介绍

ASP.NET 母版页概述 使用 ASP.NET 母版页可以为应用程序中的页创建一致的布局。单个母版页可以为应用程序中的所有页(或一组页)定义所需的外观和标准行为。然后可以创建包含要显示的内容的各个内容页。当用户请求内容页时,这些内容页与母版页…

ASP.NET 母版页(嵌套、访问母版页的控件和属性)

文章目录 [toc]一、母版页的嵌套二、访问母版页的控件和属性1、使用Master.FindControl()方法访问母版页上的控件2、引用MasterType指令访问母版页上的属性 友情链接:母版页的概述与创建 一、母版页的嵌套 嵌套就是大的容器套装小的容器。嵌套母版页就是指创建一个…

C# 母版页页面导航

C# 母版页&页面导航 母版页master页面导航站点地图SiteMapDataSource控件TreeView控件Menu控件 ASP.NET常用对象Response对象Request对象ViewState对象Server对象Session对象Cookie对象ApplicationResponse对象 母版页master localhost:50194 第一种情况:在he…

C#母版页

一、母版页的使用 1、概述 母版页为具有扩展名.master的ASP.NET文件&#xff0c;它具有包括静态文本、HTML元素和服务器控件的预定义布局。母版页由特殊的master指令识别&#xff0c;该指令替代普通页面.aspx中的page指令。该指令类看起来类似下面的代码&#xff1a; <% M…