CVE-2019-9615分析

这是一个OFCMS的Sql注入漏洞

OFCMS是基于Java技术的内容管理系统,在v1.1.3之前的OFCMS中发现了一个问题,在admin / system / generate / create?sql =路径可以进行SQL注入,与SystemGenerateController.java文件相关

但总的来说这个漏洞还是比较的鸡肋,前提是得进入到后台

下面来进行一些分析和复现

环境搭建

先去gitee把源码搞下来,整一个v1.1.2版本的

https://gitee.com/oufu/ofcms/releases

直接用idea打开项目就好了(高版本的是这样的)

然后再ofcms-admin/src/main/resources/dev/conf/文件夹下打开db.properties,修改数据包的账号密码

修改根目录下的pom.xml,搜索mysql,然后修改成自己机器上装的版本,然后点击import changes

然后就是下载所需要的jar

先右键这个ofcms项目的文件夹然后点这个Maven -> Reimport

点击run -> exit configurations配置Tomcat服务,端口按本地情况进行修改

然后配置这个Deploymeent,选择ofcms-admin:war修改路径名为/ofcms-admin(虽然不改也没事)

然后打开mysql,创建一个名为ofcms的数据库,导入ofcms/doc/sql下的sql文件就好了

然后启动项目,就可以访问了

站点地址: http://ip:port/ofcms-admin

后台地址: http://ip:port/ofcms-admin/admin/login.html

用户名: admin

密码: 123456

漏洞分析

漏洞存在的文件的位置在ofcms-admin/src/main/java/com/ofsoft/cms/admin/controller/system/SystemGenerateController.java

这里有一个create函数

1
2
3
4
5
6
7
8
9
10
public void create() {
try {
String sql = getPara("sql");
Db.update(sql);
rendSuccessJson();
} catch (Exception e) {
e.printStackTrace();
rendFailedJson(ErrorCode.get("9999"), e.getMessage());
}
}

这个就使用getPara获取传过去的sql参数值,然后用Db.update直接执行sql语句,返回json格式的数据

这里对于传入的参数没有进行任何处理直接带入执行语句中,造成sql注入

然后我们去后台找到该段代码对应的功能点

cve-2019-9625_1.jpg

随便写一点然后抓包传入测试的语句

1
update of_cms_link set link_name='panda' where link_id = 4

cve-2019-9625_2.png

平台的系统运营这有一个系统监控,然后有一个SQL监控,我们可以通过这个来查看运行的SQL语句

cve-2019-9625_3.png

这个就是我们刚刚输入的sql语句,我们可以点这个链接进去看详细数据

cve-2019-9625_4.png

这说明我们可以完全控制update型的SQL注入语句,然后我们可以用以下语句尝试进行注入:

1
update of_cms_link set link_name=updatexml(1,concat(0x7e,(user())),0) where link_id = 4

cve-2019-9625_5.png

既然报错注入可以那么别的也可以执行,只是没有回显而已

修复方案

官网更新到了v1.1.4,但是没有对这个漏洞进行修复,可能的原因就是我一开始说的后台注入得先有权限比较鸡肋。

  1. 首先就是由于这个注入是在后台产生的,可以考虑限制后台使用人员对此功能使用的权限,加强管理员密码的管理,还有一个就是把默认密码随机化。
  2. 过滤一些与update型注入相关的关键字,如updatexml, extractvalue,name_const,floor
  3. 接入一些RASP设备

总结

这是我正式开始整代审的第一个小项目,之后也会继续更新,应该还会再出一期JAVA中的SQL注入漏洞产生的原理和一些修复方案