0x01 路由分析
不知道为什么原因,这个软件动态不起来,既然动态不起来就需要静态分析,静态分析的过程中,就需要弄明白一件事: web的路由应该怎么走 ,这里要感谢一些@Adog师傅,然后继续看看吧,下图是我随意抓的一个包。
这里我们主要关注两个参数op和cmd,首先op的值是chart,而在finereport中我目前认为主要的jar文件就是 fr-xxx.jar 这些。
简单猜测可能与 fr-chart-8.0.jar 这个文件有关系,反编译一下全局搜索 chart 关键字,然后在 com.fr.chart.web.Chart4BSService 中找到了关键字。
public class Chart4BSService implements Service {
private RequestCMDReceiver[] actions = new RequestCMDReceiver[]{new ChartWriteHtmlAction(), new ChartChangeSelecteAction(), new ChartGetDefaultFillStyleAction(), new ChartGetFileContentAction()};
public Chart4BSService() {
}
public String actionOP() {
return "chart";
}
public void process(HttpServletRequest var1, HttpServletResponse var2, String var3, String var4) throws Exception {
WebActionsDispatcher.dealForActionCMD(var1, var2, var4, this.actions);
然后会调用 WebActionsDispatcher.dealForActionCMD 方法来处理我们传入的一些东西,先关注一下 this.actions ,后面会细说。继续跟进 dealForActionCMD 方法,调用了 dealForActionDefaultCmd 。
public static void dealForActionCMD(HttpServletRequest var0, HttpServletResponse var1, String var2, RequestCMDReceiver[] var3) throws Exception {
dealForActionDefaultCmd(var0, var1, var2, var3, (String)null);
}
继续跟进 dealForActionDefaultCmd ,这里做了一个判断,判断url中的cmd变量中的值是否为空。然后就调用 dealForActionCMD 方法进行处理了。
public static void dealForActionDefaultCmd(HttpServletRequest var0, HttpServletResponse var1, String var2, RequestCMDReceiver[] var3, String var4) throws Exception {
String var5 = WebUtils.getHTTPRequestParameter(var0, "cmd");
if (StringUtils.isEmpty(var5)) {
var5 = var4;
}
dealForActionCMD(var0, var1, var2, var3, var5);
}
继续跟进 dealForActionCMD 这个方法,直接看代码也是基本清楚了, var11.getcmd() 方法获取url中的cmd参数的值,拿来和 var4 进行比较,结果为true的话就调用 actionCMD 方法进行处理。
public static void dealForActionCMD(HttpServletRequest var0, HttpServletResponse var1, String var2, RequestCMDReceiver[] var3, String var4) throws Exception {
String var5 = WebUtils.getHTTPRequestParameter(var0, "op");
String var6 = WebUtils.getHTTPRequestParameter(var0, "pid");
RequestCMDReceiver var7 = ExtraClassManager.getInstance().getActionCMD(var5, var4, var6);
if (var7 != null) {
var7.actionCMD(var0, var1, var2);
} else {
RequestCMDReceiver[] var8 = var3;
int var9 = var3.length;
for(int var10 = 0; var10 < var9; ++var10) {
RequestCMDReceiver var11 = var8[var10];
String var12 = var11.getCMD();
if (var12.equalsIgnoreCase(var4)) {
var11.actionCMD(var0, var1, var2);
return;
}
}
}
}
而 getCMD 出现在 com.fr.chart.web.xxxAction 中。
public class ChartGetFileContentAction extends ActionNoSessionCMD {
public ChartGetFileContentAction() {
}
...
}
public String getCMD() {
return "get_geo_json";
}
}
而我们能看到这里都有针对相关方法进行实例化处理,例如下面这样的 new xxxxAction 。
private RequestCMDReceiver[] actions = new RequestCMDReceiver[]{new ChartWriteHtmlAction(), new ChartChangeSelecteAction(), new ChartGetDefaultFillStyleAction(), new ChartGetFileContentAction()};
所以想要进入相关功能里面,路由一般是op=xxx&cmd=xxx,就如最开始图片一样,至于这些xxx是什么,大家可以自己慢慢看代码~。