前言
OFCMS是基于Java技术的内容管理系统,在v1.1.3之前的版本存在SQL注入漏洞。
复现一下CVE-2019-9615,作为java代码审计的学习。
测试版本:OFCMS v1.1.2
- IntelliJ IDEA
- Java 1.8.0
- Mysql 8.0.12
- Tomcat 9.0
案例搭建
打开 IDEA,点击 import Project
,选择下载的源码,然后选择Import project from external model
中的 Maven。
然后打开 ofcms-admin/src/main/resources/dev/conf/
下的 db.properties
,修改数据的账号密码
然后修改根⽬录下的 pom.xml
,搜索 mysql
,然后修改成⾃⼰对应的版本,然后点击import change
PS:速度太慢修改maven为阿里镜像(项目右键->maven->create settings.xml)
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>uk</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://uk.maven.org/maven2/</url>
</mirror>
<mirror>
<id>CN</id>
<name>OSChina Central</name>
<url>http://maven.oschina.net/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>nexus</id>
<name>internal nexus repository</name>
<url>http://repo.maven.apache.org/maven2</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
</settings>
PS:这里没有找到对应该版本的包就换成了8.0.12的mysql。
然后下载需要的jar包资源:
配置Tomcat 服务, run-->edit configurations--> + -->tomcat server-->local
配置好tomcat目录和端口。
配置Deployment:+ --> Artifict --> 选择ofcms-admin:war -->修改名字
最后打开 MySQL,创建⼀个名为 ofcms 的数据库,导⼊ofcms/doc/sql
下的 sql ⽂件:
mysql> use ofcms
Database changed
mysql> set names utf8;
mysql> source /Users/lanvnal/Files/代码审计/ofcms/doc/sql/ofcms-v1.1.2.sql
然后启动,访问127.0.0.1:8006/ofcms_admin/
后台地址:http://localhost:8006/ofcms_admin/admin/index.html
用户名/密码:admin/123456
漏洞分析
漏洞存在的文件为:ofcms-admin/src/main/java/com/ofsoft/cms/admin/controller/system/SystemGenerateControlle r.java
/**
* 创建表
*/
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 参数,然后update
⽅法直接执⾏sql 语句,返回 json 格式的数据。这⾥对于传⼊的参数没有任何的处理就直接带⼊执⾏语句中,造成了 SQL 注⼊。
该功能是后台代码生成中的增加功能。update型的注入,可以通过报错进行注入。
总结
是个后台的sql注入,利用起来挺鸡肋的,复现这个主要是环境的搭建和入门的学习。