主题:  登录补遗:关于登录漏洞的解决

5D荣誉斑竹

职务:普通成员
等级:2
金币:2.0
发贴:654
注册:2000/12/19 10:59:22
#12001/5/11 18:59:23
多级用户登录教程先提供部分。。。。。

数字面包网站现已重新开通!
  地址:http://211.99.210.100/01470/default.asp
  最近会加入面包最新写的多级用户登录教程,自认为这个教程是面包写得最为规范的一个了,当然希望各位多提意见可以让面包做的更好!
  以前说起的macromedia公司的插件实在是因为没有时间录入,现在完成了300个左右的插件,或者过几天也会先提供的!

数字面包的网站开张有半年左右了,面包其实是一点不懂什么网络程序的,就靠UltraDev会做些小东西。也是因为工作的一些因素所以面包对UltraDev相对熟悉一些,一直以来面包努力把自己所知道的、所会的尽可能的公布给网友,也算为UltraDev在国内应用尽一份自己微薄的力量吧。
  改版的想法由来已久,只是一直没有行动。原因很简单,没有好的、完整的思路。包括上次说的联盟也是如此。这次面包很想有个完整的策划做好这次网站的改版。
  有次见到大富翁论坛和udzone.com有些启发。所以这次面包想将网站做成开放式的,并且是需注册用户的。就是说只要是用户都有义务为UltraDev的推广出力,你要获得别人的资料必须有自己的付出。再将论坛和网站合在一起,包括源码、资料、教程等等。获得和支出以分数形式显示,当然,初级用户也不用担心,可以做些基础的工作来得到分数。因为这个系统应该很复杂,所以面包想请众位UltraDev网友出点建议,包括各个栏目设置的具体形式,需要多少字段等等。
  栏目:
  更新动态
  业界新闻
  UD教程
  UD插件
  UD源码
  UD系统
  UD资料
  相关资源
  留言簿
  友情系统
  调查系统
  收藏系统
  UD论坛
  总之花样太多,其中细节一时说不了,欢迎大家讨论^_^
  个人认为udzone的形式不错,应该可以借签,并且这次改版将用UltraDev制作,不到万不得已不改动源码,这不光是对面包的一次考验也是对UltraDev功能的一次检验。
---------------------------------------
使用UltraDev4.0制作的登录系统有个登录漏洞,其实这个不是UltraDev的原因,该漏洞很早就已经在网上流传了,最近网友spm提醒说是UltraDev4制作的也同样存在这个问题。经过测试,果然可以用字符串轻易通过用户验证。让我们先对漏洞本身有个了解再作打算……
…………
很多Asp程序把密码放到数据库中,在登陆验证中用以下sql:
sql="select * from user where username='"&username&"'and pass='"& pass&'"
此时,您只要根据sql构造一个特殊的用户名和密码,如:ben' or '1'='1
这样,程序将会变成这样: sql="select*from user where username="&ben'or'1'=1&"and pass="&pass&"
学过编程的应该知道: or 是一个逻辑运算符,作用是在判断两个条件的时候,只要其中一个条件成立,那么等式将会成立.而在语言中,是以1来代表真的(成立).那么在这行语句中,原语句的"and"验证将不再继续,而因为"1=1"和"or"令语句返回为真值.
…………(以上摘录于网络)
现在我们知道了,利用“' or '”作为用户名和密码可以登陆UltraDev4生成的登陆系统,那可是个大问题。没有站长喜欢别人随便登陆自己网站的管理页的,我们再来看看UltraDev4生成的登陆代码
…………
MM_LoginAction = Request.ServerVariables("URL")
If Request.QueryString<>"" Then MM_LoginAction = MM_LoginAction + "?" + Request.QueryString
MM_valUsername=CStr(Request.Form("Aadmin"))
'从表单内Aadmin域中取得用户名的变量MM_valUsername
If MM_valUsername <> "" Then
MM_fldUserAuthorization=""
MM_redirectLoginSuccess="admin.asp"
MM_redirectLoginFailed="error.htm"
MM_flag="ADODB.Recordset"
set MM_rsUser = Server.CreateObject(MM_flag)
MM_rsUser.ActiveConnection = MM_connBHP_STRING
MM_rsUser.Source = "SELECT fAdmin, fPassword"
If MM_fldUserAuthorization <> "" Then MM_rsUser.Source = MM_rsUser.Source & "," & MM_fldUserAuthorization
MM_rsUser.Source = MM_rsUser.Source & " FROM tAdmin WHERE fAdmin='" & MM_valUsername &"' AND fPassword='" & CStr(Request.Form("Apassword")) & "'"
'SQL语句中密码值是通过表单中的Apassword来获取
…………
在注释部分我们找到了登录动作的要点:用户名是在表单中Aadmin域直接获得存放入变量MM_valUsername,而密码则是直接从Apassword域中获得值。从VBScript的基础可以知道Replace是一个返回字符串函数,可以指定某子字符串被替换为另一个子字符串。那么在以上代码中我们将用户输入的“'”进行替换为其它字符就可以轻易达到封闭该漏洞的效果。

