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

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

缺陷编号:wooyun-2013-021374

漏洞标题:ROYCMS漏洞完结篇,身份伪造,直入管理后台!

相关厂商:roycms.cn

漏洞作者: wefgod

提交时间:2013-04-08 10:34

修复时间:2013-07-07 10:34

公开时间:2013-07-07 10:34

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

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-04-08: 细节已通知厂商并且等待厂商处理中
2013-04-10: 厂商已经确认,细节仅向厂商公开
2013-04-13: 细节向第三方安全合作伙伴开放
2013-06-04: 细节向核心白帽子及相关领域专家公开
2013-06-14: 细节向普通白帽子公开
2013-06-24: 细节向实习白帽子公开
2013-07-07: 细节向公众公开

简要描述:

发现厂商连上次的SQL注入都不愿意去修改,感觉完全不重视安全方面的问题,所以就发到这了……这次也会附上分析,可以直接伪造身份进后台!然后getshell什么的就不用多解释了 http://www.wooyun.org/bugs/wooyun-2013-020667

详细说明:

先关注下一些后台相关的页面。比如createDB.aspx这个页面,看看后端的代码(就是cs文件):

public partial class createDB : ROYcms.AdminPage


很明显可以看出,都是继承了父类AdminPage的,再转到AdminPage.cs围观下部分主要代码:

protected override void OnPreInit(EventArgs e)
{
base.OnPreInit(e);
ROYcms.Config.SessionData.SessionKey = "administrator";
if (!ROYcms.Config.SessionData.IsLogin())
{
Response.Redirect(string.Format("~/administrator/login.aspx?Page={0}", Request.Path));
}
……
}


在这个初始化的方法中我们可以看见他为SessionKey赋值administrator,接着关注下IsLogin()这个方法的主要代码:

public static bool IsLogin()
{
bool ret = false;
if (ROYcms.Common.Session.Get(SessionKey) != null || ROYcms.Common.cooks.GetCookie(SessionKey) != null) //问题所在
{
if (ROYcms.Common.cooks.GetCookie(SessionKey) == null)//如果该cookie为空……
{
ROYcms.Common.cooks.SaveCookie(SessionKey, ROYcms.Common.Session.Get(SessionKey), 2);
}
//如果cookie中的SessionKey不为空的情况下,分配cookie!
else { ROYcms.Common.Session.Add(SessionKey, ROYcms.Common.cooks.GetCookie(SessionKey)); }
ret = true;
}
return ret;
}


可能看代码有点乱,简单分析下,最开始用了一个或条件来判断,第一个条件是session中保存有sessionkey的值就可以继续执行下面的代码,第二个条件是cookie中的sessionkey不为空。看看上面我们提到的给sessionkey赋值为什么?
ROYcms.Config.SessionData.SessionKey = "administrator";
简单说,我们虽然无法控制服务器端的session是否为空,但是我们可以控制我们本地提交的cookie是否包含有这个字段!接着看:
if (ROYcms.Common.cooks.GetCookie(SessionKey) == null)
如果cookie中的administrator字段为空……则执行下面的分配cookie到本地的操作。但是如果这个值不为空呢?执行下面的else分配session:
else { ROYcms.Common.Session.Add(SessionKey, ROYcms.Common.cooks.GetCookie(SessionKey)); }
也就是说,当cookie中的administrator字段不为空的时候,无论该字段是什么值,服务器都会为你分配一个session!自动的把你当成已经登录的管理员了!
上面的代码我们也可以看见,基本上就是两点:
1. 判断session是否为空,不判断session某个键对应的值;
2. 判断cookie中的指定字段是否为空,不判断该字段内容是否是伪造的、是否是合法的。
为了验证我们的想法,再看login.aspx.cs中的protected void AdminLogin_Click方法的一点代码:
ROYcms.Common.cooks.SaveCookie("administrator", username.Text.Trim(), 2);
看见这段代码就知道,服务器分配给客户端的cookie,也基本只是包含这部分自定义的字段(当然肯定也会有sessionid,那个不用明文写出来)。

漏洞证明:

这下明白了?在访问比如刚才的createDB.aspx,提交某cookie(自行构造不解释啊,已经明说了“cookie中的administrator字段啊”!),会报错:

.jpg


其实可以不用理会,因为当“某字段不为空”的时候,他还会重新给我们cookie赋值一次的,然后访问后台的index.aspx:

2.jpg

修复方案:

相关的权限用session在服务器端判断,而不是过分的依靠cookie去判断。其实有一个sessionid就可以了啊!干嘛在客户端那搞那么多东西啊

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2013-04-10 16:24

厂商回复:

------

最新状态:

暂无