Cookies 欺骗漏洞的防范方法(vbs+js 实现)
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
[b]一、攻击原理 [br][/b]cookies 欺骗主要利用当前网络上一些用户管理系统将用户登录信息储存在 cookies 中这一不安全的做法进行攻击,其攻击方法相对于 sql 注入漏洞等漏洞来说相对要“困难”一些,但还是很“傻瓜”。 [br]我们知道,一般的基于 cookies 的用户系统至少会在 cookies 中储存两个变量:username 和 userlevel,其中 username 为用户名,而 userlevel 为用户的等级。当我们的浏览器访问 asp 页面时,它会传出类似 [br]get /.../file.asp http 1.0 [br]... [br]cookies: username=user&userlevel=1 [br]... [br]的数据包,那么,我们只要知道了管理员的 username 和 userlevel 值(假设分别为 admin 和 5),便可以通过传输 [br]get /.../file.asp http 1.0 [br]... [br]cookies: username=admin&userlevel=5 [br]... [br]来获取管理员权限。很简单是不是?然而,在这个漏洞被发现之前,几乎所有的用户管理系统都依赖于 cookies。 [br][b]二、安全地储存用户信息[/b] [br]既然 cookies 是不安全的,而我们又必须把用户登录信息存储下来,那么应该存储在什么地方呢? [br]我们注意到,在 asp 中,除了 cookies 外,还有 session 可以储存信息。session 是储存在服务器上的,不是客户端随随便便就能够更改的,所以具有极高的安全性。这样,大家就可以把所有 cookies 的代码均换作 session 了。 [br][b]三、长时间储存用户信息[/b] [br]采用 session 来保存用户登录信息,虽然摆脱了 cookies 欺骗的问题,但是 session 不能长期储存(iis 默认 session 在用户停止响应 20 分钟后失效),于是产生了这一节所述的 cookies + session 混合存储法。 [br]这一方法有两个变种,第一种是在 cookies 中储存用户名和密码,当用户访问一个页面时,先读取 session,如果有内容则以 session 为准,否则读取 cookies,按照 cookies 中提供的用户名和密码进行“不透明”的登录一次,用以判断 cookies 中的内容是否合法,若合法再进而存入 session 中。实现这一方法的代码如下: [br]vbs: [br]
[u]复制代码[/u] 代码如下: [br]<% [br]dim username, password [br]username = session("username") [br]if username = "" then [br]' session 中没有用户登录信息 [br]username = request.cookies("username") [br]password = request.cookies("password") [br]' 注意上面的两句得到的 username 和 password 要进行 sql 注入漏洞的防范(即过滤掉单引号“'”),这里略去 [br]if username = "" or password = "" then [br]' 用户没有登录 [br]... [br]else [br]' 这里假设已经创建了 conn 和 rs 对象 [br]rs.open "select top 1 * from [user] where username='" & username & "' and password='" & password & "'", conn, 1, 3 [br]if rs.eof then [br]' cookies 中的信息非法 [br]... [br]else [br]' cookies 中的信息合法,自动登录 [br]session("username") = username [br]... [br]end if [br]end if [br]else [br]' 用户信息已经存在于 session 中,直接读取 [br]... [br]end if [br]%> [br] [p][br]js: [br] [/p] [u]复制代码[/u] 代码如下: [br]<% [br]var username, password; [br]username = session("username") + ""; [br]if (username == "" || username == "undefined") { [br]// session 中没有用户信息 [br]username = request.cookies("username") + ""; [br]password = request.cookies("password") + ""; [br]// 注意上面的两句得到的 username 和 password 要进行 sql 注入漏洞的防范(即过滤掉单引号“'”),这里略去 [br]if (username == "" || username == "undefined" || password == "" || password == "undefined") { [br]// 用户没有登录 [br]... [br]} [br]else { [br]// 这里假设已经创建了 conn 和 rs 对象 [br]rs.open("select top 1 * from [user] where username='" + username + "' and password='" + password + "'", conn, 1, 3); [br]if (rs.eof) { [br]// cookies 中的信息非法 [br]... [br]} [br]else { [br]// cookies 中的信息合法,自动登录 [br]session("username") = username + ""; [br]... [br]} [br]} [br]} [br]else { [br]// 用户信息已经存在于 session 中,直接读取 [br]... [br]} [br]%> [br] [p][br]但是这种方法对于用户来说又不太安全,原因是浏览器每次访问页面时都会把 cookies 传输过去,而包含密码的 cookies 一旦被他人获取将导致用户帐号被盗。对于这种情况,又出现了第二种方法,即在用户信息[url=http://www.waweb.cn/dblist/db.htm]数据库[/url]中增加一个字段“verifycode”,在用户登录时,随机产生一个长整型校验值存入 verifycode 字段,并且将 username 和这个 verifycode 值而不是 password 存入 cookies。而在验证 cookies 中的用户信息时,也只验证 username 和 verifycode。这种方法的好处在于,即使用户的 cookies 被[color=#ff0000]黑客[/color]获取,他也只能利用这个“临时”产生的 verifycode 登录,而无法获得用户的密码。只要此用户再一次使用用户名和密码登录,这个 verifycode 值便会改变,[color=#ff0000]黑客[/color]便无法通过原来的 verifycode 登入。 [br]这种方法的实现只需要在上述方法一的代码上稍加改动。首先,在您的登录程序中,在验证通过存储用户信息的地方需要加上一段: [br]vbs: [br] [/p] [u]复制代码[/u] 代码如下: [br]<% [br]response.cookies("verifycode") = int(rnd * 2100000000) [br]%> [br] [p][br]js: [br] [/p] [u]复制代码[/u] 代码如下: [br]<% [br]response.cookies("verifycode") = math.floor(math.random() * 2100000000); [br]%> [br] [p][br]然后,在上面提供的验证代码中把对 cookies("password") 的验证改为对 cookies("verifycode") 的验证即可。 [br]四、结论 [br]通过我们的分析以及处理,cookies 欺骗漏洞已经被完全解决,从此,我们的 asp 程序变得更加安全了。[/p] 该文章在 2010/3/30 15:24:30 编辑过 |
关键字查询
相关文章
正在查询... |