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

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

缺陷编号:wooyun-2014-084220

漏洞标题:PageAdmin几个设计缺陷导致的安全漏洞

相关厂商:pageadmin.net

漏洞作者: L.N.

提交时间:2014-11-22 10:07

修复时间:2015-02-20 10:08

公开时间:2015-02-20 10:08

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

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-11-22: 细节已通知厂商并且等待厂商处理中
2014-11-22: 厂商已经确认,细节仅向厂商公开
2014-11-25: 细节向第三方安全合作伙伴开放
2015-01-16: 细节向核心白帽子及相关领域专家公开
2015-01-26: 细节向普通白帽子公开
2015-02-05: 细节向实习白帽子公开
2015-02-20: 细节向公众公开

简要描述:

1.login_key暴力预测
2.伪造任意会员或管理留言
3.删除任意留言
ps:.net开源了,相信各种特性漏洞会如雨后春笋般涌现,小菜先学点asp.net基础知识,等大牛们发特性漏洞的时候至少能够看懂。

详细说明:

1.login_key 暴力预测
/e/member/check_repeat.aspx

protected void Page_Load(Object src,EventArgs e)
{
Check_Post();
string Field=Request.Form["field"];//数据传入 自定义字段
string Field_Value=Request.Form["value"];//数据传入 自定义值
string UserName=Request.Form["username"];
if(!IsStr(Field))
{
return;
}
else if(Field.ToLower()=="userpassword")
{
return;
}
string Repeat="0";
int counts=0;
if(IsStr(Field))
{
Conn theconn=new Conn();
OleDbConnection conn=new OleDbConnection(theconn.Constr());
conn.Open();
string sql;
sql="select count(id) as co from pa_member where "+Field+"='"+Sql_Format(Field_Value)+"'";//查询数据库
OleDbCommand comm=new OleDbCommand(sql,conn);
OleDbDataReader dr=comm.ExecuteReader();
if(dr.Read())
{
counts=int.Parse(dr["co"].ToString());
}
dr.Close();
conn.Close();
if(counts>0){Repeat="1";}
}
Response.Write(Repeat);


}
可以看到 我们控制了pa_member表where查询中的字段和值,因此我们可以定义字段为login_key,然后暴力枚举值。
我们再来看下login_key的值是什么?

string LoginKey=LoginDate.AddSeconds(r.Next(3600,86164)).ToString("yyyyMMddHHmmss");


login_key为我们登录登录后的1个小时到一天中的任意中的任意一秒,格式如20141121221010,
这样会有什么样的问题呢?就是我们login_key完全可以预测,可以用上边的那段代码暴力枚举近几天的登录会员和管理(会员管理一个表)的login_key,而1天86400秒,所以难度不大。
下面问题来了,看官一定会问,这个login_key是干啥的,你可以温习下wefgod牛的 WooYun: PageAdmin可绕过验证伪造任意用户身份登录(前台、后台)
从wefgod牛的文章当中我们知道pageadmin的权限验证用的是uid和Valicate的,而Valicate以前是用的最后登录时间的md5,现在改为了login_key的md5,也就是登录后未来一天的任意一秒的md5。
现在我们获取了login_key,但是问题又来了,我们不知道他对应的uid是多少,我们可以直接选择有权限验证的页面直接加入login_key,然后枚举uid,登录进去就行了。
问题又来了,我们怎么确定这个用户是不是管理员,我思来想去,也只有观察下管理员在网站的活动了,比如他发表的最后一篇帖子的时间,最后一天留言的时间,去推测login_key的取值空间。
2.伪造任意会员或管理留言
/e/space/spc_fbk_ascx.cs
private void Post_Fbk()
{
string Fbk_Content=Request.Form["fb_content"];
if(Fbk_Content.Trim()=="")
{
conn.Close();
Response.Write("<script type='text/javascript'>alert('留言内容不能为空!');location.href=location.href</script>");
Response.End();
}
else
{
Fbk_Content=ResplayJs(Fbk_Content);
Current_LoginName=Request.Form["Current_LoginName"];//直接获取然后进去数据库
if(IsUserName(Current_LoginName))
{
sql="insert into pa_spcfbk(space_owner,fbk_username,feedback,reply) values('"+UserName+"','"+Sql_Format(Current_LoginName)+"','"+Sql_Format(Fbk_Content)+"','')";
OleDbCommand Comm=new OleDbCommand(sql,conn);
Comm.ExecuteNonQuery();
}
conn.Close();
Response.Write("<script type='text/javascript'>alert('提交成功!');location.href=location.href</script>");
Response.End();
}
}
这个没什么说的,设计缺陷,当前登录名自定义,可以伪造任何人留言,不用登录。
3.删除任意留言
/e/space/spc_fbk_ascx.cs
private void Del_Fbk()
{
string Did=Request.Form["did"];//直接删除
if(IsNum(Did))
{
sql="delete from pa_spcfbk where space_owner='"+UserName+"' and id="+int.Parse(Did);
OleDbCommand Comm=new OleDbCommand(sql,conn);
Comm.ExecuteNonQuery();
conn.Close();
}
conn.Close();
Response.Write("<script type='text/javascript'>location.href=location.href</script>");
Response.End();
}
这个都很明白,无权限控制的直接进数据库删除任意用户的任意留言

漏洞证明:

1.login_key暴力预测
a.暴力猜测login_key

Q7QB2IQUVZRE2%8)T9YE0TW.png


PYA)3WRO_F}L6X`]Y)}`2OK.png


2.伪造任意会员或管理留言

2LCHR0UWX5AB7~S8VUX@9~X.jpg


3.删除任意留言

[LSF]TH0CU3UMDFE0QD_M99.jpg

修复方案:

1.过滤
2.权限验证
3.权限验证

版权声明:转载请注明来源 L.N.@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:10

确认时间:2014-11-22 17:42

厂商回复:

您好,已经发布补丁修复次问题,感谢白帽子

最新状态:

暂无