|
的确,对于目前的多数网站都使用ASP+MSSQL的架构来说,kennidy的这个入侵方法的确是必杀技,如果你是一个ASP程序员,应该知道了吧,是不是基本没有注意这些东西呢。
关于ASP+MSSQL入侵的东西很早就提出来了,就跟'or'1'='1一样,都是出于对脚本的代码编写漏洞进行的。因为在ASP+MSSQL中,要从浏览器端得到一些参数变量,然后在ASP脚本中去运用,在进行数据库操作中,出现很多SELECT语句,这些语句的内容又是从浏览器端得到的,因此,ASP+MSSQL的入侵,也就是来构造特殊的输入,然后改造了SQL语句,于是……
好吧,既然是从浏览器端得到的东西,当然应该想到“过滤”。(不是我说的,地球人都知道,呵呵)
让我们想想正常的ASP脚本使用的SQL语句吧。
随便一个例子:
SQL="SELECT * FROM (table) WHERE ID='" &intID& "' AND Topic='" &strTopic&
"'"
这里intID和strTopic是需要从浏览器端得到的变量。
好了,上面是我们需要的SQL语句,如果要入侵呢,就必须构造新的SQL语句。看看kennidy(其实要从这个方向入侵,就这样弄)提到的:
news.asp?id=2;exec master.dbo.sp_addlogin hax;--
“--”是用来注释的,于是SQL语句就变成我们不希望的:
SELECT * FROM news WHERE id=2;exec sp_addlogin hax;--AND topic=... AND
...
好吧。来看看解决办法(其实要从这个方向防范,就这样弄)。我们的正常使用操作数据库(SQL语句中)应该不需要使用exec之类的,而要入侵超越权限就需要使用exec之类,这些就需要屏蔽了。
需要屏蔽的关键字:exec,declare,还有就是一些需要控制的字符(串)了,比如:sp_,xp_,"_","+","'",";","@"等等(呵呵,异常符号都屏蔽了吧)。屏蔽的时候,对于字符串屏蔽不如对单个字符的屏蔽简单,如果入侵要跨越权限就会用到"_",";","--","//","@",而这些字符几乎不使用,至于"_","+"到是可能用到的。
那我们就开始吧。下面是一个简单的过滤函数
Function Filter_SQL(strData)
Dim strFilter
Dim blnFlag
Dim i
strFilter="',;,//,--,@,_,exec,declare" '需要过滤的字符,可以自己添,","是分隔符
blnFlag=Flase '过滤标志,如果产生过滤,那么就是真
Dim arrayFilter
arrayFilter=Split(strFilter,",")
For i=0 To UBound(arrayFilter)
If Instr(strData,arrayFilter(i))>0 Then
blnFlag=True
Exit For
End If
Next
If blnFlag Then
Response.Redirect "wrong.asp"
'当发现有过滤操作时,导向一个预定页面。反正正常访问用不到的连接请求,总不是好事情。
Else
Filter_SQL=strData
End If
End Function
通常,对于用户名一类的输入,可以容许"_"这样的字符。所以,你可以扩展上面的函数,添加一个判别需要过滤的字符串的属性参数。利用这个函数对所有的Request项目进行过滤检查。
这些只是简单的处理措施,其实ASP+MSSQL需要注意的东西太多了,而且很多配置需要做。本来这个东西不属于漏洞,只是太多人写程序不注意,不做安全考虑(我也一样),觉得太麻烦了。大家随意,爱做就做
|
|