一个CMS网站“修理”实录

软件与互联网技术
aRNoLD
Advanced Member
Posts: 982
Joined: Thu May 13, 2004 11:10 am

Post by aRNoLD »

先声明一下,这只能算是一篇实录,并非教学性质文章,因为我并不是个懂ASP或PHP代码的“黑客”,所以如果你抱着学“黑骇”技术看这篇文章的同时又是一个懂些技术的人才,那你什么也得不到,仅是浪费了一些时间;如果你是个对电脑有兴趣有时又得做些办公室里的网络维护或网络信息发布的行政人员,那么也许这篇原创的文章对你有些用处。

事情的起缘
系里的网站是架在学校的服务器上的,并没有给数据库等高级一些的权限,因此要使用动态元素最简单的办法就是利用一些无数据库支持技术的代码,比如ASP或PHP等。在系的BBS上架了雪人论坛,然后通过首页调用将最新的文章标题引用到首页上完成一种动态的显示:这样有些消息或内容就不用网站维护人员天天或时时更新,只要秘书在后台加一个消息贴就告成。
现在,团支部也要架这样的一个网站,某班级同学拿着在本机IIS下做好的整站要求上传到学校的服务器上(后来才明白这不是一个网站,而是个CMS系统,即内容管理系统,脱胎于一个新闻发布系统)。本以为它是靠数据库驱动,但不料传上之后即可以使用。目前这类CMS系统有不少是架于PHP代码语言的,MANBO就是一个曼妙的开源代码程序,由于使用过,因此在试用了同学交来的程序后觉得比较粗糙,不过下面我要处理的部分可能也正由于其粗糙而显得容易些。
要完成整站的设定,必须要有管理员帐号,而他们并没有给我。对于外人修改过的这类东西,危险性是比较大的,因为其中可能含有不良代码,作为网站维护人员来说,起码要拥有管理员帐号/权限。
aRNoLD
Advanced Member
Posts: 982
Joined: Thu May 13, 2004 11:10 am

Post by aRNoLD »

整个网站包的结构比较乱,或者说并没有整理到位。我新注册了一个帐号,是归于用户级的,当然进不了管理面板。但这个代码程序的粗糙之处在于管理帐号登录后台的链接是不受保护的,任何级别的用户都可以在任一页面下看到。

由于所有的ASP源代码都在FTP中,所以开始找管理员登录代码页。
根目录下有admin_login.asp文件,通过查看代码

Code: Select all

<!--#include file="conn.asp"-->
<!--#include file="const.asp"-->
<!--#include file="top.asp"-->
......省略
<form method="post" action="admin_chklogin.asp">
可知此文件另连两个重要文件是
const.asp

Code: Select all

<%  
On Error Resume Next
set rs=server.createobject&#40;"adodb.recordset"&#41;
set conn=server.createobject&#40;"adodb.connection"&#41;
DBPath = Server.MapPath&#40;"newsxp.asa"&#41;
conn.Open "driver=&#123;Microsoft Access Driver &#40;*.mdb&#41;&#125;;dbq=" & DBPath
%>
admin_chklogin.asp

Code: Select all

<!--#include file="conn.asp"-->
'<!--#include file="session.asp"-->
<%
username=checkin&#40;trim&#40;Request.form&#40;"username"&#41;&#41;&#41;
password=checkin&#40;trim&#40;Request.form&#40;"password"&#41;&#41;&#41;
if username="" or password="" then Response.Redirect &#40;"admin_login.asp"&#41;

sql="select * from user where username='"&username&"'and password='"&password&"'"
rs.open sql,conn,1,3
if not rs.EOF then
rs&#40;"LoginTimes"&#41;=rs&#40;"LoginTimes"&#41;+1
rs&#40;"LoginTime"&#41;=now&#40;&#41;
rs&#40;"LoginIP"&#41;=Request.ServerVariables&#40;"REMOTE_ADDR"&#41;
rs.Update

session&#40;"xpUser"&#41;=UserName
session&#40;"xpPwd"&#41;=PassWord
'Session&#40;"AdminID"&#41;=rs&#40;"id"&#41;
'Session&#40;"username"&#41;=rs&#40;"username"&#41;	
Session&#40;"IsAdmin"&#41;=true
'Session&#40;"KEY"&#41;=rs&#40;"oskey"&#41;
Session&#40;"KEY"&#41;="super"
Session&#40;"LoginIP"&#41;=rs&#40;"LoginIP"&#41;
Response.Redirect &#40;"admin.asp"&#41;
else
errmsg="<li>请输入正确的管理员名字和密码!</li>"
aRNoLD
Advanced Member
Posts: 982
Joined: Thu May 13, 2004 11:10 am

Post by aRNoLD »

