CVE-2022-39197 CS XSS2RCE 复现思路

这两天看到有师傅发了详细的CVE-2022-39197复现路线,那么我也讲一下当时复现这个CVE时候的心路历程。水平有限,希望大佬们能多多指导。

注:本文发于10.20

2022.9.21

最开始我是通过朋友圈视频看到这个漏洞的触发流程,再然后就是相关视频被ban了。由于学校有其他项目要做(以及懒),就没第一时间跟进这个洞。

2022.9.27

早上起来看见漂亮鼠师傅发的复现路线,当时看完一遍感觉很简单啊,用codeql或者tabby找一下setter,然后盲测一波或者审一下代码,找个链,应该就可以了。不过果然还是年轻了。

2022.9.28

在这期间先把手头的工作弄完,然后去网上找了一下poc,没找到,这时候我就意识到不对劲了。
下午的时候我按照漂亮鼠师傅的路线过了一遍,首先定位到swing下的html,然后走了一下HTMLEditorKit#create的流程,接着就是看object标签,看看它限制的参数条件之类的。至此,确定了师傅的文章没有挖坑,至少在总结setter类限制之前:)
接下来就是找setter。由于我之前生成过jdk1.8的codeql的数据库,而且CS的这个肯定和jdk版本没关系,所以这个数据库直接拿来用就可以。根据限制条件:

  • classid传入需要实例化的类,类必须继承于Component
  • 必须有无参构造方法,貌似是因为newinstant是调用的无参构造方法
  • 必须存在一个setXXX方法的XXX属性
  • setXXX方法的传参数必须是接受一个string类型的参数

找到了59个结果
1

随便点了几个,感觉结果太多了。我想一步到位,于是就写了一个找edges的ql,简单写了一下,跑出来的结果如下
2

结果基本都是这种,这肯定不对劲啊。然后回忆了一下,既然是CS的XSS,那对源码进行分析的时候应该带上CS的源码啊。
于是我就有把CS的jar包弄成了codeql数据库(其实可以直接用tabby对CS+JDK进行分析的),然后和JDK一起找边(这里应该不能用污点分析)。结果依旧不尽人意,不过结果数量倒是不多
3

仔细想了下,是不是根本不用这样找链?会不会是根据哪个类的哪个特性触发的RCE?这时候已经后半夜了,脑子不清醒了。
其实这里还是应该反思一下的,复现的时候慢慢就陷入到自己的思维定式中了,就认为这个链应该是怎样怎样找,然后就开始写ql代码、测试,浪费了好多时间,实属不应该,但好在又复习了一遍codeql污点追踪和找edges的方法。

2022.9.29

还是下午开始复现,这次我直接在CS+JDK中找符合条件的类,发现有58条结果。
4

没办法,只能一个一个找了,去掉类似AggressorClient#setTeamServerAlias这种方法内没有啥危害的setter,最后筛来筛去就找到了JSVGCanvas#setURI,首先因为它能够通过加载远程文件,其次svg存在RCE的可能比较大,比如里面的script标签。
因为这个setter方法实在org.apache.batik.swing.svg包下,我就到官网去找了batik中swing的用法以及svg的用法和特性。这部分找了好久,最后感觉也就script能实现,但是网上关于这部分的资料基本没有(或者我没找到),官网也就寥寥数语。这期间其实找着找着有点怀疑了,因为无法确定我找的这个类以及这个setter方法是否正确,我就向Y4tacker师傅确认了一下,也得到了肯定的回答。那其实这个时候就感觉有答案了,再仔细看一下官方文档,大胆构造poc就可以了。
5

一点一点试探的构造了svg文件以及触发所需要的jar包。其实这两步我就写了好一会,也学到了好多知识。svg中script标签的构造倒是比较容易写,当时找到这个setter方法的时候写了一下加载本地file的,当时xml的命名空间还一直报错;以及ScriptHandler的jar包的写法等等。
6

poc现在都能找到了,这里就不再贴了。这里只记录一下我当时复现时的思路,很感谢漂亮鼠师傅的文章以及Y4tacker师傅的帮助。水平有限,希望大佬们能多多指导。