论坛: 网站建设 标题: 关于小型网站安全漏洞(转) 复制本贴地址    
作者: Aoming [aoming]    版主   登录
作者:匿名

我长期从事网页设计和网站建设的工作,一年多来,所见所感甚多,所以写下这些文字,但愿于您有所帮助。只适合有一定网页设计技术基础的人阅读,^_^

案例一:下载Access数据库

那是去年的这个时候吧,我到武汉瑞琪上查看关于网络知识竞赛的新闻,意外的发现瑞琪的BBS论坛居然事从网上下载的“动网先锋论坛”,版本记不太清楚了,好像是V5.0版,当时,我还完全不会ASP,但我看过“动网先锋论坛”的源码和目录结构,所以随手在地址栏输入:(省略了相应路径)../bbs/data/board.mdb,结果,IE提示:

“您已经选择从该位置下载文件。

Board.mdb来自www.richinfo.com

如何处理该文件?

…”

用不着解释吧,这就是熟悉的下载界面了,board.mdb正是“动网先锋论坛”的数据库文件,打开,在admin表中找到了所有管理员和版主的用户名/密码,下一步,我已经拥有了所有管理员的权限。不过,当时瑞琪的论坛是测试版的,数据库文件只读,ASP程序也有错误,所以,无法通过WEB做什么事情证明自己“黑过”她。

后来,我给网站管理员前后写过三次Email,告知数据库不安全,不过没有任何回应,至今都没有。

这是一个典型的数据库不安全的例子,一般大中型网站都有专用的数据库服务器(有的是SQL Server/Oracle软件服务器,有的甚至有硬件数据库服务器),不存在这个问题。可是小型网站就不行了,从成本和技术的角度考虑他们一般采用ASP+Access。Access数据库是以文件的形式存在,所以一旦被人窥知数据库路径,数据库就会被下载。

当然一般情况下,别人是难以知道您的数据库路径和文件名的,不过很多人往往喜欢直接下载网上的源程序,而且连数据库文件名和初始密码都不修改,这样,安全就没有保障了。

我想,既然“动网先锋论坛”这么流行,那么必然还有很多站点存在同样的问题,于是上网搜索“发贴排行 & 动网先锋论坛”(因为直接搜索“动网先锋论坛”会找到很多做了“动网先锋论坛”下载连接或者介绍它的页面,加上“发贴排行”,搜索到的网站就多是使用“动网先锋论坛”而且连版权标志都没有更改的了,既然连版权信息都不改,他也不会向导去改数据库名字和目录),搜索的结果让我大吃一惊,居然有五六个网站可以顺利下载数据库!!

另一个例子来自己xpilothome.yeah.net,站长写了一个叫做“紫色随想”的留言簿,且提供免费下载,我下载了,找到数据库文件名:gb_data.mdb,成动下载。尔后,故伎重演,上网搜索“紫色随想留言簿 & 查看留言”,这一次,我找到七个可以下载数据库的站点,不过居然有人为Access数据库设了密码,不过破解Access的密码是在易如反掌,就不多说了。

我又拿“蓝芒交友系统”做了试验,结果差不多,多数采用这个系统的站点使用默认的friend.mdb数据库文件名。

2002年7月,学了ASP和WEB数据库,又想:其实只要知道数据库的路径和文件名,那个数据库基本上即使您的了,因为可以连接远程数据库,您只要在set conn使指明数据库路径就可以了,比如set conn= "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=http://www.qinjx.com/database/news.mdb",您可以编写任何操作数据库的网页(不管那个网站本身有没有提供这一操作)来操作这个数据库。

好了,就不在罗列实例了。

如何防范呢?

1.数据库名字改为asp的后缀,然后再把set conn= "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ="& Server.Mappath("../XXX.asp"),XXX数据库文件名。IE碰到ASP的后缀就会等待服务器端执行然后再显示,而不是下载。

