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

漏洞详情

披露状态:

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

最新状态:

暂无


漏洞评价: