news 2026/7/4 21:02:23

某EIS办公平台0day代码审计过程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
某EIS办公平台0day代码审计过程

免责声明

本文仅供学习使用,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。

环境搭建

在Internet信息服务(IIS)上新建网站,设置站点名称和安装路径

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

新建数据库,与web.config连接保持一致即可

set DBNAME=EIS set SQLUSER=sa set SQLPWD=password01! set SQLSERVER=127.0.0.1,1433 <connectionStrings> <add name="" connectionString="Data Source=.\SQLEXPRESS;User ID=sa;Password=password01!;Initial Catalog=EIS;Connection Timeout=30;Connect Retry Count=3;Connect Retry Interval=10;Pooling=true;Min Pool Size=0;Max Pool Size=100" providerName="System.Data.SqlClient" /> </connectionStrings>

按顺序依次导入sql文件

Patch产品授权

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

逆向破解算法,模拟生成授权licsense

应用启动时验证流程:

读取文件授权(Checker.p_GetLicense())

  • 读取Bin/yard.lic文件
  • 获取CPU ID和MAC地址
  • 解密授权文件,解析授权信息(10个字段)
  • 提取FullName

读取数据库授权

  • Mekp_EISProductInfo表读取LicenseKey
  • 使用相同的密钥和IV解密
  • 解析授权信息(2个字段:过期时间;FullName)

验证授权

  • 比较文件授权和数据库授权中的FullName是否一致
  • 如果是试用版,检查过期时间(逻辑:DateTime.Now < expiration→ 返回false)
  • 如果验证通过,将授权信息存储到Application对象中

采用加密算法: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 生成合法 license

注释鉴权代码重编译

如果觉得第一种方法比较复杂,也可以选择第二种简单粗暴的方法,直接注释掉核心鉴权代码

根据报错的关键字定位相关的文件,发现有以下这些文件参与鉴权,这些方法都来源于yard.Framework.dll

  • EkpGlobal.CheckLicense() - 核心授权检查
  • EkpPage.OnInit() - 页面初始化检查
  • EkpPage.Page_Load() - 页面加载检查
  • EkpUserControl.Page_Load() - 用户控件检查

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

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

web.config配置分析

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

(部分接口关键字替换了)整理如下:

配置路径

访问路径

说明

<location path="XX">

/XX/*.asmx

WebService接口目录,所有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.cs
  • 方法:PostResponsethird目录配置允许匿名访问

  • link参数直接拼接:base.Request["link"]直接拼接到URL中,未进行任何验证
  • 无URL白名单: 未限制可访问的URL范围,虽然固定使用http://,但可以通过传入link参数控制造成SSRF

前台down.aspx SQL注入
  • ($"...")将用户提供的或来自请求的变量 arg拼接到了 SQL 查询,main_id='{arg}' 变量 arg 在拼接到 SQL 查询之前,没有经过任何验证

sql注入延时验证

前台Notify.asmx SQL注入
  • 文件路径:bin/yard.WebService/yard.WebService.WS.Notify/Notify.cs
  • LoginName参数直接拼接:person.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.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错误,控件状态无法恢复
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.aspxempty = "shell.aspx"
  • ../third/shell.aspxempty = "/third/shell.aspx"✅️

结合web.config,可写到third路径下

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/4 17:10:57

向量在计算机图形学中的核心应用

向量数学是计算机图形学的基石&#xff0c;贯穿从几何建模到最终渲染的每一个环节。以下是针对图形学领域的重点补充&#xff1a;一、图形学特有的向量表示与运算1.1 齐次坐标&#xff08;Homogeneous Coordinates&#xff09;扩展维度&#xff1a;三维点/向量用四维表示&#…

作者头像 李华
网站建设 2026/7/2 4:34:57

SelectDB索引实战:从入门到精通,避开那些年我踩过的坑

一、SelectDB索引体系全景图 SelectDB的索引体系分为两大阵营&#xff1a;点查索引和跳数索引。这个分类方式很巧妙&#xff0c;不是按数据结构分&#xff0c;而是按查询场景分&#xff0c;这让我想起了当年学MySQL时死记硬背B树、哈希索引的日子&#xff0c;其实从使用场景出…

作者头像 李华
网站建设 2026/7/1 21:25:03

探秘常见机器人控制运动上位机源码:解锁多种运动算法

常见机器人控制运动上位机源码&#xff0c;包涵多种运动算法。 支持marilink 提供技术文档嘿&#xff0c;各位技术爱好者们&#xff01;今天来聊聊常见机器人控制运动上位机源码&#xff0c;这可是个超有趣又实用的领域。 一、概述 在机器人开发中&#xff0c;上位机就像是机器…

作者头像 李华
网站建设 2026/7/1 14:58:37

9 个降AI率工具,继续教育学生必备!

9 个降AI率工具&#xff0c;继续教育学生必备&#xff01; AI降重工具&#xff1a;让论文更自然&#xff0c;让学术更真实 在当前的学术写作环境中&#xff0c;随着AI技术的广泛应用&#xff0c;越来越多的学生和研究者面临一个共同的问题——如何有效降低AIGC率&#xff0c;同…

作者头像 李华
网站建设 2026/7/2 13:54:39

运用工具Postman快速导出python接口测试脚本

Postman的脚本可以导出多种语言的脚本&#xff0c;方便二次维护开发。 Python的requests库&#xff0c;支持python2和python3&#xff0c;用于发送http/https请求 使用unittest进行接口自动化测试 一、环境准备 1、安装python&#xff08;使用python2或3都可以&#xff09;…

作者头像 李华
网站建设 2026/6/26 0:46:03

研发管理软件:合规・协同・智能・灵活为汽车部件行业研发管理强力赋能——全星研发管理APQP软件系统功能解析

研发管理软件&#xff1a;合规・协同・智能・灵活为汽车部件行业研发管理强力赋能——全星研发管理APQP软件系统功能解析在汽车部件、芯片半导体行业迈向高质量发展的进程中&#xff0c;IATF 16949、VDA等标准&#xff0c;对研发管理的体系化、标准化、全流程追溯提出了极高要求…

作者头像 李华