当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2014-064004

漏洞标题:各大CMS厂商的CMS存在的同一设计缺陷

相关厂商:各大CMS厂商

漏洞作者: U神

提交时间:2014-06-09 11:17

修复时间:2014-09-07 11:18

公开时间:2014-09-07 11:18

漏洞类型:设计缺陷/逻辑错误

危害等级:高

自评Rank:10

漏洞状态: 已交由第三方合作机构(cncert国家互联网应急中心)处理

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-06-09: 细节已通知厂商并且等待厂商处理中
2014-06-14: 厂商已经确认,细节仅向厂商公开
2014-08-08: 细节向核心白帽子及相关领域专家公开
2014-08-18: 细节向普通白帽子公开
2014-08-28: 细节向实习白帽子公开
2014-09-07: 厂商已经修复漏洞并主动公开,细节向公众公开

简要描述:

为了写这个漏洞我已经下载了很多CMS做了很多实验,。其中大多谈到的均为乌云上已经注册的厂商,包括:Ecshop、PHPwind、74CMS等等...
这里一并提交一方面是为了防止各种小伙伴拿这个刷rank、刷奖金,一方面是希望开发CMS的程序员能够考虑到这种设计缺陷的存在。
写的时候中间还停电了,幸好老子机灵,先写在word上去的。

详细说明:

0x00 概述
我们这里要谈到的是什么设计缺陷呢?首先我们这类要谈到的设计缺陷所涉及的的危害可能致使数据库备份、log日志、文本信息等资料轻而易举地泄漏,造成极大的危害!
我们这里谈到的设计缺陷指的是厂商在开发CMS时候没有考虑Windows特殊环境下的一种短文件名方式,从而使得CMS所备份的数据库、产生的log日志或者其它用户保存的文本信息、图片信息可以通过短文件名方式轻而易举地遍历。那么什么是短文件名呢?请听下面的解说。


0x01 什么是短文件名
在Windows,如果一个文件名的长度大于9个字符,那么可以使用短文件名的方式去访问它,通过短文件名的方式去访问一个文件可以使用户不需要输入完整的文件名访问它。那么我们这里就做一个实验,假如一个CMS的log日志是以这样的规则去命名的。
a_产生时间_b.log
例如:
a_201303030125_b.log
a_201405061332_b.log
a_201206301516_b.log
这里我们做实验就直接在磁盘下建立这样的三个log文件,然后打开我们的CMD,切换到该目录下,输入命令:dir /x 查看一下, 发现中间有以“~”命令的文件名,这个就是短文件名。

01.jpg


从上面可以看出,如果我们要访问这三个log文件的话,那么一般人可能会说去爆破,但是呢?其实根本不需要去爆破,可以直接使用短文件名的方式去访问,这样的对应则为:
a_201303030125_b.log ————>A_2012~1.LOG
a_201405061332_b.log ————>A_2013~1.LOG
a_201206301516_b.log ————>A_2014~1.LOG
这样下来我们只要枚举出年就可以遍历这些log日志,那么假如都是同一年的我们该怎么遍历不同的呢?这里也做一下时间,把他们全部改为同一年的:

02.jpg


a_201303030125_b.log————>A_2013~1.LOG
a_201305050106_b.log————>A_2013~4.LOG
a_201305061332_b.log————>A_2013~3.LOG
a_201306301514_b.log————>A_2013~2.LOG
从上面可以看出可以使用类似~1、~2、~3、~4这样的方法去访问,对于为什么会这样,我在百度上找到了这么一条比较有用的:
1)符合DOS短文件名规则的Windows下的长文件名不变。
2)长文件名中的空格,在短文件名中被删除。
3)删除空格后的长文件名,若长度大于8个字符,则取前6个字符,后两个字符以"~#"代替,其中"#"为数字,数字根据前六个字符相同的文件名的个数顺延。若个数超过10个则取前5个字符,后三个字符以"~##"代替,其中"##"为两位数字,若个数大于100也依此规则替换。
4)对使用多个"."隔开的长文件名,取最左端一段转换为短文件名,取最右一段前三个字符为扩展名。
关于更多短文件名的知识,大家可以百度多去了解下,我们这里重点不是讲短文名的事情。