2.上面这个是我在网上看到的最多的说法,不过,根据我测试的结果来看,由于这个ASP文件是假的ASP,其实还是可以下载,只是不用IE。测试中,我还发现,只要指明了数据库驱动程序(DRIVER={Microsoft Access Driver (*.mdb)};),用什么作后缀都没关系,甚至可以不要,比如说,有这样一个数据库文件名:qinjx.iloveyou有谁会想到呢?

3.在服务器端写一段程序,用于限制URL中的敏感字符,比如,可以这样限制:只允许URL中出现的扩展名是.asp,.htm.html。那么现在客户端就无法非法下载数据库了,甚至连.js,.css,.jpg等文件都无法下载。通过indexOf方法查找文件后缀,具体操作就不祥述了。

案例二:直接通过URL非法访问页面

在一个使用“紫色随想留言簿”的站点,我发现了这个Bug,直接在地址栏输入:../gb_del.asp?where=31居然进入了删除留言的页面,同样的方法,输入../gb_replay.asp?where=31进入了恢复留言的页面(删除和恢复是管理员才有的权限)。

这种在地址栏输入URL越过登录非法访问相关页面的技术也是旧闻,不过,还是有一些网站管理员下载一些源码不作研究改动就用在自己网站上。其实那些源程序未必经过了严格的测试,或多或少存在一些问题。

解决办法很多:

经典的做法是:在某些敏感的页面(如只有管理员才可以看的页面)最前面加上一段身份验证,验证用户是否已经成功登录。以“紫色随想留言簿”为例,在gb_login.asp页面相应的地方加上:if rs BOF or EOF(数据库中存在这个用户,登录成功)then Session(“Login”)=”Success”,再在gb_del.asp页面开始的地方加上:if session(“login”)<>”Success” then response.write “对不起,您尚未登录!” response.end(),这样就不会再有人通过输入../gb_del.asp?where=31非法访问删除留言的页面了。

还可以辅之以其他手段,如采用frame技术评比地址栏的URL,改变document的status属性使鼠标滑过链接时链接目标不显示在状态栏。

一般来说只要不在网上随便下载,正式运行前经过严密的测试,网站应该不存在这种安全问题的。

案例三:IIS的目录访问权限

这是十月份的事情,相信时网站管理员一时疏忽或者出于特殊的需要而设置的目录浏览许可。当时在网上找资料,看到一个煤矿公司的网站,我通过URL一步步访问上层目录,结果发现居然有一级目录没有默认的目录索引页,直接显示了目录列表。随即到baidu.com搜索,关键字:[To Parent Directory] & <dir>,搜索的结果有111页之多,.tw和.hk的居多。我去了其中的一些站点,能连接的站点都可以浏览目录,于是给其中10多位网管写了Email,到现在为止,只有中国科技大学Linux协会和深圳MBA联盟回了。

涉及的服务器平台多是IIS,也有部分Apache.

防范措施我就不想说了,实在太容易了,IIS和Apache默认的设置是不开放目录浏览权限的。

案例四:一个鲜为人知SQL漏洞

据说,陈水扁的网站就因为存在这样的漏洞被人黑了,我没有在网上做过测试,没有黑过谁的网站,但是,根据本机测试的结果来看,确实可以通过这个漏洞非法登录。

原理:一般基于数据库的网站登录都是采用这样的验证方式:接收客户端传送的数据(用户名和密码),然后在数据库中查询有没有这样一组用户名/密码,如果有,登录成功,如果没有,登录失败。相应的SQL语句是这样的:

Select * from user(数据表名) where username(数据表中表示用户名的字段名)=’& request.form(“UserID”)& ’ and password(数据表中表示密码的字段名)=’&request.form(“Pass”)&’如果用户输入用户名qinjx和密码amarrey,那么SQL语句在执行时就变为:select * from user where username=’qinjx’ and password =’amarrey’,紧接着判断是否存在一个密码为amarrey的qinjx用户,下面看,这个漏洞时怎么被利用的,如果用户在UserID输入框内输入qinjx,在密码框里输入anything’ or 1=’1 ,查询的SQL语句就变成了:

