
https://xz.aliyun.com/news/90808
机缘巧合下从好兄弟那拿套源码,好久没审计有点生疏了,搭个环境练练手
虚拟机选择win2012,在Internet信息服务(IIS)上新建网站,设置站点名称和安装路径

在应用程序池中找到对应站点程序池,托管管道模式默认为集成,将其修改为经典模式.NET

新建数据库,与web.config连接保持一致即可
|
按顺序依次导入sql文件

Patch产品授权
该产品是需要产品授权的,访问login.aspx会提示无效或过期

逆向破解算法,模拟生成授权licsense
应用启动时验证(CheckLicense)
位置:EkpBaseGlobal.Application_Start()→EkpGlobal.CheckLicense()
流程:
-
读取文件授权( Checker.p_GetLicense())
-
读取 Bin/Landray.lic文件 -
获取CPU ID和MAC地址 -
解密授权文件 -
解析授权信息(10个字段) -
提取FullName
-
读取数据库授权
-
从 Mekp_EISProductInfo表读取LicenseKey -
使用相同的密钥和IV解密 -
解析授权信息(2个字段:过期时间;FullName)
-
验证授权
-
比较文件授权和数据库授权中的FullName是否一致 -
如果是试用版,检查过期时间(逻辑: DateTime.Now < expiration→ 返回false) -
如果验证通过,将授权信息存储到 Application对象中
-
更新数据库授权(如果是试用版)
-
将数据库授权更新为当前时间 + FullName
采用加密算法:3DES (TripleDES)

-
文件授权lic:
读取文件并解密(密钥:CPU + "xxxxxxx20800",IV:MAC地址)
解析10个字段,关键字段:array[3] = "DeptName|FullName存入lisenceInfo.FullName
-
时间校验: if (DateTime.Now < result) return false,如果当前时间 < 过期时间,返回false(验证失败) -
FullName匹配: lisenceInfo.FullName必须与数据库完全一致
根据 CPU MAC 生成

注释鉴权代码重编译
如果觉得第一种方法比较复杂,也可以选择第二种简单粗暴的方法,直接注释掉核心鉴权代码
根据报错的关键字定位相关的文件,发现有以下这些文件参与鉴权,这些方法都来源于yard.Framework.dll
-
EkpGlobal.CheckLicense() – 核心授权检查 -
EkpPage.OnInit() – 页面初始化检查 -
EkpPage.Page_Load() – 页面加载检查 -
EkpUserControl.Page_Load() – 用户控件检查

因此我们可以使用dnspy导入dll,再导出工程到vs里面进行重编译

成功通过授权校验,访问系统首页

web.config配置分析
根据web.config分析,以下路径配置为允许所有用户访问(<allow users="*" />)

(部分接口关键字替换了)整理如下:
|
配置路径 |
访问路径 |
说明 |
|
|
|
WebService接口目录,所有ASMX文件可匿名访问 |
|
|
|
该模块目录下所有aspx文件可匿名访问 |
|
|
|
第三方集成目录 |
|
|
|
检查页面目录 |
|
|
|
移动端下载接口 |
漏洞分析
前台SSRF
-
文件路径: bin/yard.UI.Integration/yard.UI.Integration.third.template/Service.cs-
方法: PostResponsethird目录配置允许匿名访问
-
link参数直接拼接: base.Request["link"]直接拼接到URL中,未进行任何验证 -
无URL白名单: 未限制可访问的URL范围,虽然固定使用 http://,但可以通过传入link参数控制造成SSRF
前台down.aspx SQL注入


前台Notify.asmx SQL注入
-
文件路径 -
: bin/yard.WebService/yard.WebService.WS.Notify/Notify.cs -
LoginName参数直接拼接: person.LoginName直接拼接到SQL查询中
|
构造请求,通过xp_cmdshell写入文件1.txt

前台任意用户添加
-
文件路 -
径: bin/yard.WebService/yard.WebService.WS/UserInfo.cs User
方法使用 [WebMethod]标记,WS目录被配置为允许所有用户访问,该方法无权限校验可直接执行数据库插入操作-
继承于WebService可直接传入账号密码等信息新建用户,首先在数据库中查询是否存在该⽤户, 如果不存在就创建


FI_ORG_EMP为员工主表,可看到成功新建用户

后台UploadLogImg.aspx任意文件上传
文件binyard.Admin.UIyard.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错误,控件状态无法恢复
|
可进行目录穿越,代码会取最后一个之后的部分,但是正斜杠可以正常绕过
..thirdshell.aspx
→ empty = "shell.aspx"❌../third/shell.aspx
→ empty = "third/shell.aspx"✅️
结合web.config,可写到third路径下

文章来源:亿人安全
黑白之道发布、转载的文章中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途及盈利等目的,否则后果自行承担!
如侵权请私聊我们删文
END














暂无评论内容