在渗透测试涉及到 PostgreSQL(以下简称 PG) 的时候,如果已经拿到数据库 DBA 的账号和密码,那么就可以任意加载恶意动态库。就算最新版本的 PG 已经限制数据库只能从 C:\Program Files\PostgreSQL\xx\lib (windows)或者 /var/lib/postgresql/xx/lib 加载动态库,但是 DBA 还是可以用 Large Objects 这个特性随意写入动态库到指定的文件夹,然后加载。
这篇文正我们看一下如何搭建 PostgreSQL Extension 在 Visual Studio 2022 下的开发环境。
大家根据自己开发的版本,选择相应的文件下载,这个链接里可以找到老版本。
下载之后解压或者安装,找到安装目录,接下来配置 Include Dir 会用。
这里假设 PostgreSQL 9.3 的安装根目录在:
C:\Program Files (x86)\PostgreSQL\9.3
开始配置,直接上图。
语言选择 C++,然后选择 Dynamic-Link Library (DLL)。

没有安装 C++ 工具包的可以在 Visual Studio Installer 里面安装。

选择 Next,输入工程名,选择路径。

右键 Source Files,添加源文件。

另外两个自动生成的 cpp 文件可以删除。
根据目标 PG 架构,64位就选 x64。

右键工程名,选择属性。

Platform 和之前配置的架构一致。

选择 Advanced,Character Set -> Use Multi-Byte Character Set。

选择 C/C++ -> General -> Additional Include Directories -> Edit。

根据不同的安装目录,依次填写如下内容。
C:\Program Files (x86)\PostgreSQL\9.3\include\server\port\win32_msvc
C:\Program Files (x86)\PostgreSQL\9.3\include\server\port\win32
C:\Program Files (x86)\PostgreSQL\9.3\include\server
C:\Program Files (x86)\PostgreSQL\9.3\include
选择 OK。其他设置默认。

选择 Preprocessor -> Preprocessor Definitions -> Edit。

填写如下内容,并勾选 Inherit ... 选项。其他设置默认。
WIN32
选择 OK。

选择 Code Generation -> Enable C++ Exceptions。
设置为 No。其他配置默认。

选择 Precompiled Headers -> Precompiled Header。
设置为 Not Using Precompiled Headers。其他配置默认。

选择 Linker -> General -> Additional Library Directories -> Edit。

根据安装目录,填写如下内容。
C:\Program Files (x86)\PostgreSQL\9.3\lib
选择 OK。

选择 Input -> Additional Dependencies -> Edit。
填写如下内容。
postgres.lib
选择 OK。

选择 Manifest File -> Generate Manifest。
设置为 No...。其他配置默认。

最后,选择 OK。
Include 都可以解析了。

编译也没有问题。

之前因为没有配置 Use Multi-Byte Character Set,编译可以通过但是会报这样的警告。
1>C:\Users\...\pg_rev.c(31,28): warning C4133: 'function': incompatible types - from 'char [5]' to 'LPCWSTR'
1>C:\Users\...\pg_rev.c(31,58): warning C4133: 'function': incompatible types - from 'Pointer' to 'LPCWSTR'

最终导致动态库无法执行任何命令。
搜索发现是因为 Use Unicode Character Set 导致。所以,配置过程中一定记得设置 Character Set 为 Use Multi-Byte Character Set。
KEEP CALM AND HACK AWAY!