动网7.0sp2 cookie欺骗原理

本文分析了动网论坛如何通过使用truepassword而非实际密码进行cookie校验来增强安全性,并探讨了这一机制如何防范cookie欺骗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   似乎近年来asp脚本的漏洞都来自动网,从sql注入到cookie欺骗,动网无一不首当其冲。树大招风,无不为奇,但在严酷的磨练下,动网最新的版本似乎无懈可击。但网上关于动网入侵的案例不少,总结起来,其实并非动网本身问题,而属论坛配置或管理不当。
动网论坛目前最新版本sql注入似乎不太可能了,而md5加密的16位密码如果设置比较合理的话,暴力破解也非其对手。
   目前直接入侵动网无非找一些管理上的不当入侵,比如默认的管理员用户名密码,根据默认的数据库路径盗得数据库等。当有了数据库而无法暴力破解管理员密码的话,cookie欺骗就能大展身手!
然而在多次cookie欺骗得手而要对动网下黑手时候,问题出现了,在cookie其中几个值进行修改欺骗并不成功,仔细研究后发现,其中password字段并非md5加密的密文(图1),一般的md5密文均为数字加小写字母或数字加大写字母的形式,大写字母和小写字母放在一起,一定是利用了另外的算法处理了密码。
图1
打开动网的源代码,从index.asp文件中跟踪到inc/Dv_ClsMain.asp,发现这样几个函数:
If checkStr(Trim(Request.Cookies(Forum_sn)("password")))=TruePassWord Then
   Execute("UpDate [Dv_user] Set TruePassWord='"&TruePassWord&"' where UserID="&UserID)
   MemberWord = TruePassWord
Dim iUserInfo
   iUserInfo = Session(CacheName & "UserID")
   iUserInfo(35) = TruePassWord
   Session(CacheName & "UserID") = iUserInfo
  End If
第一句校验如果用户cookie中的password字段值等于数据库中truepassword的值,等会,truepassword,这是什么意思?打开动网的数据库,果然在dv-user字段中发现userpassword和truepassword两个字段,那这个truepassword是做什么用的呢?
继续跟踪这个函数:
  Public Sub NewPassword0()
  If UserID=0 Then Exit Sub
  If Not Response.IsClientConnected Then
   Exit Sub
  End If
  Dim TruePassWord,usercookies
  usercookies=Request.Cookies(Dvbbs.Forum_sn)("usercookies")
  TruePassWord=Createpass
  If (Isnull(usercookies) or usercookies="") And Not Isnumeric(usercookies) Then usercookies=0
  Select Case Cint(usercookies)
   Case 0
    Response.Cookies(Forum_sn)("usercookies") = usercookies
   Case 1
       Response.Cookies(Forum_sn).Expires=Date+1
 Response.Cookies(Forum_sn)("usercookies") = usercookies
   Case 2
    Response.Cookies(Forum_sn).Expires=Date+31
    Response.Cookies(Forum_sn)("usercookies") = usercookies
   Case 3
    Response.Cookies(Forum_sn).Expires=Date+365
    Response.Cookies(Forum_sn)("usercookies") = usercookies
  End Select
  Response.Cookies(Forum_sn).path=cookiepath
  Response.Cookies(Forum_sn)("username") = MemberName
  Response.Cookies(Forum_sn)("UserID") = UserID
  Response.Cookies(Forum_sn)("userclass") = checkStr(Request.Cookies(Forum_sn)("userclass"))
  Response.Cookies(Forum_sn)("userhidden") = UserHidden
  Response.Cookies(Forum_sn)("password") = TruePassWord
  '检查写入是否成功如果成功则更新数据
  If checkStr(Trim(Request.Cookies(Forum_sn)("password")))=TruePassWord Then
   Execute("UpDate [Dv_user] Set TruePassWord='"&TruePassWord&"' where UserID="&UserID)
   MemberWord = TruePassWord
   Dim iUserInfo
   iUserInfo = Session(CacheName & "UserID")
   iUserInfo(35) = TruePassWord
   Session(CacheName & "UserID") = iUserInfo
  End If
End Sub
可以看出,论坛在对用户的cookie进行校验的时候,其中的密码项是用一个truepassword进行对照的,而在这个函数中,truepassword定义后赋值的时候给的是这个值:TruePassWord=Createpass,查看createpass函数,
 Public Function Createpass()
  Dim Ran,i,LengthNum
  LengthNum=16
  Createpass=""
  For i=1 To LengthNum
   Randomize
   Ran = CInt(Rnd * 2)
   Randomize
   If Ran = 0 Then
    Ran = CInt(Rnd * 25) + 97
    Createpass =Createpass& UCase(Chr(Ran))
   ElseIf Ran = 1 Then
    Ran = CInt(Rnd * 9)
    Createpass = Createpass & Ran
   ElseIf Ran = 2 Then
    Ran = CInt(Rnd * 25) + 97
    Createpass =Createpass& Chr(Ran)
   End If
  Next
 End Function
这是一个系统分配随机密码的函数,通过跟踪下边这个函数:
Public Sub NewPassword()
  If UserID=0 Then Exit Sub 
Response.Write "<iframe width=""0"" height=""0"" src=""newpass.asp"" name=""Dvnewpass""></iframe>"
 End Sub
可以得出结论:动网在用户打开页面的时候,通过cookie检查用户的信息,然后进行密码校验的时候并不是通过用户的真实password,而是通过一个truepassword进行验证,如果验证通过,则重新分配一个随机密码createpass,刷新数据库中truepassword的值为createpass,然后用户登陆信息写入服务器端session;当cookie校验不能通过的时候,显示登陆错误信息,调用登陆页面,提示用户登陆,当用户输入正确的用户名密码的时候(这次的验证在login.asp页面中的Dvbbs_ChkLogin函数中),用户正确登陆,系统仍然分配一个随机的密码储存在truepassword字段中,供下次登陆校验用。
可以看出,动网论坛在防止cookie欺骗上确实下了一番工夫,是不是这样就不能进行欺骗了呢?不是:当你要进行对动网的欺骗的时候,只要把cookie中password中的值替换成数据库中truepassword的值就可以,但要注意:从你盗得数据库到你进行欺骗的中间,你要使用的帐户不能再登陆,否则数据库中的truepassword值又会更新,那你那时候肯定是欺骗不成功的!
可以看出,动网论坛在各个地方考虑都是很周到的,虽然cookie验证的代码增加了好多,但为了安全性的提高降低了程序的效率,也是有必要的,这样一来,动网的安全性才能在磨练中不断提升!
通过这次分析,初学者应该学会对程序的跟踪和分析,其实也是每个学编程的必须掌握的知识。在碰到这类问题的时候,拿出程序的代码仔细分析,你肯定会有新的发现,可能下一个首发漏洞的发现者就是你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值