声明:该公众号大部分文章来自作者日常学习笔记,也有部分文章是经过作者授权和其他公众号白名单转载,未经授权,严禁转载,如需转载,联系开白。请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。 |
|---|
Checker.p_GetLicense())Bin/Landray.lic文件Mekp_EISProductInfo表读取LicenseKeyDateTime.Now < expiration→ 返回false)Application对象中采用加密算法:3DES (TripleDES)
读取文件并解密(密钥:CPU + "xxxxxxx20800",IV:MAC地址)
解析10个字段,关键字段:array[3] = "DeptName|FullName存入lisenceInfo.FullName
if (DateTime.Now < result) return false,如果当前时间 < 过期时间,返回false(验证失败)lisenceInfo.FullName必须与数据库完全一致
根据 CPU MAC 生成
注释鉴权代码重编译
如果觉得第一种方法比较复杂,也可以选择第二种简单粗暴的方法,直接注释掉核心鉴权代码
根据报错的关键字定位相关的文件,发现有以下这些文件参与鉴权,这些方法都来源于yard.Framework.dll
因此我们可以使用dnspy导入dll,再导出工程到vs里面进行重编译
成功通过授权校验,访问系统首页
web.config配置分析
根据web.config分析,以下路径配置为允许所有用户访问(<allow users="*" />)
(部分接口关键字替换了)整理如下:
配置路径访问路径说明<location path="XX">/XX/*.asmxWebService接口目录,所有ASMX文件可匿名访问<location path="aaa">/aaa/*.aspx该模块目录下所有aspx文件可匿名访问<location path="third">/third/*.aspx第三方集成目录<location path="Global/Pages/CheckPage">/Global/Pages/CheckPage/*.aspx检查页面目录<location path="Services/MobileDown.aspx">/Services/MobileDown.aspx移动端下载接口
漏洞分析
前台SSRF
bin/yard.UI.Integration/yard.UI.Integration.third.template/Service.csPostResponsethird目录配置允许匿名访问
base.Request["link"]直接拼接到URL中,未进行任何验证http://,但可以通过传入link参数控制造成SSRF
前台down.aspx SQL注入 前台Notify.asmx SQL注入
bin/yard.WebService/yard.WebService.WS.Notify/Notify.csperson.LoginName直接拼接到SQL查询中[WebMethod]
public NotifyResult getTodo(string targets, int type, string otherCond, int rowSize, int pageNo)
{
Person person = JsonConvert.DeserializeObject<Person>(targets);
if (!string.IsNullOrEmpty(person.LoginName))
{
// SQL注入点: LoginName参数直接拼接
string oneStrValue = yard.DataAccess.DataAccess.GetOneStrValue(
$"SELECT id FROM FI_ORG_EMP where account=N'{person.LoginName}'");
// ...
}
}
构造请求,通过xp_cmdshell写入文件1.txt
前台任意用户添加
bin/yard.WebService/yard.WebService.WS/UserInfo.csUser方法使用[WebMethod]标记,WS目录被配置为允许所有用户访问,该方法无权限校验可直接执行数据库插入操作
FI_ORG_EMP为员工主表,可看到成功新建用户
后台UploadLogImg.aspx任意文件上传
文件bin\yard.Admin.UI\yard.Admin.UIUploadLogImg.cs提供了saveBg()和saveLogo()两个上传的方法
string text = base.Server.MapPath这个地方路径不可控,默认会写到/App_Themes/Login下面,文件名为日期命名
构造方法上传
/App_Themes/Login不允许,因此这个上传无法shell
后台 bulkinsert_data.aspx任意文件上传
但是不要灰心,这个点找不到就找下一个,继续搜SaveAs(filename)
__VIEWSTATE和__VIEWSTATEGENERATOR/XX/bulkinsert_data.aspx?id=1时,页面加载 -Page_Load方法执行,所有服务器控件初始化,使用 Base64 编码,生成__VIEWSTATE和__VIEWSTATEGENERATOR值,ASP.NET 会验证,没有ViewState会导致Invalid ViewState错误,控件状态无法恢复string text = "/files/"; // 固定基础路径
string fileName = tpfile.PostedFile.FileName; // 用户输入
int num = fileName.LastIndexOf("\\"); // 查找最后一个反斜杠
string empty = string.Empty;
empty = ((num <= 0) ? ("\\" + fileName) : fileName.Substring(num));
tpfile.PostedFile.SaveAs(base.Server.MapPath(text + empty));
可进行目录穿越,代码会取最后一个\之后的部分,但是正斜杠可以正常绕过
..\third\shell.aspx→empty = "shell.aspx"❌../third/shell.aspx→empty = "third/shell.aspx"✅️结合web.config,可写到third路径下
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。