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

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

缺陷编号:wooyun-2014-051339

漏洞标题:smartoa 企业版 政务办 任意文件上传 获取webshell(多处)

相关厂商:广州力智软件有限公司

漏洞作者: what_news

提交时间:2014-02-19 10:16

修复时间:2014-05-20 10:17

公开时间:2014-05-20 10:17

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

危害等级:高

自评Rank:10

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

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

没有对用户上传类型就行判断过滤,虽然在客户端进行了过滤筛选,但是到服务端没有进行多一步的验证,使得可以通过改包绕过客户端验证

详细说明:

测试网站:http://demo.smartoa.com.cn/ 随机选择一个普通用户登录进去(管理员更不用说了)
第1处
在应用中心->新闻管理->新增 按钮 -> 基础信息 -> 点击上传
主要代码如下

public JsonResult UpLoadImage()
{
ArticleBLL.UpFileImage image = new ArticleBLL().UpLoadImage(); //跟进
base.G2Result.Data = image;
if (string.IsNullOrEmpty(image.ImageUrl))
{
base.G2Result.Result = false;
base.G2Result.Message = "上传失败";
}
return base.Json(base.G2Result);
}
public UpFileImage UpLoadImage()
{
UpFileImage image = new UpFileImage();
UploadedFileCollection uploadedFiles = HttpUploadModule.GetUploadedFiles();
if (uploadedFiles != null)
{
foreach (UploadedFile file in uploadedFiles)
{
try
{
string path = string.Concat(new object[] { @"CMS\Article\TitleImage\", Guid.NewGuid(), ".", file.Extension }); //没判断文件类型,直接利用 导致任意文件上传
file.SaveAs(path);
image.ImageName = file.ClientName;
image.ImageUrl = path;
image.FileServerUrl = FileManage.FileServerPath;
}
catch
{
throw;
}
}
}
return image;
}


正常上传 我把一句话木马改成jpg格式

cms.png


修改成aspx格式

cms1.png


shell路径

cm3.png


第2处
在应用中心->新闻管理->新增 按钮 -> 文章内容 -> 有个添加图片的图标 点击上传
主要代码如下

public JsonResult UploadImage()
{
G2JsonObject data = new G2JsonObject();
string str = Path.Combine(this.storeRootPath, DateTime.Now.ToString("yyyyMMdd"));
UploadedFileCollection uploadedFiles = HttpUploadModule.GetUploadedFiles();
foreach (UploadedFile file in uploadedFiles)
{
try
{
file.SaveAs(Path.Combine(str, file.ClientName)); //没过滤,可上传任意文件
data.Result = true;
data.Data = Path.Combine(str, file.ClientName);
}
catch (Exception exception)
{
data.Message = exception.Message;
data.Result = false;
}
}
return base.Json(data);
}


正常上传 把木马改成jpg格式

html1.png


抓包,修改成aspx格式

html2.png


木马地址

html3.png


菜刀链接

html4.png


第3处
任务中心->任务派发->新增->附件浏览
页面主要代码如下

public JsonResult UploadAttachment(string ID)
{
UploadedFileCollection uploadedFiles = HttpUploadModule.GetUploadedFiles();
if ((uploadedFiles != null) && (uploadedFiles.Count >= 1))
{
UploadedFile file = uploadedFiles[0];
AttachmentContract contract = new AttachmentContract();
contract.AttachmentID = Guid.NewGuid();
contract.AttachmentSize = file.ContentLength;
contract.Extension = file.Extension.ToLower();
contract.AttachmentName = file.ClientName;
contract.AttachmentNameWithNotExtension = file.ClientNameWithoutExtension;
contract.CreateEmployeeName = this.CurrentUserName;
contract.CreateTime = DateTime.Now;
string str = Path.Combine("UDF", DateTime.Now.ToString("yyyyMM"));
contract.StorePath = Path.Combine(str, contract.AttachmentID.ToString() + "." + contract.Extension);//没过滤直接利用
file.SaveAs(contract.StorePath, true);
base.G2Result.Data = contract;
}
return base.Json(base.G2Result);
}


udf.png


udf1.png


udf3.png


udf4.png


udf5.png


第4处 应用中心->人事管理->劳动合同—>附件信息->上传附件
主要代码如下

public JsonResult UpLoadFile()
{
ContractAttachmentBLL tbll = new ContractAttachmentBLL();
return base.Json(tbll.UpLoadFile()); //跟进
}
public ListDataResult<ContractAttachmentContract> UpLoadFile()
{
ListDataResult<ContractAttachmentContract> result = new ListDataResult<ContractAttachmentContract>();
result.Result = true;
UploadedFileCollection uploadedFiles = HttpUploadModule.GetUploadedFiles();
try
{
if (uploadedFiles == null)
{
return result;
}
foreach (UploadedFile file in uploadedFiles)
{
ContractAttachmentContract contract2 = new ContractAttachmentContract();
contract2.AttachmentID = new Guid?(Guid.NewGuid());
ContractAttachmentContract item = contract2;
string str = item.AttachmentID.ToString();
string str2 = @"ContractAttachment\" + str + "." + file.Extension;//没判断 产生漏洞
file.SaveAs(@"HRCM\" + str2);
item.AttachmentName = file.ClientNameWithoutExtension;
item.AttachmentUrl = str2;
item.ExtName = file.Extension;
item.FileSize = file.ContentLength;
result.Rows.Add(item);
}
}
catch (Exception exception)
{
result.Result = false;
result.Message = exception.Message;
}
return result;
}


xls.png


xls1.png


xls2.png

xls3.png


第5处 个人办公 我的网盘那 可以随便上传任意文件 只是上传后暂时找不到文件上传后的路径比较悲催 但是也存在任意文件上传漏洞

漏洞证明:

如上

修复方案:

白名单判断类型修复

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2014-02-24 09:15

厂商回复:

CNVD未在本地实例或其他实例上复现,仅确认所述DEMO实例及原理分析,rank 15

最新状态:

暂无


漏洞评价:

评论

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

    给力。

  2. 2014-02-19 10:49 | what_news ( 普通白帽子 | Rank:195 漏洞数:48 | 小菜一个 希望成为大菜)

    @wefgod 要多像你学习

  3. 2014-02-20 09:50 | wefgod ( 普通白帽子 | Rank:1807 漏洞数:179 | 力不从心)

    这货是JSP的还是PHP的

  4. 2014-02-20 10:45 | what_news ( 普通白帽子 | Rank:195 漏洞数:48 | 小菜一个 希望成为大菜)

    .NET

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

    明白。

  6. 2014-03-02 01:09 | Matt 认证白帽子 ( 普通白帽子 | Rank:523 漏洞数:107 | 承接代码审计 http://codescan.cn/)

    @wefgod 看来你准备刷一波 ~~

  7. 2014-03-02 01:29 | wefgod ( 普通白帽子 | Rank:1807 漏洞数:179 | 力不从心)

    @Matt 木有,就搞了两个去数字。太小众了。

  8. 2014-03-02 21:38 | Matt 认证白帽子 ( 普通白帽子 | Rank:523 漏洞数:107 | 承接代码审计 http://codescan.cn/)

    @wefgod 站个位置咩 我都2-3月没在数字提拉 被你们这群黑客刷的太狠了

  9. 2014-03-03 09:33 | wefgod ( 普通白帽子 | Rank:1807 漏洞数:179 | 力不从心)

    @Matt 哈哈,我打酱油的而已

  10. 2014-03-16 14:14 | wefgod ( 普通白帽子 | Rank:1807 漏洞数:179 | 力不从心)

    这个oa还有更厉害的漏洞。

  11. 2014-03-17 11:38 | what_news ( 普通白帽子 | Rank:195 漏洞数:48 | 小菜一个 希望成为大菜)

    @wefgod 你为什么这么厉害

  12. 2014-05-20 12:07 | 郭斯特 ( 普通白帽子 | Rank:181 漏洞数:69 | GhostWin)

    iis6解析即可~