| 最近kennidy的“关于数据库的简单入侵”是一个比较热门的话题,如果你还没有看过这个文章, 请参见:http://www.cnhonker.net/news/membervouch/20010823191247.html 或者上篇“SQL数据库的一些攻击”一文,这个更全些。 的确,对于目前的多数网站都使用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项目进行过滤检查。
这些只是简单的处理措施 [1] [2] 下一页
|