感谢冰牛,现在内容千篇一律的sql注入文章满天飞,依然还能够发现新的注入技巧。

主要就两点,sysobjects表与syscolumns表都无select权限时,得到表名与列名。以前BLOG里写过, 要不是某***发来一我等小菜从没接触过的CFM程序的一个注入点让解决获取表名的难题,我都要忘了,顺便再重记一次。

sysobjects表没有权限。如何暴表?所有的表名都只存在了sysobjects表里,所以我们无法从别的地方得到表名。但是,大家有没注意 过sql server提供的object_name函数呢?它与object_id函数是相对应的,object_id会返回指定对象在数据库中的id值。而 object_name会返回指定ID所对应的数据库对象名,对于表来说自然就是表名了。

好了,现在只要得到所有的用户表的ID就可以得到表名了, 表的ID在很多地方都会存储,比如syscolumns表,
我们只要从syscolumns表里面取得表的ID,再利用object_name就可以得到表名了。

可以利用下面的语句得到表名,前提条件是syscolumns表有select 权限:
显错:

 

  1. select 1 where 1=(select top 1 * from (select distinct(object_name(id)) as 'name' from syscolumns) as a where a.[namenot in(select distinct top 0 object_name(id) from syscolumns)) 

union:

  1. select '1','2','3','4' union select top 1 1,3,[name],4 from (select distinct(object_name(id)) as 'name' from syscolumns) as a where a.[namenot in(select distinct top 0 object_name(id) from syscolumns) 

上面的语句会将系统表也查出来。通过不停地变top 0就可以得到所有的表名了。当syscolumns表无权限的时候,可以借助其它的系统表,但是这样很有可能不能得到所有表的名字,看运气了。。只要其它 系统表里面出现了表的ID,就可以通过object_name函数来得到表名,下面从sysprotects这个系统表中获取ID来得到表名:

 

  1. select object_name(id) from sysprotects 

再谈syscolumns表无select权限时获取列名的方法,利用col_name函数,先利用上面的方法得到表的id,再利用:

 

  1. select col_name(tableid,colindex) 

就可以了。

具体情况具体分析了,朋友发来的这个CFM注点有个毛病,只要参数里面出现sys,就会自动跳回主页,不知道是什么防火墙还是程序内置的安全防护功 能,试了会最终绕过去了,将sys分拆成sy%00s就可以。至于%00为什么没有被截断,同时为什么没有被sql server当成是分隔符,,这我就不知道了,不是本菜鸟能研究出来的。