某报表系统v8路由分析

0x01 路由分析

不知道为什么原因,这个软件动态不起来,既然动态不起来就需要静态分析,静态分析的过程中,就需要弄明白一件事: web的路由应该怎么走 ,这里要感谢一些@Adog师傅,然后继续看看吧,下图是我随意抓的一个包。

这里我们主要关注两个参数op和cmd,首先op的值是chart,而在finereport中我目前认为主要的jar文件就是 fr-xxx.jar 这些。

ox224

简单猜测可能与 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是什么,大家可以自己慢慢看代码~。

2 Likes

审计一些系统的时候就是不知道路由怎么走,然后想尝试一些参数也不行,师傅对于找路由有啥技巧吗

java的话可以先看web.xml这类的东西,当然也可以配合像我刚刚那样,最笨的办法把代码都搞出来,搜索关键字。

1 Like

在看报出的0day吧?我前几天刚分析完 哈哈

嗯,还有新的问题。