暴库有两个方法,第一个就是利用%5c,另外一个conn.asp暴库。而且这里的暴库是针对access数据库的,而和access搭配的脚本一般是asp,因此出现暴库的一般为asp类型站点。
ASP是动态服务器页面(Active Server Pages)的英文缩写,后来也称为经典ASP,是微软公司开发的代替CGI脚本程序的一种应用,也是微软公司的第一个服务器侧的脚本引擎,能够动态产生Web页面。ASP可以与Web数据库以及其它程序进行交互,是一种简单、方便的编程工具。ASP的网页文件的格式是.asp,曾用于各种动态网站中。
%5c暴库
简单点说,就是在打开页面的时候把网页中的/换成%5c,然后提交就可以得到数据库地址了,但并不是所有页面都可以成功,而需要asp?id=这样的地址。因为这样的网址表示页面调用了数据库
首先,要产生 %5c 暴库漏洞,必须要求访问的网页中有数据库调用。其原因是不言而喻的,只有数据库调用的页面,才会“include”包含数据库连接文件“conn.asp”。
另外,要求使用 %5c 解码提交的页面,至少为二级目录,也就是说,必须形如“http://www.abc.com/2/*.asp”或“http://www.abc.com/2/3/*.asp”之类的链接才可以进行 %5c 暴库。而一级目录是无法暴库成功的,类似“http://www.abc.com/*.asp”之类的链接,都无法进行 %5c 暴库。
在暴库时,并不限于将网址链接中的第二个“/”换成“%5c”,事实上,将多级目录之后的“/”更换为“%5c”,暴库的成功率更高。例如,某网站的链接为三级目录“http://www.abc.com/2/3/test”,提交“http://www.abc.com/2%5c3/test.asp”暴库不成功时,提交“http://www.abc.com/2/3%5ctest.asp”反而有可能成功。
之所以会出现二级目录暴库不成功,但三级目录暴库成功的情况,往往是由于网站采用了虚拟目录。在上面的示例中,网站的子目录“2”可能是一个虚拟目录,“2”并不一定在网站根目录“D:\web”之下。虚拟目录“2”的真实物理目录,有可能是任意的分区路径,位于“E:\2”、“H:\2”都是可以的。
为何要用"%5c"?它实际上是"\"的十六进制代码,也就是"\"的另一种表示法。在电脑中,它们是一个东西。(图2)(十六进制转换图)
但提交"\"和"%5c"却会产生不同的结果,在ie中,我们把下面第一个地址中的"/"换成"\"提交:
http://219.237.81.46/yddown/view.asp?id=3
http://219.237.81.46/yddown\view.asp?id=3
二者的访问结果是一样的。ie会自动把"\"转变成"/",从而访问到同一地址。
但是,当我们把"/"换成十六进制写法"%5c"时,ie不会对此进行转换。地址中的"%5c"被原样提交了。这是抓包结果:(图3)
GET /yddown%5cview.asp?id=3 HTTP/1.1
当IIS收到后解析时,又会将%5c还原成"\"。这样,iis中网址的相对路径就变成/yddown\view.asp。这一点很重要。问题正是从这里开始的。
在ASP网页中,凡调用数据库时,都会用到一个连接数据库的网页conn.asp,它会创建一个数据库连接对象,定义要调用的数据库路径
一个典型的conn.asp如下:
<%
dim conn
dim dbpath
set conn=server.createobject("adodb.connection")
DBPath = Server.MapPath("admin/rds_dbd32rfd213fg.mdb")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath
%>
大家注意第4句:DBPath = Server.MapPath("admin/rds_dbd32rfd213fg.mdb"),Server.MapPath方法的作用是将网站中的相对路径转变成物理上的绝对路径。为何要这样?因为连接数据库时,须指明它的绝对路径。
(这里可能有人不明白,什么相对路径、绝对路径?IIS为了不让访问者知道真实的实际路径,并且确保网站不因变换地址而影响使用,它采用了一种相对路径来表示目录与文件之间的关系。也就是网址目录只表示从根目录起的相对位置。
比如:上面的网站中,网站:http://219.237.81.46的根目录为:"D:\111\"雨点下载目录则在根目录(D:\111)内的"yddown"下,我们网站访问该站时,就是在访问D:\111\yddown\目录,而http://219.237.81.46/yddown/admin/,它只表明了admin与yddown这个目录的相对关系,把这个网站放在e:盘,也一样不改变admin位于yddown目录下的关系。
当Server.MapPath方法将相对路径转为真实路径时,它实际是三部分路径加在一起得到真实路径的:网页目前执行时所在的相对路径,也就是从网站物理根目录起的相对路径,比如上面例子中conn.asp处在从根目录起的"/yddown/"下;然后调用的数据库的相对路径是admin/rds_dbd32rfd213fg.mdb,这样就得到从根目录起的完整相对路径:"/yddown/admin/rds_dbd32rfd213fg.mdb"。
这些都只是相对的路径,如何变为真实路径呢?
设置过iis的人都会知道,每一个网站,都必须指定它在硬盘上的物理目录,比如上例中,网站根目录所在的物理目录为:"D:\111",Server.MapPath方法正是通过把"网站根目录的物理地址+完整的相对路径",从而得到真实的物理路径。这样,数据库在硬盘上的物理路径是:d:\111\yddown\admin\rds_dbd32rfd213fg.mdb。
在这里,IIS以"\"表示真实路径的目录关系,而以"/"表示虚拟路径,这可能就是IE会自动把我们地址中的"\"转为"/"的原因吧。
明白这些,我们再来理解暴库就不难了,当我们提交http://219.237.81.46/yddown%5cview.asp?id=3时,view.asp调用conn.asp后,得到的网页相对路径是这样的:/yddown\ (见上),再加上"admin/rds_dbd32rfd213fg.mdb",就得到"/yddown\"+admin/rds_dbd32rfd213fg.mdb。在iis中,"/"和"\"代表着不同的意义,遇到了"\"时,认为它已到了根目录所在的物理路径,不再往上解析(为何不再往上解析?后面还会分析的),于是网站的完整相对路径变成了 :"admin/rds_dbd32rfd213fg.mdb",再加上根目录的物理路径,得到的真实路径变成:"D:\111\admin\rds_dbd32rfd213fg.mdb",而这个路径是不存在的,数据库连接当然会失败,于是IIS会报错,并给出错误原因:
Microsoft JET Database Engine 错误 ’80004005’
’D:\111\admin\rds_dbd32rfd213fg.mdb’不是一个有效的路径。 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器。
/yddown/conn.asp,行12
这就是暴库语句的来历。
《再谈%5c暴库的利用》一文中说,必须是网址中的第二个才可以成功,第一个不行。我们从理论上来分析一下,看到底有无规律:
还以上面网址为例,如果将第一个"/"换成"%5c",得到的网站相对路径变成\yddows/admin/rds_dbd32rfd213fg.mdb,解析到"\"时,认为已到物理目录,不再往前解析。而事实上,它确实也是根目录,所以得到的物理路径为:"D:\111\dydow\admin\rds_dbd32rfd213fg.mdb"
这个路径是正确的,所以不会出错,当然不会暴出数据库路径。
第二个个"/"换成"%5c"的情况,我们上面已作分析,那是不是真的就第二个可以暴出呢,事实上,它只是因为二级网站较为常见,并不是真理。如果这个下载系统是某一个网站中的三级目录,变第三个也是可以的。有时,变第三个成功的可能性更大。也就是说,最右边第一个成功可能性大。
【参考】
%5C暴库原理
关于%5C暴库大法
暴库实验环境与步骤