我们经常看到的某某版的通用防注入的程序都是对注入的关键字进行过滤的,比如“;|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|'","|"”一类,不过这套程序却对特殊字符进行了过滤,分析下来这样的过滤方法就安全的多了,
对特殊字符的过滤,很强很好用
。因为我们注入的时候构造语句一定要包含上面的一些特殊字符的,大家可以想想经典的注入语句,我就捡关键的给大家提个醒“and (select asc(mid(pass,1,1)) from [name] where id=1)>49”(不包括双引号),这条语句可以猜测用户名或者密码,可以说是注入ACCESS数据库的核心语句了,我们看看都是什么字符触到了RSQL()函数的痛处,有“(”,“)”,“[”,“]”,“>”那么经过RSQL() 函数过滤之后剩下的就成了“and select ascmidpass,1,1 from name where id=149”,同学们看到了吧,这样的语句是不可能猜解出什么来的。而且我们也不能通过转换大小写或者用插入TAB键之类的方式来绕过(这不是废话啊!谁听说过给特殊字符转换大小写,往中间加东西的),我也试着把特殊字符用url编码来绕过,不过后来才知道对于Request.QueryString(),Request.form()接收之后的参数会把编码还原回原来的样子再赋值给变量的,对于如何绕过过滤进行注入的方法网上目前还没有,也没听说过哪位牛人能摆平了,而且这个函数还可以过滤跨站语句的,是不是一举多得啊,既小巧又实用(打广告啊!),
电脑资料
《对特殊字符的过滤,很强很好用》(http://meiwen.anslib.com)。是不是很厉害啊。public Function RSQL(strChar)
If strChar = "" or IsNull(strChar) Then RSQL = "":Exit Function
Dim strBadChar, arrBadChar, tempChar, I
strBadChar = "$,#,',%,^,&,?,(,),<,>,[,],{,},/,\,;,:," & Chr(34) & "," & Chr(0) & ""’注意这里过滤的是特殊字符 ‘Chr(34)对应的ASCII码是双引号。Chr(0)其实就是我们上传改包把空格(20)改成的00
arrBadChar = Split(strBadChar, ",")
tempChar = strChar
For I = 0 To UBound(arrBadChar)
tempChar = Replace(tempChar, arrBadChar(I), "") ‘将特殊字符过滤为空
Next
RSQL = tempChar
End Function