Struts2 的一些记录
2023-11-13 23:40:50

Struts2-061

依赖:

1
2
3
4
5
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.25</version>
</dependency>

这里有一个二次渲染的,感觉挺牛逼的。

当模板这样的时候:

image-20231113234215845

首先会在这里:

1
org.apache.struts2.components.UIBean#setId

image-20231113234238962

看注解应该是找 TagId 属性。

然后这里有个关键点就是 findString 了,因为我们 id 设置的是 %{3-1},他会去找到这个值然后赋值,我的理解感觉类似二次注入似的。

然后在同类的另一个函数:

1
org.apache.struts2.components.UIBean#populateComponentHtmlId

一直往里走就会走到执行表达式的地方了。

修复方法

那么最新版怎么修复的呢:

image-20231113235314324

直接不 findString 就好了

Struts2-062

这个和 061 一样,就一起做个简单分析就好了,在同样的类中:

image-20231114001504680

首先是 end 函数,进入:

1
org.apache.struts2.components.UIBean#evaluateParams

image-20231114001530255

findString 是会执行一次表达式的,然后赋值给局部变量 name 以后,下面又执行了一次:

image-20231114001704161

也是二次注入。

修复方法

新版也是做了一些改动,首先这部分还是一样:

image-20231114004656510

但是下面会做一些判断:

image-20231114004721949

就是两个条件

  1. translatedName 在上面经过解析以后和原先的name 还是一样
  2. 通过 isAcceptableExpression

过了这两个就可以执行表达式了(应该,还没具体跟到执行里面是否还有沙箱过滤

Prev
2023-11-13 23:40:50
Next