0x02 需要满足的条件是什么?
1.CMS的搭建环境处于Windows下
2.用户有备份数据库的习惯(针对数据库备份)

漏洞证明:

0x03 测试乌云所有厂商的CMS实例
鉴于PHPCMS V9和DEDECMS已经在360提交,这里将这两款CMS除外。下面开始测试,均以最新版为准测试:
以下访问均在虚拟机中通过短文件名访问数据库

1.Ecshop(简单爆破数据库):
http://download.ecshop.com/2.7.3/ECShop_V2.7.3_UTF8_release1106.rar
登录Ecshop,进入后台备份数据库,数据库管理——数据库备份。最后发现数据库备份所在的文件夹为:data\sqldata,而这个文件夹允许任何人访问,备份的数据库格式为.sql,可以下载,我们这里备份了三次数据库,分别是:
20140607qwhgxd.sql、20140607wisgtt.sql、20140607ysaybn.sql
从上面可以刚出最前面的是备份的年月日,后面的则是随机字符串,文件名总共超过9个字符,通过短文件名发现:

03.jpg


可以使用201406~1.sql去访问这个复杂的备份数据,从而我们可以想象,如要要枚举出一年所可能存在的,那么我们可以构造这样的简单字典去跑,根据1年12个月,假设最早的Ecshop从2009年3月开始,到今年有51个月份,我们设定一个月份最多四个访问方法就是上面的。则只有204种可能。如下:
200903~1.SQL
200903~2.SQL
200903~3.SQL
200903~4.SQL
......
......
201406~1.SQL
201406~2.SQL
201406~3.SQL
201406~4.SQL
其实呢,根本不需要去枚举204种可能,只要枚举51种可能性,因为如果这个月备份了一个就可以通过“年月~1.SQL”去访问,那么这个月备份的其它的则可以1-4等去访问.
http://192.168.199.187/ecshop/data/sqldata/201406~1.SQL
http://192.168.199.187/ecshop/data/sqldata/201406~2.SQL

04.jpg


2.骑士CMS(简单爆破数据库)
http://download.74cms.com/download/74cms_v3.4.20140530.zip
登录骑士CMS后台,备份数据库,获取数据库所在的文件夹为:data\backup,备份的数据库后缀为.sql可下载,我们这里备份了四个分别名字为:
20140607_TQuaq5392bc772d4eb.sql、 20140607_jmTnK5392bc85b63ac.sql
20140607_EGUkn5392bc887ed93.sql、20140607_cUunw5392bc82b2868.sql
从对备份数据命名格式来说,跟Ecshop很像,也是前面取备份的年月日,后面则是随机数字字符串,从短文件名下去观察:

05.jpg


其实我们已经发现,跟ECSHOP一模一样,所以Ecshop枚举的字典也可以用于74CMS来跑数据库了,这样可以导致数据库泄漏!
http://192.168.199.187/74/data/backup/201406~1.SQL
http://192.168.199.187/74/data/backup/201406~2.SQL

06.jpg


3.Cmseasy(简单爆破文件夹)
http://ftp.cmseasy.cn/CmsEasy5.x/CmsEasy_5.5_UTF-8_20140605.rar
登录后台备份数据库,Cmseasy的数据库备份存储在data目录下可访问,并且我们会发现备份数据库的时候还会在data目录下生成一个文件夹,然后再存储这个后缀为.sql的备份的数据库。如下:
data/2014-06-07-15-39-NDNmZT/sql-2014-06-07-15-39-NDNmZT-1.sql
data/2014-06-07-15-39-NGUzZD/sql-2014-06-07-15-39-NGUzZD-1.sql
data/2014-06-07-15-39-YWQ5Nz/sql-2014-06-07-15-39-YWQ5Nz-1.sql
data/2014-06-07-15-39-ZTBhY2/sql-2014-06-07-15-39-ZTBhY2-1.sql
这似乎增加了一点难度,那我们首先来看看这个文件夹如何用短文件名访问:

07.jpg


