好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

各大CMS厂商的CMS存在的同一设计缺陷 - 网站安全

  简要描述:

为了写这个 漏洞 我已经 下载 了很多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 查看一下, 发现中间有以[~]命令的文件名,这个就是短文件名。

从上面可以看出,如果我们要访问这三个 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 日志,那么假如都是同一年的我们该怎么遍历不同的呢?这里也做一下时间,把他们全部改为同一年的:

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 个字符,通过短文件名发现:

可以使用 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

 

 

 

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 很像,也是前面取备份的年月日,后面则是随机数字字符串,从短文件名下去观察:

其实我们已经发现,跟 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

 

 

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 这似乎增加了一点难度,那我们首先来看看这个文件夹如何用短文件名访问:

从上面看如果要确定一年中的文件夹存在的话,那么只要跑 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 来访问。如下图:

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

 

 

 

 

4. PHP Wind (直接获取备份数据库) 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 版本的。 那我们直接看:

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

通过观察,虽然非常复杂但是完全可以通过 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 的备份数据库

 

 

 

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

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

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

0x05 解决方案

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

查看更多关于各大CMS厂商的CMS存在的同一设计缺陷 - 网站安全的详细内容...

  阅读:75次