对于一些网站,只需要把站点链接的最后一个“/”改为“%5c”,就能够暴露出网站的数据库地址。为什么会出现这样的奇怪情况呢?
在“conn.asp”文件中的几句数据库连接代码语句,看上去觉得并没什么问题,而且数据库的名字取得很怪,攻击者能猜到这样的数据库名几率几乎为零。但是将网页连接地址的“/”做一个小小的变换,改成“%5c”,由于 IE 浏览器的解码,将错误的网站路径传输给网站服务器,就可以通过返回的错误信息报出数据库的真实位置。
1,绝对路径、相对路径和虚拟目录
上面我们提到,由于浏览器对“相对路径”解码的错误,才导致数据库暴露出漏洞。那么什么是“相对路径”呢?
在网站服务中,“相对路径”就是指相对于网站 Web 根目录的路径。例如,服务器的 web 根目录为“D:\web\”,我们在根目录中建立了一个名为“asp”的目录,“asp”目录就是相对于“D:\web”的一级子目录。对应到网站链接上来看的话,“D:\web\”对应的就是“http://localhost”,而“asp”目录就是相对于“http://localhost”的一级目录。因此,在 web 服务中访问“asp”目录时,只需在浏览器中输入相对路径“http://localhost/asp”即可。
所谓的绝对路径,是指在服务器磁盘中的真实路径,这里“asp”目录的绝对路径就是“D:\web\asp\”,是一个二级目录。
在IIS中,还有一个特殊的目录路径--“虚拟目录”。每个 Web 服务可以从多个目录中发布,Web 服务器可拥有一个宿主目录和任意数量的其他发布目录,其他发布目录就被称为虚拟目录。以上面的 Web 服务为例,Web 服务的根目录为“d:\web\”,通过IIS虚拟目录功能,可以发布一个论坛服务,论坛程序可以位于任意的路径,如在“E:\bbs”。通过IIS的虚拟目录设置,仍能把“bbs”转化为在“Web”目录下,直接用“http://localhost/bbs”进行访问。
使用虚拟目录时,此目录指向的是一个绝对地址的物理路径。在IIS中,为了辨别当前访问的是否为虚拟目录,通常是查询每个目录是否指向一个物理路径,而进行查询判断时,是以链接的“\”符号做为标志的。也就是说,当IIS获取某个目录时,如果碰到“\”符号,则将“\”符号之后的路径作为物理的绝对路径,而忽略“\”符号之前的路径信息。
2,"server.mappath"方法
在“conn.asp”数据库连接文件中,基本上都会有这么一条语句:
Data Source=server.MapPth("xxxxx.mdb")
其中“server.mappath”方法的作用,就是把相对路径转换为物理上的绝对路径,只有经过转换,服务器才能正确地获得数据库的路径,进行数据读写。
由于当前 Web 根目录为“D:\web”,在 Web 根目录下有“asp” 文件夹,网页程序“test.asp”和数据库“xxxxx.mdb”,都放在“asp”文件夹中。数据库文件的绝对路径为“D:\web\asp\xxxxx.mdb”。
“server.mappath”方法获取数据库文件的路径时,读取的路径为“Web根目录+相对路径+指定的路径”。Web 根目录为“D:\web”,“conn.asp”数据库连接文件的相对路径是“\asp\”,指定的数据库文件路径是“xxxxx.mdb”,因此可获得真实的数据库绝对路径“D:\web\asp\xxxxx.mdb”。
3,%5c 暴库的原理--相对路径出错
通常情况下,数据库连接文件中的“server.mappath”方法,可以正常获得数据库的物理路径。但是,当浏览器中的链接地址被修改提交后,网页的相对路径就发生了变化,从而使得路径出错,报出数据库信息。
先来看看 IE 浏览器的一个特性:如果直接在浏览器中提交的链接地址中包含“\”,浏览器会自动把“\”转换为“/”,从而访问到正常的链接地址。例如,在上面的例子中,如果提交“http://localhost/asp\conn.asp”或者“http://localhost/asp\test.asp”,最终在 IE 浏览器中显示的都还是正常网页。
在浏览器链接中包含的“\”,会被自动转化为“/”,但是对“\”做一个小小的编码转换,就可避免 IE 浏览器的自动转化。如上面提交的链接,变化编码后变成了:“http://localhost/asp%5cconn.asp”或“http://localhost/asp%5ctest.asp”。
在浏览器中,提交“%5c”是不会被自动转换的,地址中的“%5c”会被原样提交。其实,“%5c”就是“\”的 16 进制代码,当 IIS 服务器收到用户提交的信息并做出解析时,又会将 “%5c” 还原成“\”。于是在 IIS 服务器中,用户提交的网址相对路径就变成了“asp\test.asp”或“asp\conn.asp”。问题便由此而产生了。
此时,“server.mappath”方法获得的数据库路径,变成了“D:\web”+“asp\xxxxx.mdb”。由于在 IIS 中,以“\”表示真实路径的目录关系,以“/”表示虚拟路径。在前面提到了“当IIS获取某个目录时,如果碰到“\”符号,则将“\”符号之后的路径作为物理的绝对路径,而忽略“\”符号之前的路径信息”,由此可知IIS会将“asp\xxxxx.mdb”当成一个绝对路径,忽略掉“\”符号之前的“asp”目录。因此,加上根目录的物理路径“D:\web”,此时得到的数据库真实路径变成为“D:\web\xxxxx.mdb”。
由于“D:\web\xxxxx.mdb”这个路径是不存在的,数据库连接当然会失败,于是 IIS 会报错,并返回出错的信息:
错误类型:
Microsoft JET Database Engine (0x80004005)
找不到文件 'D:\web\xxxxx.mdb'。
/asp\conn.asp,第4行
这便是 “%5c” 暴库方法的原理。利用该方法,攻击者可以让网站隐藏的数据库文件路径报出,无论建站者将数据库文件名修改得再怪异、路径藏得再深,在攻击者面前也形同虚设。
不过要说明的一点是,在报出的数据库信息中,显示的数据库路径是不完全正确的。例如,在上面的命令中,显示的数据库路径为“D:\web\xxxxx.mdb”,而真实的数据库路径为“D:\web\asp\xxxxx.mdb”。为什么会这样呢?在上面已知提到了,IIS将“\”之前的相对路径信息忽略了,因此在将报出的数据库地址变为真实的数据库地址时,需要加上“\”之前的相对目录。这里将被忽略的“\asp\”目录加入,即可得到真实的数据库地址。