VA - CS RCE

蹭蹭,学习

复现

先上结论,在师傅的文章哩狠狠地学习了,于是在本地尝试找了一下链子,也是第一次尝试吧,最后结果是好的!

image-20220928170351686

过程

入口

复现Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import javax.swing.*;


public class SwingDemo {

public static void showGUI(){
JFrame frame = new JFrame();
JLabel jLabel = new JLabel("<html><object classid=\"javax.swing.JLabel\"><param name=\"text\" value=\"hhhhhhhh\"></object>");
frame.getContentPane().add(jLabel);
frame.pack();
frame.setVisible(true);
}

public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
showGUI();
}
});
}
}

整个过程下来收获颇多。按文章中提到的,可以在JLabel中写入<html><object classid='javax.swing.JLabel'><parame name='Text' value='hahaha'>,这里在实际测试过程中遇到了些问题,最后构造JLabel jLabel = new JLabel("<html><object classid=\"javax.swing.JLabel\"><param name=\"text\" value=\"hhhhhhhh\"></object>");才能正常显示。这里有一些要注意的:name字段的值,对应setXXX的XXX部分只能有一个,例如setString可以但是setStringVar不行,同时XXX部分首字母大写的在name处需要全小写,而全大写的需要全大写,具体可以在Object v = attr.getAttribute(props[i].getName());处下个断点看props和attr。后面的debug过程就省略掉啦。

找链子

这里一开始在rt.jar下面翻了很久很久,后来被hxd提醒把cs.jar导进来一起看。回顾一下文章中说的条件:

  1. classid传入需要实例化的类,必须是继承自Component
  2. 必须有无参构造方法
  3. 必须存在一个setXXX方法
  4. setXXX只接受一个String类型的参数

今天学到的小技巧,在IDEA里CTRL+H可以看一个类的继承关系,方便筛查!!然后就是慢慢找啦,符合条件的不多,利用正则set\w*\(String \w*\).*\{快速看!