MM_luser=CStr(Request.Form("Aadmin"))
'建立变量MM_luser获得表单内Aadmin域的值
MM_valUsername=Replace(MM_luser,"'","")
'如果变量MM_luser中存在“'”字符则利用Replace将之替换为空,然后把值放入用户名变量MM_valUsername
MM_lpassword=CStr(Request.Form("Apassword"))
'建立变量MM_lpassword获得表单内Apassword域的值
MM_valUserpassword=Replace(MM_lpassword,"'","")
'如果变量MM_valUserpassword中存在“'”字符则利用Replace将之替换为空,然后把值放入密码变量MM_lpassword

完成对“'”字符的替换后将变量写入代码如下:
…………
MM_LoginAction = Request.ServerVariables("URL")
If Request.QueryString<>"" Then MM_LoginAction = MM_LoginAction + "?" + Request.QueryString
MM_luser=CStr(Request.Form("Aadmin"))
MM_valUsername=Replace(MM_luser,"'","")
MM_lpassword=CStr(Request.Form("Apassword"))
MM_valUserpassword=Replace(MM_lpassword,"'","")
If MM_valUsername <> "" Then
MM_fldUserAuthorization=""
MM_redirectLoginSuccess="admin.asp"
MM_redirectLoginFailed="error.htm"
MM_flag="ADODB.Recordset"
set MM_rsUser = Server.CreateObject(MM_flag)
MM_rsUser.ActiveConnection = MM_connBHP_STRING
MM_rsUser.Source = "SELECT fAdmin, fPassword"
If MM_fldUserAuthorization <> "" Then MM_rsUser.Source = MM_rsUser.Source & "," & MM_fldUserAuthorization
MM_rsUser.Source = MM_rsUser.Source & " FROM tAdmin WHERE fAdmin='" & MM_valUsername &"' AND fPassword='" & MM_valUserpassword & "'"
…………
这样就可以避免不怀好意的用户利用该漏洞来登录了。
其次我们还要考虑到用户注册时在用户名或密码中使用了“'”,那么岂不是无法登录了。那么我们在应该在注册页面上禁用该字符进行注册,一般可以利用JS来验证表单中文本域的内容来做到:



其中form1是登录表单名;l_user是用户文本框;l_password是密码文本框。
好了,经过这样的更改,这个登录系统对于“' or '”应该是没有顾虑了,即使有其它字符也可以用类似的方法来解决。你可以前往我的网站去测试这个登录系统。
地址:http://ultradev.my001.net

编辑历史:[这消息被数字面包编辑过(编辑时间2001-06-06 22:52:43)]
[这消息被数字面包编辑过(编辑时间2001-06-11 23:06:09)]
[这消息被数字面包编辑过(编辑时间2001-06-11 23:14:59)]
[这消息被数字面包编辑过(编辑时间2001-06-13 10:42:15)]
[这消息被数字面包编辑过(编辑时间2001-07-12 22:47:45)]


哭鱼

职务:普通成员
等级:1
金币:0.0
发贴:15
注册:2001/5/11 13:26:07
#22001/5/11 19:16:21
~~~~~~~~~啊呀,要动大手术了!虽然我到这儿没有多久,可是学到了不少西西哦~~~!很难想像面包+数字……是什么样的一个人啊~~~~~!!!笑~~!
真的很佩服你的技术…………哈哈哈!!!
改版吗~~~~我赞成!!!因为只有越做越好的,还有,UD系统 和 UD资料 和 相关资源 吗不知道你怎么划分的,我觉得 UD资料 就可以概括 UD系统、UD资料 和 相关资源了,要不栏目太多会很难找的……这只是我的片面之词,不要介意,小的才刚出道不久,还请多多关照呀~~~~~!:P



5D荣誉斑竹

职务:普通成员
等级:2
金币:2.0
发贴:654
注册:2000/12/19 10:59:22
#32001/5/12 8:11:49
因为这次会是一个比较繁复的东西,所以细节非考虑清楚不可。。。。。
先举例说一个次要的:友情链接。除了必要的网址说明、图标、链接以外还可以有什么呢?
或者是点击次数、类别(是否要分UltraDev类和非UltraDev类的?)、链接形势(图标类还是文字类还是两者都有,那么又该如何区别?)、对于链接是否需要网友评价?、好的链接提供者是否需要加分。。。。。。。。。。。哎呀,太烦了。。。。。



romp

职务:普通成员
等级:1
金币:0.0
发贴:141
注册:2001/1/10 21:59:40
#42001/5/12 9:06:55
其实我觉得我们是不是走进了一个误区!
有些工具只是方面我们做一个网页或网站!
用来丰富网洛没必要大家都搞技术交流!
一个人5D
就行了!
所以我想是不是做一些娱乐的好点?!



