一、程序漏洞
1、跨站漏洞。Guestbook.asp,Resume.asp这两个文件中添加数据时,所取参数没有任何过滤,可以进行跨站攻击。
2、Cookie注入漏洞。还是上述两个文件在取参数时全用的Request(“参数名”),这样即使有通用防注入系统,也可以通过cookie注入将其绕过,提交危险字符。
3、Session欺骗漏洞。后台admin/chkuser.asp,验证登录程序存在session欺骗漏洞。
4、后台注入、跨站漏洞。后台程序注入、跨站的问题基本没有考虑,没有做任何处理(这是很多程序员的通病,这当中不乏从事编程工作很多年的老程序员,记住:千里之堤,溃于蚁穴!)
5、上传文件漏洞。后台“网站管理”>>“上传设置”栏目,可以任意修改上传文件扩展名的类型,致使用户可以任意上传各种类型的网页木马(说这是漏洞有点冤枉写这个程序的程序员,人家作了设置了,后面会详细讲解)。
6、后台admin/Check_UserName.asp。唉,这个文件实在不知道写程序的人想干什么,估计是调试程序时方便自己看的,最后发布时忘删除了,真不应该(被领导看了一定会被扣工资)。
7、验证码漏洞。后台登录没有验证码,可以被爆破。
二、修改方案
1、加入参数过滤函数。根据是上述1、4所出现的参数过滤不严而导致注入、跨站的问题,写1个字符过滤函数,取每个参数时都调用这个函数,可以防注入,代码如下:
Function CheckPara(ParaName,ParaType) ParaName:参数名称-字符型 ParaType:参数类型-数字型(1表示以上参数是数字,0表示以上参数为字符) Dim ParaValue ParaValue=Request(ParaName) If ParaType=1 then If not isNumeric(ParaValue) then Response.write "参数" & ParaName & "必须为数字型!" Response.end End if Else ParaValue=replace(ParaValue,"’","’’") End if CheckPara=ParaValue End function
这是好多年以前的一个防注入函数了,好像是NB的小竹写的(不去考证了),但不管理怎么样,到现在它针对注入依然有效。现在的防注入系统中,针对字符型参数的屏蔽项很多,个人觉得不太合理。完全是一棒子打死的策略,假设在某个技术论坛中,有人问某条SQL语句怎么写,那他估计这辈子都得在非法字符的对话框中徘徊了。说到底,字符型注入归根结底需要闭合SQL语句,也就是要使用单引号来闭合语句,那么把单引号屏蔽掉就行了。
最后是跨站的问题了,针对本站的漏洞,是可以写入Html或js代码,我们把“<”和“>”都屏蔽掉了,代码就无法被浏览器解释了。其实系统中有对Html字符进行过滤的函数,只是测试站点没用而已。
(1)代码文件:inc/Function.asp
(2)相关代码:
*************************************************
函数名:RemoveHTML
作 用:过滤HTML代码
参 数:strHTML ----原字符串
返回值:过滤后的字符串
*************************************************
Function RemoveHTML(strHTML)
Dim objRegExp, Match, Matches
Set objRegExp = New Regexp
objRegExp.IgnoreCase = True
objRegExp.Global = True
取闭合的<>
objRegExp.Pattern = "<.+?>"
进行匹配
Set Matches = objRegExp.Execute(strHTML)
遍历匹配集合,并替换掉匹配的项目
For Each Match in Matches
strHtml=Replace(strHTML,Match.Value,"")
Next
RemoveHTML=strHTML
Set objRegExp = Nothing
End Function
我们还可以把防注入和防跨站的函数写到一起,这样便于操作。至于跨站的相关知识,不在我们讨论的范畴,哪一天黑防开XSS专栏了,再一起研究。
2、正确取值,防止Cookie注入。上述问题2中的情况,为避免Cookie注入,首先得明白asp Request.QueryString,Request.Form,Request这3种方法的取值顺序。前2种没什么说的,分别就1次Request.QueryString,Request.Form。恰恰是 |