Select * from user where username=’qinjx’ and password=’anything’ or 1=’1’,不难看出,由于1=’1’是一个始终成立的条件,password的限制姓通虚设,不管用户的密码是不是anything,他都可以以qinjx的身份登录。

我在本机用SQL Server 7.0和SQL Server 2000做过测试,屡试不爽,不过,您可要去我作的网站作测试哦!因为我后来用Dreamweaver MX开发ASP,Macromedia聪明的开发人员给我们指明了一个方向:屏蔽那个致命的单引号!!!

解决方案:

1.屏蔽单引号,用replace函数,例如:

select * from user where username=’&replace(request.form(“UserID”),’,”)&’ and password=’ &replace(request.form(“Pass”),’,”)&’

2.采用另一种验证机制。即:获取用户名,在数据库中查询这个用户名,如果不存在,报错,中止执行;如果存在,继续执行,根据这个用户名找到那条记录,从数据库中取出密码,和客户端传送过来的密码对照,如果相同,登录成功,否则,登录失败。

这样逐个条件验证,避开了and 和or等关系运算,漏洞被堵住。

好了,就此为止吧,如果有什么需要和我讨论的,请Email至:qinjx@chinalabs.com


地主 发表时间: 04-04-11 15:46

回复: Aoming [aoming]   版主   登录
标题:防止数据库被下载的几个方法
作者:匿名


前言:很多动态站点大量应用了数据库,数据库理所当然成了一个站点的核心文件。一旦数据库被人下载,极有可能被恶意人士破坏网站。或者窃取资料。实在痛心啊。有什么方法可以防止数据库被人下载呢?

下面提供的的方法分别适用使用虚拟主机空间的用户和有IIS控制权的用户!
    一:购买虚拟主机空间的,适合没有IIS控制权

1:发挥你的想象力 修改数据库文件名
这个是最基本的。我想现在也没有多少连数据库文件名都懒得改的人吧? 至于改成什么,你自己看着办,至少要保证文件名复杂,不可猜测性。当然这个时候你的数据库所在目录是不能开放目录浏览权限的!

2:数据库名后缀改为ASA、ASP等
这个听说很流行,不过我测试了好多次,发现并不理想,如果真正要起到防止下载的作用,要进行一些2进制字段添加等设置,---一句话,繁而复杂(如果你的数据库有很多的话,这个方法实在不是很好)

3:数据库名前加“#”
只需要把数据库文件前名加上#、然后修改数据库连接文件(如conn.asp)中的数据库地址。原理是下载的时候只能识别 #号前名的部分,对于后面的自动去掉,比如你要下载:http://www.pcdigest.com/date/#123.mdb(假设存在的话)。无论是IE还是FLASHGET等下到的都是http://www.pcdigest.com/date/index.htm(index.asp、default.jsp等你在IIS设置的首页文档)
另外在数据库文件名中保留一些空格也起到类似作用,由于HTTP协议对地址解析的特殊性,空格会被编码为"%",如http://www.pcdigest.com/date/123 456.mdb,下载的时http://www.pcdigest.com/date/123%456.mdb。而我们的目录就根本没有123%456.mdb这个文件,所以下载也是无效的这样的修改后,即使你暴露了数据库地址,一般情况下别人也是无法下载!

4:加密数据库
用ACCESS将你的数据库以独占方式打开后,在工具-安全-设置数据库密码,加密后要修改数据库连接页, 如:
conn.open "driver={microsoft access driver (*.mdb)};uid=admin;pwd=数据库密码;dbq=数据库路径"
这样修改后,数据库即使被人下载了,别人也无法打开(前提是你的数据库连接页中的密码没有被泄露)
但值得注意的是,由于Access数据库的加密机制比较简单,即使设置了密码,解密也很容易。该数据库系统通过将用户输入的密码与某一固定密钥进行“异或”来形成一个加密串,并将其存储在*.mdb文件从地址“&H42”开始的区域内。所以一个好的程序员可以轻松制作一个几十行的小程序就可以轻松地获得任何Access数据库的密码。因此,只要数据库被下载,其信息安全依然是个未知数。



    二:有主机控制权 (当然虚拟空间的设置在这里依然可以用)