5D君子

职务:普通成员
等级:4
金币:10.0
发贴:1453
注册:2001/2/22 13:43:15
#52001/5/12 9:51:15
用来丰富网洛没必要大家都搞技术交流!
同意…
多推荐一些好的资源站点…
不要老弹出哪个窗口…
呵呵………………………

我刚开始学这个软件…
大佬以后照我…



5D荣誉斑竹

职务:普通成员
等级:2
金币:2.0
发贴:654
注册:2000/12/19 10:59:22
#62001/5/12 12:18:28
Heman在上个贴子中说
引用:
用来丰富网洛没必要大家都搞技术交流!
同意…
多推荐一些好的资源站点…


有没有搞错?大家都去娱乐哪里还来资源站点?
网络需要大家的热情,只要获得没有付出那也太。。。。。。。。



5D君子

职务:普通成员
等级:4
金币:10.0
发贴:1453
注册:2001/2/22 13:43:15
#72001/5/12 13:06:01
我也只是同意这一条而已…
都搞交流分散精力…
高手本就不多…
集中起来才好呀…

上个贴子没说明白…
sorry~~~~~~
我认为
你改版的话…
肯…乐…不贴边………

上个贴子没说明白…
sorry~~~~~

还有…我最有热情啦……



weicong

职务:普通成员
等级:1
金币:1.0
发贴:136
注册:2001/5/13 13:40:55
#82001/5/13 14:00:59
面包你太谦虚了。做成跟象大富翁论坛这样的形式,是一个好注意,但是有很多问题需要考虑的,我举一些(也许你知道的)例子:
1.如果分数很难赚,就会造成没有人访问。
2.如果分数太容易赚了,有没有什么意义。
3.可能会造成没有分数的问题,回答的人少的情况。这时如果注册时有原始分,会造成大量的没用注册。
4.作弊:自己问自己答。
我在经常到大富翁论坛的,其实问题还有。



5D荣誉斑竹

职务:普通成员
等级:2
金币:2.0
发贴:654
注册:2000/12/19 10:59:22
#92001/5/14 21:21:46
weicong在上个贴子中说
引用:
1.如果分数很难赚,就会造成没有人访问。
2.如果分数太容易赚了,有没有什么意义。
3.可能会造成没有分数的问题,回答的人少的情况。这时如果注册时有原始分,会造成大量的没用注册。
4.作弊:自己问自己答。
我在经常到大富翁论坛的,其实问题还有。

感谢weicong说的这些问题,其实分数的问题不是很重要,我并不是想以分数来约束网友,只是一个提醒:不要忘了帮助其他人而已。所以如果分数形式行不通将会以审核高级用户的方式进行,只有热心的UltraDev网友方可较其他网友早些时候获得新的资料。呵呵,记住只是热心的UltraDev网友,并不在乎其技术高低。。。。
现在的问题还是系统的建立。。。。。我会尽快动手。。。。希望得到建议。。。。



weicong

职务:普通成员
等级:1
金币:1.0
发贴:136
注册:2001/5/13 13:40:55
#102001/5/14 21:36:54
热心的UltraDev网友?但是象我这样,一个经常发一些无聊贴子的人,这样算热心吗?



mp3ss

职务:普通成员
等级:5
金币:10.0
发贴:2567
注册:2000/12/9 17:46:25
#112001/5/16 16:32:37
我技持你,面包。好好干。提个小建议,网站的教程加上示例代码和图片。



小快

职务:普通成员
等级:1
金币:0.0
发贴:6
注册:2001/5/14 16:46:12
#122001/5/17 19:33:42
加个在线人数,并可以相互对话的weboicq岂不是更好??
交流也方便一点嘛。省得大家都象是在潜水~~~



5D荣誉斑竹

职务:普通成员
等级:2
金币:2.0
发贴:654
注册:2000/12/19 10:59:22
#132001/5/17 20:48:48
谢了,各位!
在线交流是好注意,不过用UltraDev如何实现倒是没有想到^_^



flyheaven

职务:普通成员
等级:1
金币:0.0
发贴:7
注册:2001/5/15 15:58:35
#142001/5/18 2:31:39
面包:
支持你继续努力,但是我是新手,能力有限。使用UD是十天前,因为毕业设计的关系。使用后,很喜欢。只是自己实在有愧计算机专业毕业,问题不断,熬了几个通宵了~呵呵,笨笨呢~~没办法,没怎么编过程序,UD资源太少。希望得到指点。
可惜设计做完,没什么条件混迹网络了~:(
只好等7月工作于电脑中,继续研究了~~希望那时侯进展神速了~~大家就继续努力了~~UD朋友们~~
让技术交流的更多,我很支持,网络的最终目的不是简单共享,而是互助互动,方勃勃生计。



轩辕适

职务:普通成员
等级:1
金币:0.0
发贴:13
注册:2001/5/11 11:31:14
#152001/5/22 12:01:04
加油吧