网站地图    收藏   

主页 > 后端 > 网站安全 >

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

来源:自学PHP网    时间:2015-04-16 23:15 作者: 阅读:

[导读] 简要描述:为了写这个漏洞我已经下载了很多CMS做了很多实验,。其中大多谈到的均为乌云上已经注册的厂商,包括:Ecshop、PHPwind、74CMS等等 这里一并提交一方面是为了防止各种小伙伴...

 简要描述:

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

 

0x00 概述  

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

 

0x01 什么是短文件名 

 Windows,如果一个文件名的长度大于9个字符,那么可以使用短文件名的方式去访问它,通过短文件名的方式去访问一个文件可以使用户不需要输入完整的文件名访问它。那么我们这里就做一个实验,假如一个CMSlog日志是以这样的规则去命名的。  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.sql20140607wisgtt.sql20140607ysaybn.sql  从上面可以刚出最前面的是备份的年月日,后面的则是随机字符串,文件名总共超过9个字符,通过短文件名发现: 

\

可以使用201406~1.sql去访问这个复杂的备份数据,从而我们可以想象,如要要枚举出一年所可能存在的,那么我们可以构造这样的简单字典去跑,根据112个月,假设最早的Ecshop20093月开始,到今年有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.sql20140607_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-02014-1这两个文件夹,分别作为四次总共是8个,即:2014-0~12014-0~22014-0~32014-0~42014-1~12014-1~22014-1~32014-1~4。其中的01代表的是年份,因为101112月份是1开头的,那么这样的总能遍历出一个文件夹,假设从2010年开始到20146月总共是“28”个,也就是说文件夹只要枚举28种可能性,如果存在返回状态码403。然后我们就开始枚举数据库名字了吗?不不不!因为每个文件夹中只存一个数据库!通过短文件名方式我们会发现,数据库其实就是可以直接使用SQL-20~1.SQL来访问。如下图:

\

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

\

 

\

 

 

 

4.PHPWind(直接获取备份数据库)  http://nt.phpwind.com/tj.php?id=913&verify=d73f768d141400cdc589312fbb9fb1a5&sign=pw9gbkzip&type=click  Phpwind的备份数据库也存在和CMSeasy一样的基于一个随机文件夹中,但是对于命名存在一定规律性,导致可以直接获取数据库。进入后台备份一下数据库,看看所存在的文件名称是怎样的:  pw_9-0_20140607201943_ma9Oapw_9-0_20140607201953_aXYP9  pw_9-0_20140607202000_cPg21pw_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包,导致根本无需爆破,只要phpwindwindows下并且备份数据库则可以使用这样的形式去获取到数据库: 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特有的短文件名方式进行访问了。其实很多ASPASPXCMS全是Windows下搭建的,这样以来,如果没有有效的保护备份的数据库,对备份的数据库名称具有一定规律和简单爆破性,那么可以导致数据库备份直接泄漏,从而危机网站安全。当然在我测试了很多CMS中有部分CMS还是对这方面做的很安全:  比如:  YouYAX的数据库虽然备份在:ext_public\phpmysqlautobackup\backups目录下,并且备份的数据库为.gz的压缩包,并且很有规律的名字,可以使用“MYSQL2~1.GZ”看到,但当我们访问时候却提示“Forbidden 

\

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

\

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

0x05 解决方案



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

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论