• Java代码审计之ofcms


    环境搭建

    Github地址如下:

    "GitHub - yuzhaoyang001/ofcms: cms"

    下载后,直接用IDEA打开ofcms项目,配置tomcat,选择第一个工件:

    运行后,输入自己的数据库信息。等待配置完成后,最后输入你的管理员密码即可:

    配置完成后,停止运行,编辑下述文件:

    <pre class="prettyprint hljs awk" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">ofcms-master/ofcms-admin/src/main/resources/dev/conf/db-config.properties
    

    再修改数据库配置,并修改文件db-config.properties为db.properties:

    最后重新运行,就大功告成了:

    2

    任意文件读取

    分析

    <pre class="prettyprint hljs awk" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">ofcms-admin/src/main/java/com/ofsoft/cms/admin/controller/cms/TemplateController.java
    

    这个文件的getTemplates函数,可以看到从前台获取dir、up_dir、res_path值,直接把dir拼接到pathfile,并未对其处理,直接获取pathfile目录下的所有目录dirs和文件files,但是获取的文件后缀只能是html、xml、css、js:

    进而在从前台获取file_name参数,默认为index.html,再判断files是否为空,如果不为空,循环所有文件files和file_name进行对比,有则返回该文件,无则返回所有文件files的第一个文件,最终读取该文件内容:

    验证

    跳到admin目录下,假如不知道该目录有什么文件就随便输入file_name,请求后,左边会显示该目录下的所有文件(html、xml、css、js):

    当file_name为空时,则读取的index.html:

    当该目录下没有file_name文件,则输出该目录下第一个文件(html、xml、css、js):

    3

    任意文件写入

    分析

    还是在该TemplateController.java文件里的save函数,从前台主要获取file_name、file_content两个参数,可以发现该函数的file_name是直接和pathfile目录拼接上的,所以是可以路径穿越的,导致文件可以写到任意位置下:

    验证

    在admin目录下写一个q.xml:

    利用任意文件读取,读取q.xml:

    4

    SQL注入

    分析

    <pre class="prettyprint hljs awk" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">ofcms-admin/src/main/java/com/ofsoft/cms/admin/controller/system/SystemGenerateController.java
    

    这个文件的create函数,可以看到这里直接获取一个sql字符串,进而执行update函数:

    经过层层追踪,最终到了这里,发现直接用executeUpdate函数执行了,以为这个cms全部用的参数化查询方式,结果这里竟然没用:

    验证

    <pre class="prettyprint hljs sql" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">sql=update of_cms_ad set ad_id=updatexml(1,concat(1,user()),1)
    

    5

    任意文件上传

    分析

    <pre class="hljs awk" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">ofcms-admin/src/main/java/com/ofsoft/cms/admin/controller
    

    这个文件下的ComnController.java、UeditorAction.java文件,其中的upload、editUploadImage、uploadImage、uploadFile、uploadVideo和uploadScrawl函数都是可以进行上传的,可以看到用的都是getFile函数:

    跟进MultipartRequest函数里,再到wrapMultipartRequest函数,可以看到先对齐检验文件是否存在,不存在,则创建,创建失败就拜拜,创建成功继续往下,最后上传成功则生成uploadFiles:

    跟进isSafeFile函数,发现获取了上传文件名,并检验是否以sp或jspx结尾,这里我们可以利用Windows或中间件文件上传特性来避免结尾为jsp或jspx:

    验证

    upload函数利用1.jsp.进行绕过:

    editUploadImage函数也可以如此:

    6

    总结

    这里根据控制器,看每一个接口走下来,最终也是审出来了。

    还有一个freemarker模板注入漏洞,因为我自己也没整明白,也就没办法分析了。 等以后审计能力够了会再写。

    还有一个问题,关于上传jsp文件为什么执行不了——是因为存在jfinal过滤器,所以没有办法传上去。

  • 相关阅读:
    LabVIEW开放神经网络交互工具包【ONNX】,大幅降低人工智能开发门槛,实现飞速推理
    渲染管线详解
    学习模板发布
    讯飞开放平台--星火认知大模型--开发技术文档--js实例代码详解
    云原生之使用Docker部署BookBrowser电子书浏览器
    文件格式转换
    php ci 框架准备工作
    Python文件操作:操作文件的1个函数3个方法使用、readline按行读取文件、文件指针(详细图文)
    千益畅行,旅游卡真相,成本与赋能潜力
    Memento(备忘录模式)
  • 原文地址:https://blog.csdn.net/Java_ttcd/article/details/126299206