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

Amir富文本编辑器,其实就一个很小的货。从这货上看看如何控制.NET的IsPostBack的值。

 

image001.png

 

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

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

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

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

 

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代码解决问题:

 

image012.png

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

修复方案:

加强验证