ASP站点安全性

ASP   2024-12-25 14:37   91   0  

一、SQL注入漏洞

这里举一个简单的例子,在ASP站点的登陆页面中输入以下内容

用户名:admin
密   码:' or ''='

因为

rs.open "select * from userdata where name='"&name&"' and pass='&pass&'"

想必大家都知道这个语句怎么用,但是如果合并上述用户名和密码后,这个SQL语句就是

rs.open "select * from userdata where name='admin' and pass='' or ''=''"

想必大家能看明白是怎么回事情了吧。

那么解决之道便是在执行SQL查询之前对嵌入SQL语句的姓名和密码进行过滤。常用的一个Replace函数为:

Function ReplaceBadChar(strChar)
if strChar="" then
   ReplaceBadChar=""
   Exit Function
end if
ReplaceBadChar=Replace(ReplaceBadChar,"'","")
ReplaceBadChar=Replace(ReplaceBadChar,"*","")
ReplaceBadChar=Replace(ReplaceBadChar,"?","")
ReplaceBadChar=Replace(ReplaceBadChar,"(","")
ReplaceBadChar=Replace(ReplaceBadChar,")","")
ReplaceBadChar=Replace(ReplaceBadChar,"<","")
ReplaceBadChar=Replace(ReplaceBadChar,">","")
ReplaceBadChar=Replace(ReplaceBadChar,".","")
End Function

这种方法采用的是过滤非法字符,难免有考虑不周全的地方。那么换一个思路:只选择安全字符!
但是我们不愿意为了选择A~Z以及a~z和0~9这些字符写上62条Replace语句或者Instr语句,考虑使用正则表达式变容易的多也简洁得多了:

Function dealUserName(userName)
Dim RegExpObj
Dim resultStr

Set RegExpObj=new RegExp
RegExpObj.Global = True
RegExpObj.Pattern="[^a-zA-Z0-9_]" '只允许字母、数字和下划线
resultStr = RegExpObj.replace(userName,"")
  
Set RegExpObj=nothing
dealUserName=resultStr
End Function


二、留言版和信息发布

这里里面存在两个问题,一个是留言内容安全性问题,一个留言发布验证码问题。

·留言内容安全性问题
这个问题比那个漏洞能差点,至少你数据能保住。一般设计留言版都直接使用这样的模式:

存:rs("MsgContent")=表单提交信息
取:<%=rs("MsgContent")%>

在感觉上这样是没有什么问题,但是我如果在留言版输入如下代码:

<script language="javascript">while (true){ window.open("程序炸弹地址 /bomb.htm","","fullscreen=yes,Status=no,scrollbars=no,resizable=no");}</script>

最容易想到的解决方法是Replace过滤,但是这并不是一个好的方法,因为过滤或许使得很多内容不能正确显示;
当然采用UBB模式是一个解决途径,这也是网上多数留言系统所兼容的输入模式;
另外一个推荐的方法是使用Server.HTMLEncode()这个函数,可以把用户输入的HTML代码按照原样显示出来,而不会直接执行。



·留言发布验证码问题
!!!验证码成功发布留言后,要重置Session!!!

网上多数验证码采用的模式是产生一个随机字符串,然后存入Session并绘制成图片输出到客户端,这在一定程度上避免了自动发帖机的批量发帖,但是存在这么一个问题:

在发帖成功后使用history.back()或者使用后退返回上级再次点击提交留言仍能再次发布(如果留言板没有重复留言过滤功能的话)!!!

这当然不是我们所想要的,问题根源所在就是在保存了留言之后没有重置Session,导致用户再次同样提交时仍是Session匹配的,此时验证码形同虚设!

除了重置Session、重复留言判断外还有一个方法就是每次页面加载时使用JS脚本重置验证码:
<div id="CheckCode"></div>
<script language="javascript">
window.onload=dealImg;
function dealImg()
{
document.getElementById("CheckCode").innerHTML='<img src="http://sojuker.blog.163.com/blog/checkCode.asp?rand='+ Math.random() +'"/>';
}
</script>


三、FSO图片上传问题

犯这个错误的人已经很少了,不过不表示没有。在上传图片的时候不限制扩展名。

比如我传一个ASP的FSO木马或者通过SHELL执行程序。以及其他方式,就可以完全操控服务器!


四、URL字符串参数安全问题

这个问题的严重级别说大不大说小不小,这要看你传递的参数的重要性了。要知道任何有恶意的人都

可以随便修改URL参数,程序在接收到参数之后是否应该进行严格检查呢?不言而喻。

举个简单例子:

在多数根据ID查询的功能中都是通过URL传递ID值的,而且不加控制就放在了SQL语句中:

rs.open "select * from newsdata where id="&trim(Requst.QueryString("id"))

可想而知,这个问题是多么的严重!!!------cint


博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。