正 文:
Session欺骗一直以来就是入侵者们喜而乐道的一大法宝,尤其是遇上大意的程序员时,黑客们就可以干他们的入侵、提权的事了。06年的时候,eWebEditor编辑器就曾经出现过session欺骗漏洞,一时被爱好者们讨论的特火朝天。直到今天,依然有很多的工具在
扫描此类编辑器的漏洞。
其实,Session欺骗远没有那么恐怖。只要程序员稍微留意一下,这些所谓的Session欺骗就根本不能成功。我们来看看一般的Session欺骗是如何欺骗的:
就拿eWebEditor编辑器说事吧,虽然这个漏洞早就被修复。
If Session("eWebEditor_User") = "" Then
Response.Redirect "admin_login.asp"
Response.End
End If
这个session只是判断是否为空,而并没有判断session里的具体值。
其实,即使这样,入侵者如果没有当前域名下的webshell(如果你有了webshell,还需要欺骗么?呵呵),哪怕取得了同一服务器下其他站点的shell,同样是无法构造 Session欺骗 的。因为 session 是需要验证主机头的,在本地构造 或 在同服务器下其他域名下构造session 都不会成功。
但为了安全,作为程序员或站长,我们应该如何加强我们网站程序的安全性来防止session欺骗呢?
其实很简单,判定session的具体值!在赋值session的时候,这个值不要太大众化了,越个性越好,并且如果你的程序曾经在互联网上公开发布过的话,你一定要自己重新构造这个session值,防止有些不轨之徒下载你写的程序来分析你的session漏洞。
我们只要这么验证就行了:
If Session("eWebEditor_User") <> "ok_WEHK5jkhkkj876ddfg" Then
Response.Redirect "admin_login.asp"
Response.End
End If
注意,
ok_WEHK5jkhkkj876ddfg 这个值要保证没有第二人知道。
当然,我们在给session赋值的时候,用的就是这个独特的session值!
另外,在判断登陆是否成功的时候,记住不要这样写:
"select * from admins where user='"&request("user")&"' and password='"&request("password")&'""
而要这样写:
sql="select * from admin where user='"&过滤后的用户名&"'"
rs.open sql,conn,1,1
If rs.eof and rs.bof Then
response.write "<SCRIPT language=JavaScript>alert('非法登录!');"
response.write "this.location.href='vbscript:history.back()';</SCRIPT>"
response.end
else
If rs("password")<>MD5(password) Then
response.write "<SCRIPT language=JavaScript>alert('非法登录!');"
response.write "this.location.href='vbscript:history.back()';</SCRIPT>"
response.end
else
session("admin_USER_FMIS")="ok_WEHK5jkhkkj876ddfg"
End If
End If
具体为什么,请大家思考吧。
总之,安全在今天这样“黑客”越来越猖獗的的环境下越来越凸显它的重要性。作为站长们,谁希望自己的网站被入侵者们拿去做他们的肉鸡呢?!
看了师傅的文章,独特的session值这个了解了.至于下面判断登陆是否成功判断过滤后的用户名这个了解.是防注入,但为什么要把MD5加密的密码分开判断呢?
sql="select * from admin where user='"&过滤后的用户名&"' and password='"&MD5加密过的密码&"'"
这样写的区别还是不太明白.希望师傅讲解一下.
师傅这两天很忙?没有更新文章嘛,希望有时间的时候帮我解答一下疑惑.谢谢
to 徒弟甲:如果你的用户名、密码严格过滤后,是可以像你这样写的;但如果不进行过滤,那么通过简单的or 1=1 就能绕过密码验证了。