通过第一段代码可知没用数据库的另一个解决方案是用了一个newsxp.asa的文件,这个文件只要将后缀改掉,即可以用ACCESS打开进行修改,这样可轻易获得得管理员的信息,从而进入后台管理面板,但手头没有安装ACCESS,只好用另一个办法了。看第二段代码,这是为验证身份用的,如果符合管理员的注册登录信息那么就通过并显示后台管理面板,而这正是我想要做的(把自己的普通帐号加为管理员的并修改整站当然得上管理员帐号了)。
第一部分两句
username=checkin(trim(Request.form("username")))
password=checkin(trim(Request.form("password")))
是从登录页面获取用户名和密码的

以下这句是句标准的SQL查询,即从admin的表中找出记录并与在登录页面上输入的信息对比,如果符合就进入下一步。可问题是我的注册帐号只是普通会员级别,怎么办?于是找到另外的普通会员登录代码(在userchklogin.asp这个文件中找),查到普通会员的表名是user,因此将下面的原句中admin改为user。
sql="select * from <span style='color:red'>Admin</span> where username='"&username&"'and password='"&password
注意到这个文件接下去有一句

Code: Select all

rs&#40;"LoginIP"&#41;=Request.ServerVariables&#40;"REMOTE_ADDR"&#41;
意思获取你登录的IP地址(干坏事的话你的IP就被记录了,所以可以用'把它注掉)!一来我有FTP的上传权限,是光明正大的修改并获取管理员帐号(虽然我当时谁也没告诉),二来除了程序这里有记录外,服务器日志及防火墙等处也应该有记录,所以我也不当小人了就不消迹灭尸了。 :qqb023:
aRNoLD
Advanced Member
Posts: 982
Joined: Thu May 13, 2004 11:10 am

Post by aRNoLD »

Code: Select all

session&#40;"xpUser"&#41;=UserName
session&#40;"xpPwd"&#41;=PassWord
'Session&#40;"AdminID"&#41;=rs&#40;"id"&#41;
'Session&#40;"username"&#41;=rs&#40;"username"&#41;	
Session&#40;"IsAdmin"&#41;=true
'Session&#40;"KEY"&#41;=rs&#40;"oskey"&#41;
Session&#40;"KEY"&#41;="super"
Session&#40;"LoginIP"&#41;=rs&#40;"LoginIP"&#41;
接下来说说关于SESSION的验证关。这里的代码就是用保存的SESSION来进一步验证管理员信息的。
原来的代码是

Code: Select all

Session&#40;"AdminID"&#41;=rs&#40;"id"&#41;
Session&#40;"username"&#41;=rs&#40;"username"&#41;	
Session&#40;"IsAdmin"&#41;=true
Session&#40;"KEY"&#41;="oskey"
Session&#40;"LoginIP"&#41;=rs&#40;"LoginIP"&#41;
从这里看,首先它要求你是管理员登录,并会到后台查你的管理员ID,然而我注册的帐号不是管理员级的,然后它查你是不是管理员(IsAdmin),这里如果值为“是true”,则又对上号了,最后还有一关是要对KEY值,因为其中的管理员也分三六九呢。

这时根据admin_chklogin.asp文件头部的信息知道还有一个session.asp文件,找到它并打开,其中的部分相关代码是

Code: Select all

'---------------------检查初级和中级管理员-------------------------------
function checkAdmin1
if Session&#40;"IsAdmin"&#41;<>true then response.redirect "admin_login.asp"
end function

'---------------------检查高级级管理员-------------------------------
function checkAdmin2
if Session&#40;"IsAdmin"&#41;<>true or &#40;session&#40;"KEY"&#41;<>"senior" and session&#40;"KEY"&#41;<>"super"&#41; then response.redirect "admin_login.asp"
end function

'---------------------检查超级级管理员-------------------------------
function checkAdmin3
if Session&#40;"IsAdmin"&#41;<>true or session&#40;"KEY"&#41;<>"super" then response.redirect "admin_login.asp"
end function
可见我想要的KEY值是super,好了,把这个值代到上面的oskey中,这样登录进去后我就是超管了。
aRNoLD
Advanced Member
Posts: 982
Joined: Thu May 13, 2004 11:10 am

Post by aRNoLD »

开始自己改的地方不全,因此登录进了面板可却看不到真正的管理选项,无法管理和修改,现在全部改完了,顺利登录进入(其实还不算完,因为还有一个logout的管理员项,但我的目的是把自己加到管理员帐号中,所以登录出时出错已经不要紧了)。

后来的对模板、CSS、版块内容等的设置相对来说就简单多了,虽然也折腾了许久,但都是手力活了。

对很多办公室人员来说,往往中小企业不会找个全能的网络管理员,更不可能配一套网络宣传部队,因此在这个时代中,老板往往会要你以一当十的去做好多事,总是会将你榨干到最后一滴血----如果你有的话。人并不是全能的,能把信息化的工作做到多好有时还是看你对电脑技术熟悉多少,而不是精通多少,因为许多人并不是吃这碗饭的,不是这个专业的。那么我们需要的就是技巧而暂时非技术。

其实,架立一个内容管理系统,你也可以做得到,但拿到各类源代码后总要修改一些东西,这篇贴子希望给大家一些启示。

Who is online

Users browsing this forum: ClaudeBot [Bot] and 0 guests