目录
壹 ofcms环境搭建(避坑指南)
四月底开始入手java代码审计,从一开始的一头雾水到现在博客总结,之间经历了许多,走过不少坑,虽然大四啥事儿都没有但是整个过程也还是压力比较大的
现在IDEA中以及没有java代码审计插件 FindBugs 了,现在叫做 SpotsBugs ,人都傻了
环境搭建方面以及总结在之前的博客里面:
https://blog.csdn.net/Alexz__/article/details/116229266
一定要去看看,因为有许多的坑
贰 从ofcms出发浅析javaweb项目目录结构及其功能
因为没有系统的学习过javaweb的开发知识,对于整个javaweb的框架结构十分的陌生,于是便学习之后总结了这一盘博客,用来巩固自己学习路上所遇到的问题以及学习的成果;
总结在了这篇博客里面:
https://blog.csdn.net/Alexz__/article/details/116272080
叁 CVE-2019-9614 SSTI模板注入漏洞
CVE-2019-9614漏洞复现:
CVE官网链接:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-9614
先登录进ofcms的后台admin管理界面;然后再模板文件中课编辑Freemarker的模板代码(这想想就....实在是不安全);随机挑选一个幸运页面,进行payload注入;
Payload:<#assign value="freemarker.template.utility.Execute"?new()>${value("calc.exe")}
然后从前台进入该页面(联系我们)
于是便完成了系统命令执行的操作:
代码审计分析:
我们从项目的pom.xml文件中可以得知,该项目使用了Freemarker 2.3.21版本
该模板管理功能界面源码为 /ofcms-admin/src/main/java/com.ofcms.cms/admin/cms/TemplateController.java
从源码中可以看到该功能支持freemarker模板文件的热处理,编辑保存等功能
我们来看模板目录:
与其一一对应的是.../webapp/WEB-INF/page/default/下的html文件
但是我们在网页端进行实时模板更改的时候,后台网页文件并不会有变化,这里应该是作者在freemarker框架上二次开发了一个热处理功能从而可以进行模板编辑;作者还是很牛逼的,ofcms整个系统架构逻辑严密,分工明确,功能也十分得强大,就是在某些小地方的疏忽倒是存在不安全的因素(其实大部分的不安全因素都可以通过部署waf来缓解,从而进行治标不治本的操作)
具体内容可移步至:
https://blog.csdn.net/Alexz__/article/details/116400913
肆 任意文件上传漏洞
漏洞复现:
可上传jsp文件,后台无过滤
file_path不用管,应该是源路径,需要注意的是dirs和file_name这两个,我们可以通过file_path确定当前文件上传位置,通过dir进行修改,然后重命名为file_name后缀改为jsp,然后在file_content内添加我们URL编码的木马内容:
源码审计分析:
通过路劲搜索可定位到:
.../ofcms-admin/src/main/java/com.ofcms.cms/admin/controller/cms/TemplateController.java文件
审计保存模板片段代码:(审计过程中添加注释)(注释就是精华)
可以发现,核心操作代码在保存编辑完成之后保存模板时,用到了一个没什么卵用的dirs字段数据,我们便利用此字段输入数据可控来进行文件路径的重新定位;且保存模板时也没有进行字符串的过滤验证,扩展名也没有任何限制,于是便可以完成已知路劲的任意文件上传挂马获得shell:
冰蝎马:
上去了
后话:这一个模板编辑功能就爆出来了两个严重的漏洞,看来在开发系统时,需要注意啊,就是对于功能点的创新和尝试,同时也包含着非常大的安全隐患,切记要慎重。
伍 存储型XSS漏洞
漏洞复现:
漏洞存在位置:http://localhost:8080/ofcms-admin/case-c-61.html 位置不一定,这个是我的
源码审计分析:
通过post请求的路径定位到评论区前端界面:
.../ofcms-admin/src/main/webapp/WEB-INF/page/default/articel.html
从数据库中直接调取资源:
再次通过POST请求路径定位到后端java代码:
.../ofcms-api/src/main/java/com/ofsoft/cms/api/v1/CommentApi.java
找到了评论接口:
PS:因为输入法突然在IDEA中不能用了,就用英文打上了注释,勉强看懂代码大意就行
这里的XSS漏洞出现原因就简单明了了,前端V展示数据资源无过滤审核措施,后端接收资源也无过滤,于是便导致了这个存储型的XSS漏洞,算是高危,因为无需登录谁都可以评论
陆 后台SQL注入漏洞
漏洞复现:
这里可以进行update进行sql注入
几种常见的update注入模板:payload:适用于字符型:
' or updatexml(1,concat(0x7e,(database())),0) or '
适用于数字型:
' or extractvalue(1,concat(0x5e24,(database()))) or '
从表内随便选择一个进行注入操作:
这里选择的是of_cms_ad表
payload:update of_cms_ad set ad_name=updatexml(1,concat(0x7e,(database())),0)
where ad_id=2
爆出了数据库名称
源码审计分析:
通过请求包头找到文件路径:
该板块的源码如下:
可以看到,通过getPara()获取到POST的sql字段数据
追踪Db.update():(快捷键按住Ctrl后鼠标点击函数即可)
继续追踪MAIN.update():
穷追不舍update()
可以看到这边已经开始数据库交互数据了,conn先赋值为空,然后把数据喂进另一个update()中:继续追踪:
通过查看IDEA给予的说明文档可以发现其用途
所以,在此处使我们可以控制的update型进行SQL注入;
小结:
本人第一次java代码审计,在开始之前上网找了许多的教程,准备工作等等,还发现居然没有一本系统介绍java代码审计的书籍;
其实这一次审计与其说是审计不如叫做黑盒渗透+代码分析;
看了许多前人的博客,从一个知识点引发出来无数个知识点,那种知识荒漠的感觉实在很糟糕,没办法,从头开始补,现在还有时间
下面可能要涉及的就是java代码审计靶机,从漏洞形成原理出发,去发掘大多数人通用漏洞的形成原理,系统的进行java代码审计的学习;
“因为山就在那里。”
——英国登山家乔治·马洛里(George Mallory)