从上面看如果要确定一年中的文件夹存在的话,那么只要跑2014-0和2014-1这两个文件夹,分别作为四次总共是8个,即:2014-0~1、2014-0~2、2014-0~3、2014-0~4、2014-1~1、2014-1~2、2014-1~3、2014-1~4。其中的0和1代表的是年份,因为10、11、12月份是1开头的,那么这样的总能遍历出一个文件夹,假设从2010年开始到2014年6月总共是“28”个,也就是说文件夹只要枚举28种可能性,如果存在返回状态码403。然后我们就开始枚举数据库名字了吗?不不不!因为每个文件夹中只存一个数据库!通过短文件名方式我们会发现,数据库其实就是可以直接使用SQL-20~1.SQL来访问。如下图:

08.jpg


那么也就是说我们其实只要枚举文件夹的可能性就足够了,对吧!

09.jpg


10.jpg


4.PHPWind(直接获取备份数据库)
http://nt.phpwind.com/tj.php?id=913&verify=d73f768d141400cdc589312fbb9fb1a5&sign=pw9gbkzip&type=click
Phpwind的备份数据库也存在和CMSeasy一样的基于一个随机文件夹中,但是对于命名存在一定规律性,导致可以直接获取数据库。进入后台备份一下数据库,看看所存在的文件名称是怎样的:
pw_9-0_20140607201943_ma9Oa、pw_9-0_20140607201953_aXYP9
pw_9-0_20140607202000_cPg21、pw_9-0_20140607202013_hvOi0
看一下似乎非常的复杂,但其实并不是,这个要害部位就在于最前面的字符串是有规律的,仔细一看pw=phpwind,而9-0则是它的版本好,没错我这里下载的就是phpwind9.0版本的。
那我们直接看:

11.jpg


看到了把,只要通过PW_9-0~1---PW_9-0~4就可以访问这四个文件夹,而且无需爆破,直接获取啊,那么我们再进入文件看看,每个文件夹中都躺着一个zip的数据库包。

12.jpg


通过观察,虽然非常复杂但是完全可以通过PW_9-0~1.ZIP的形式去访问该ZIP包,导致根本无需爆破,只要phpwind在windows下并且备份数据库则可以使用这样的形式去获取到数据库:
http://127.0.0.1/data/sqlbackup/PW_9-0~1/PW_9-0~1.ZIP
这样的链接可以直接访问到基于Windows搭建的PHPWind9.0的备份数据库

13.jpg


0x04 总结
由于乌云上太多CMS厂商了,以上所枚举的仅仅是PHP+Mysql的,那么就有一定的局限性,因为PHP的网站也可能会在Linux等其它环境下搭建就无法通过Windows特有的短文件名方式进行访问了。其实很多ASP、ASPX的CMS全是Windows下搭建的,这样以来,如果没有有效的保护备份的数据库,对备份的数据库名称具有一定规律和简单爆破性,那么可以导致数据库备份直接泄漏,从而危机网站安全。当然在我测试了很多CMS中有部分CMS还是对这方面做的很安全:
比如:
YouYAX的数据库虽然备份在:ext_public\phpmysqlautobackup\backups目录下,并且备份的数据库为.gz的压缩包,并且很有规律的名字,可以使用“MYSQL2~1.GZ”看到,但当我们访问时候却提示“Forbidden”

14.jpg


再比如说的Destoon:
通过短文件名访问数据库时候发现虽然前段字符串有规律,但是后段字符串却很难爆破,这样的安全设计是完全可以防止Windows利用短文件名获取数据库。

15.jpg


其实不然,我们不仅仅可以获取数据库备份信息,还可以获取一些log日志信息,例如泛微OA系统的Log信息可以使用该漏洞进行直接访问,测试过成功率是%99,这里我就不提了。


修复方案:

0x05 解决方案
  解决方案其实很多,下边本菜鸟就这么说几条吧
目录不可访问
添加安全狗之类的软件
将数据库存在一个随机小于9个字符的数字+字母的文件夹中,然后该数据库也可以使用低于9位字符的字符串命名。
使得数据库的名称前段和后段字符完全无规律,建议字母+数字
其实还没有很多,暂时就不说了,自己想一下吧

版权声明:转载请注明来源 U神@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:10

确认时间:2014-06-14 09:05

厂商回复:

由于该设计缺陷有较强的前提条件(特定系统+目录遍历+未授权访问),CNVD未直接对所述多种CMS进行本地实例,对于所述情况,也不能一一通报处置,先行确认,然后提前公开,供大家参考。

最新状态:

2014-06-14:未能有效处置,提前公开,仅供参考。