之前审计的时候感觉他这权限校验的过滤器有些问题,然后就重新看了一下filter。然后就开始了这次审计。
我们打开项目,来看web.xml
注意到这个过滤器
点进去看一下
此处判断用户是否登录,没登录的话就进去,登录了的话进入else。
if (!path.equals("/") && path.indexOf("/WXCallBack") == -1 && path.indexOf("/WXAddressCallBackServlet") == -1 && path.indexOf("/DdEventChangeReceiveServlet") == -1 && path.indexOf("/weixin") == -1 && path.indexOf("/dingding") == -1 && path.indexOf("common.js") == -1 && path.indexOf("module_field_ajax.jsp") == -1 && path.indexOf("/setup") == -1 && !path.equals("/index.jsp") && path.indexOf("/login_oa") == -1 && path.indexOf("/checkuser_ajax") == -1 && path.indexOf("/activex") == -1 && path.indexOf("/public") == -1 && path.indexOf("/js/") == -1 && path.indexOf("/inc/") == -1 && path.indexOf("/skin") == -1 && path.indexOf("/other") == -1 && path.indexOf("chatservice") == -1 && path.indexOf("images/") == -1 && path.indexOf("nest_") == -1 && path.indexOf("/flow/") == -1 && path.indexOf("module_sel.jsp") == -1 && path.indexOf("basic_select_sel.jsp") == -1 && path.indexOf("module_field_sel.jsp") == -1 && (isAccessUpfileNeedLogin || path.indexOf("/upfile") == -1) && path.indexOf("/wap") == -1 && path.indexOf("/test") == -1 && path.indexOf("desktop") == -1 && path.indexOf("admin/ide_left.jsp") == -1 && path.indexOf("reportServlet") == -1 && path.indexOf(".txt") == -1 && path.indexOf("wiki_export_doc") == -1 && path.indexOf("exam") == -1 && path.indexOf("macro") == -1 && path.indexOf("module_check") == -1 && requrl.indexOf("/error.jsp") == -1)
这个差不多相当于给出了哪些路径不需要登录。
但是他居然使用indexOf来判断,而且使用的getRequestURI()来获取路径。
所有我们只要使用/oa/js/../xx.jsp就能绕过这个过滤器的登录检测
虽然我们绕过了过滤器的登录检测,但是有的jsp文件中存在用户登录检测。我们上篇文章中网盘功能的皆存在。
所以我要找一个文件中没有登录检测的上传功能。
最后找到visual_add.jsp这个文件可以利用
这个点进去一顿跟最后到这里
这里面没做后缀检测,但是全局过滤器存在检测不能上传jsp和jspx,windows下可以采用jsp空格等绕过
但是此上传不返回路径文件名,文件名存在数据库中,通过id=xx下载。
文件名为时间戳加几个随机数很难爆破。
于是想找一个目录遍历漏洞,查了一下java遍历目录下文件的方法。
全局搜索
点进去发现第一个存在漏洞。
获取一个mappingAddres参数,这个参数就是路径,这文件也不用登陆。
得到shell名字。
通过发现过滤器缺陷绕过登录检测实现未授权文件上传,再通过目录遍历获取shell文件名成功RCE。