某报表系统v8路由分析 - 代码审计 - 90Sec
2019-08-10 23:50:00 Author: forum.90sec.com(查看原文) 阅读量:358 收藏

0x01 路由分析

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

2vfel

这里我们主要关注两个参数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是什么,大家可以自己慢慢看代码~。


文章来源: https://forum.90sec.com/t/topic/291
如有侵权请联系:admin#unsafe.sh