5:数据库放在WEB目录外
如你的WEB目录是e:\webroot,可以把数据库放到e:\data这个文件夹里,在e:\webroot里的数据库连接页中
修改数据库连接地址为:"../data/数据库名" 的形式,这样数据库可以正常调用,但是无法下载的,因为它不在WEB目录里!这个方法一般也不适合购买虚拟空间的用户。

6:使用ODBC数据源。
在ASP等程序设计中,如果有条件,应尽量使用ODBC数据源,不要把数据库名写在程序中,否则,数据库名将随ASP源代码的失密而一同失密,例如: DBPath = Server.MapPath(“../123/abc/asfadf.mdb ”)
conn.open “driver={Microsoft Access Driver (*.mdb)};dbq=”& DBPath
可见,即使数据库名字起得再怪异,隐藏的目录再深,ASP源代码失密后,也很容易被下载下来。如果使用ODBC数据源,就不会存在这样的问题了: conn.open “ODBC-DSN名” ,不过这样是比较烦的,目录移动的话又要重新设置数据源了,更方便的方法请看第7,8法!

7:添加数据库名的如MDB的扩展映射
这个方法就是通过修改IIS设置来实现,适合有IIS控制权的朋友,不适合购买虚拟主机用户(除非管理员已经设置了)。这个方法我认为是目前最好的。只要修改一处,整个站点的数据库都可以防止被下载。无须修改代码即使暴露目标地址也可以防止下载,如图1、2设置:

此主题相关图片如下:


我们在 IIS属性---主目录---配置---映射---应用程序扩展那里添加.mdb文件的应用解析。注意这里的选择的DLL(或EXE等)似乎也不是任意的,选择不当,这个MDB文件还是可以被下载的,  注意最好不要选择选择asp.dll等。你可以自己多测试下
这样修改后下载数据库如:http://192.168.1.5/HaoBbs/data/dvbbs6.mdb。就出现(404或500等错误)

8:使用.net的优越性
动网的木鸟就写过一个防非法下载文件的“WBAL 防盗链工具”。具体可以登陆http://www.9seek.com/WBAL/
不过 那个只实现了防止非本地下载的 ,没有起到真正的防下载数据库的功能。不过这个方法已经跟5法差不多
可以通过修改.NET文件,实现本地也不能下载!

这几个方法中,只有第7和8个是统一性改的,一次修改配置后,整个站点的数据库都可以防止下载,其他几个就要分别修改数据库名和连接文件,比较麻烦,不过对于虚拟主机的朋友也只能这样了!

其实第6个方法应该是第5个方法的扩展,可以实现特殊的功能,但对于不支持.net的主机或者怕设置麻烦的话,还是直接用第5个方法了,而且默认情况下第6个方法,依然可以通过复制连接到同主机的论坛或留言本发表,然后就可以点击下载了(因为这样的引用页是来自同主机的)

这几个方法各有长短,请自己选择性地使用。这些方法也不是绝对的安全,还需要网站管理员平时注意一些系统的安全,以及写ASP/ASP.NET/JSP代码本身的安全 ,否则依然是有可能被人下载或者修改数据库的!





B1层 发表时间: 04-04-11 15:49

回复: zml2236 [zml2236]   论坛用户   登录
好,写的好。
我知道在Google里输入:
"*.mdb"
呵呵,试试看,数据库多如牛毛。我随便下过两个,不过没有什么意思,还知道哪个什么鸟书店的管理员密码,现在没有看你的文章我都忘了。


B2层 发表时间: 04-04-11 19:10

回复: abctm [abctm]   版主   登录
好贴,我顶

B3层 发表时间: 04-04-12 12:33

回复: q70213526 [q70213526]   版主   登录
谢谢

B4层 发表时间: 04-04-12 19:53

回复: stardust [stardust]   论坛用户   登录
好,这确实是许多小型网站应该注意的问题

B5层 发表时间: 04-04-12 23:32

论坛: 网站建设

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号