今天在中国站长网发现一个今天更新的程序,这程序是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这句容错语句,但是前面居然用'注释掉了,这句话就没有起作用了这样还是造成暴库了
三.跨站漏洞,这程序很多地方有跨站漏洞
我随便找出一个给大家看看我们来看后台的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>
下面是演示效果
总结,这程序在安全方面做的太垃圾,看出该程序员对脚本安全并不在行,整个程序只有注入上做了一些防范措施,我们来看下面一段程序
if isnumeric(trim(request("c")))=false then
response.write("Id Err!")
response.End()
end if
用了isnumeric函数进行防注入,这招够狠的,呵呵完全杜绝了注入呵呵!!我这次初步分析了这程序,下次我会进一步分析,谢谢观看