|
今天去中国站长站下载频道查看本程序的下载情况,无意中发现某大侠留下了一个文章地址。我很好奇的点开看了一下,原来是红黑联盟某位大侠写的一篇针对我所写的CommonSite系统的一个安全漏洞分析文章。总的来说,文章涉及到的漏洞确实是存在的,有些是我故意偷懒,有的是疏忽所致,这点我要检讨,并且会尽快补发一个版本进行完善。不过,这些漏洞其实也不是非常可怕,只要用户在上线之前把后台目录名改的复杂点,基本上就不会有太大问题了。其他诸如上传模块、编辑器等高危模块的权限验证等重要问题我是一点也不敢偷懒的,而前台的结构设计我也费尽心机去避免被SQL注入。也就是说,只要你把后台地址藏好,整个网站其实还是比较安全的。也正是因为这样,所以我在写代码的时候才偷懒没把文章提及的这些后台问题当作问题和漏洞去看待,也因此没做什么处理,不过我确实应该就这些问题提前做个文档给用户进行说明。因为如果用户不做任何处理,连后台地址都不懂得隐藏,直接把本代码放到服务器上去建网站,这些漏洞就是致命的。不管怎么样,漏洞是存在的,因此我还是要检讨。
我觉得文章写得有点意思,因此在中国站长站下载频道CommonSite的下载页面留了言。留言内容如下:
===================================================================================
我是本程序作者。9楼的文章我看过了。一个小系统不知道为什么引起了黑客大侠的兴趣。文章主要针对后台的安全性进行了评论,说实话,很中肯。强烈建议本程序的用户看一下这篇文章,这样就知道怎么防范了。其实后台我没做多少安全优化,因为如果你的后台目录已经暴露,那么做多少安全措施都无济于事,很多暴力方式可以把你的站点搞死。反过来,如果对方压根不知道你的后台在哪,就很难进行攻击。因此我把安全重点放在前台和编辑器的权限验证上。前台我特意设计成只有数字参数的结构,这样可以比较容易的挡掉注入攻击。FCKeditor的漏洞我用后台权限给弥补了,因此网站安全与否全赖后台隐藏的好不好了。所以强烈建议CommonSite的用户在网站上线时把后台目录修改成一个32个字符以上无规律的字母数字组合,越复杂越好。再次强烈推荐本程序的用户仔细看看9楼推荐的文章。其实很多基本的安全常识我很想找机会跟我的用户交流,特别是像我这种开放源代码的程序,别人很容易有针对性的去攻击。这个程序我08年上半年推过一回,因为后来太忙,放置了一年多。再来站长下载发布该程序的时候,很欣喜的发现站长下载有了交流网站安全的氛围,我觉得这是好事。欢迎交流
再交代一件事,修改本代码后台目录名称后,可能会发现编辑器上传图片的功能出问题。这是因为FCKeditor有一个参数是定义在inc/config.asp里的,就是manageFolder = "/management"这一行。该行定义的是后台的目录名称,请一定要修改该行的参数值,FCKeditor才能正常使用。感谢大家对CommonSite的支持,我会努力为大家做一个易用、实用的企业建站系统。
我确实觉得这篇文章有必要让我的用户都看到,因为这里包含了一个很浅显的建站常识:隐藏好后台地址。下面是该大侠的文章正文,发在这里与大家共同学习(有些地方我会有针对性的进行一些说明):
=============================================================================
本文可以在此和作者交流:http://bbs.7747.net/read.php?tid=125609
红黑联盟http://www.7747.net/
今天在中国站长网发现一个今天更新的程序,这程序是2009-12-10 13:05:53一点钟更新的,到我现在写这文章为止20.15分已经有云起企业建站系统CommonSite下载地址(已被下载8699次(老彭:其实这是一年多来总的下载量,目前还没有哪个程序能在几个小时达到这样的下载量,看来这个哥们对中国站长站还不是非常熟悉)) 那么大的下载量了,我觉得这程序应该可以吧,后初步分析一下,这程序问题较大,
下面是该程序下载地址http://down.chinaz.com/soft/22462.htm
一.后台登陆漏洞
我们来看management目录的login.asp文件
<%
if request.Form("submit")<>"" then
if request.Form("userid")="" or request.Form("password")="" then
response.Write("<script language=javascript>alert(‘用户名或者密码不能为空!‘);history.back();</script>")
response.end
end if
set rs=conn.execute("select * from gly where uid=‘"&trim(request.form("userid"))&"‘ and pwd=‘"&trim(request.form("password"))&"‘")
是不是程序员写程序写错了???只用trim函数过滤了空格,然后后面写的“&"‘")”这个啥意识?,可能程序员本是要用replace函数替换"但是没写这个函数,这样一来就直接出现了从客户端传递过来的数据,直接带入数据库查询了,这样我们就可以用‘or‘=‘or‘登陆了.(这个是一个很正常的代码,没什么错误,不过确实没做过滤,可能这哥们发现了漏洞比较兴奋,没仔细看全部代码,因此没明白这几个字符的意思。对于后台登录,我觉得是防君子不防小人。他要是想黑你,只要知道你的后台登录页面,用暴力破解就完全可以搞定了,验证码啥的其实起不了太大作用。当然,我不否认好的登录程序还是对安全有些作用,毕竟如果密码设的比较缺德的话还是很难通过纯暴力猜解来破解的。这块我在今后的版本里会加以完善。)
二.暴库漏洞
我们来看该程序的数据库链接文件。
文件的路径在inc目录下文件名为conn.asp,还有个文件名为webconn.asp
两个文件代码是一样的,我们来看看代码
<%
db="../data/#CommonSite.asp" ‘数据库
‘on error resume next ‘尝试连数据库,一直到超时,但可以加强SQL注入过滤
connstr = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath(db)
‘connstr="DBQ="+server.mappath(""&db&"")+";DefaultDir=;DRIVER={Microsoft Access Driver (*.mdb)};"
set conn=server.createobject("ADODB.CONNECTION")
conn.open connstr
%>
<!--#include file="config.asp"-->
看见没有,虽然程序里面有on error resume next这句容错语句,但是前面居然用‘注释掉了,这句话就没有起作用了这样还是造成暴库了
(暴库不是个独立的操作,首先要明白暴库的目的,我们不是为了暴库而暴库。暴库,是为了知道网站使用的什么数据库,知道数据库地址等隐秘信息,从而作为制定攻击计划的重要参考。对于CommonSite来说,暴库的意义在于能够下载数据库,得到后台密码。但是,如果我的后台地址隐藏的很好呢?暴库的意义就不大了,等于拿着钥匙却找不到门。暴库只能把数据库下载下来,总不可能把数据库改完再传回去吧,那就得攻击服务器了。)
三.跨站漏洞,这程序很多地方有跨站漏洞
我随便找出一个给大家看看我们来看后台的basic.asp文件,这文件在management目录下这文件作用是修改网站基本信息,如标题等
我们来看其中的一段代码
if trim(request("do"))="edt" then
m_site_name = trim(request("site_name"))
m_keyword = trim(request("keyword"))
m_description = trim(request("description"))
m_copyright = trim(request("copyright"))
m_tel = trim(request("tel"))
conn.execute("update basic set site_name=‘"&m_site_name&"‘,keyword=‘"&m_keyword&"‘,description=‘"&m_description&"‘,copyright=
‘"&m_copyright&"‘,tel=‘"&m_tel&"‘ where id=100")
response.Write("<script language=‘javascript‘>alert(‘修改成功‘);window.location.href=‘basic.asp‘;</script>")
response.End()
end if
看见没有,只用trim函数过滤了空间就直接带入数据库进行修改操作了
所以这样我们只要插入代码就可以跨站了如<script>alert("fsfs")</script>
(这个哥们在这一点上的创意还是比较有意思的。修改网站基本信息,是要在得到管理员权限并顺利登录后台的基础上才能做到的。如果你都登录到后台了,其实已经用不着费这劲去黑这个网站了?连管理员权限都有了,想干什么干什么就是了!如果是网站的主人登陆到后台了,他不会吃饱了没事在自己网站挂马吧?换句话说,如果站长想在上面挂个广告或者挂个统计工具,你不让人家填写js,其实也不合适,对吧?)
下面是演示效果
总结,这程序在安全方面做的太垃圾,看出该程序员对脚本安全并不在行,整个程序只有注入上做了一些防范措施,我们来看下面一段程序
if isnumeric(trim(request("c")))=false then
response.write("Id Err!")
response.End()
end if
用了isnumeric函数进行防注入,这招够狠的,呵呵完全杜绝了注入呵呵!!我这次初步分析了这程序,下次我会进一步分析,谢谢观看(我在前台尽了最大努力跟注入行为作斗争,放弃了文章搜索等功能,就是为了让网站暴露在光天化日之下的前台参数只有数字型,这样就可以用类型检测来彻底挡住注入行为了。其实对于一个网站来说,前台的安全才是最重要的。因为后台只有你自己用,可以隐藏起来,但是前台不能藏着掖着,毕竟是为了展示才会做网站嘛。建议同学们加一个屏蔽搜索引擎蜘蛛的文本,一面搜索引擎多事把你的后台地址暴露出来)
转载请加入链接http://hi.baidu.com/tongming133通明博客
本人QQ:452879303欢迎喜欢研究脚本安全的朋友加我!欢迎在论坛搜索我发布的其他原创文章!
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力
摘自红色黑客联盟(www.7747.net) 原文:http://www.7747.net/Article/200912/43342.html |