Java后台Linux软链接文件下载检验

  最近项目的测试哥们提了一个linux系统软链接攻击的问题,项目中导出服务器上某个文件的时,通过软连接漏洞可以获取到其他文件的信息。

  具体过程自己写了个下载的Demo模拟了一下:

  下载的servlet和html如下,下载/opt/temp/a.txt,国际惯例,内容是hello world,文件大小12kb。

  

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Download File</title>
<script type="text/javascript">
    function download() {
        window.open("download.do");
    }
</script>
</head>
<body>
    <input type="button" value="Download" onclick="download()" />
</body>
</html>

  

package com.dj.servlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.tomcat.util.http.fileupload.IOUtils;

/**
 * @author DU
 *
 */
@WebServlet("/download.do")
public class DownloadDemoServlet extends HttpServlet
{
  private static final long serialVersionUID = 1L;

  public DownloadDemoServlet()
  {
    super();
  }

  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException
  {
    String fileName = "a.txt";
    response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
    String filePath = "/opt/temp/" + fileName;
    FileInputStream is = new FileInputStream(new File(filePath));
    ServletOutputStream os = response.getOutputStream();
    IOUtils.copy(is, os);
    os.close();
    is.close();
  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException
  {
    doGet(request, response);
  }

}

  这样下载下来的文件没有任何问题,接下来就涉及软链接的问题,在服务器上/home目录下有一个npp.7.3.3.Installer.x64.exe的文件,当然这是个notepad++的安装文件,我自己放进去的。先将/opt/temp/a.txt删除掉,然后用xshell执行命令ln -s /home/npp.7.3.3.Installer.x64.exe /opt/temp/a.txt 创建.exe的软链接文件为a.txt,关于软链接文件这里不细表,可以自行百度,可以理解为类似windows的快捷方式,创建成功之后是这样的,注意这时候文件大小已经是2.84M了。

  

  然后再次点击下载,这个时候下载下来的是这样的:

  

  是的,下载软链接会直接下载软链接指向的源文件,如果是敏感文件的话就很不好了。当然,笔者依然处于菜鸟阶段,还不是很清楚恶意攻击者可以通过怎样的手段达到创建出这个软链接。

  接下来就是如何规避这个问题了:

  第一种方式是通过对比文件的绝对路径和规整化路径,如果是源文件的话这两个路径应该是一样的,否则就是链接文件。

  

    // 对比绝对路径和规整化路径
    String absolutePath = file.getAbsolutePath();
    String canonicalPath = file.getCanonicalPath();
    if (!absolutePath.equals(canonicalPath))
    {
      response.getWriter().append("Download Failed!");
      return;
    }

  第二种方式可以直接通过jdk1.7开始出现的java.nio.file.Files类提供的接口判断。

  

  

  

    // 直接通过java.nio.file包中提供的接口判断
    Path path = Paths.get(filePath);
    boolean isSymbolicLink = Files.isSymbolicLink(path);
    if (isSymbolicLink)
    {
      response.getWriter().append("Download Failed!");
      return;
    }

如图,校验成功!

时间: 2024-10-14 03:03:50

Java后台Linux软链接文件下载检验的相关文章

Java 后台创建word 文档

---恢复内容开始--- Java 后台创建 word 文档 自己总结  网上查阅的文档 分享POI 教程地址:http://www.tuicool.com/articles/emqaEf6 方式一.(正常创建  适合短文本 无格式要求Word文档) 1 XWPFDocument doc = new XWPFDocument(); //创建word文件 2 XWPFParagraph p1 = doc.createParagraph(); //创建段落 3 XWPFRun r1 = p1.cre

高仿QQ源码下载 (android前端+JAVA后台+spark&lt;windows版聊天&gt;)方便集成到自己系统

 A openfire (XMPP+开源源码); B android前端源码(仿QQ高大上UI); C JAVA后台源码(UI高大上HTML5);  Dspark(windows版);  系统主要实现为:JAVA后台(springmvc+mybaits)+openfire(xmpp推送)+android(asmark+ActiveAndroid+async-http+universal-image-loader)+spark(windows版);  android前端 1.集成Activie

一次幸运的校招小米Java后台offer

背景 我是一个非985/211的本科.其实最开始并不怎么自信,靠的就是一帮×××互相的鼓励,才坚持到了现在.我小米的面试机会是亲戚给内推的,因为碰巧他们部门校招没有招满,所以很幸运的拿到了这个机会.提一点,我面的是Java后台岗. 面试开始 先申明一点,虽然我通过了面试也拿到了offer,但是至于我是否真的答对了题目,我也不知道,所以这里为了避免误人子弟就不把我的答案发出来了,如果有兴趣可以自行百度,google. 一面: 1.10 亿个 URL,每个 URL的大小< 56B,要求去URL进行去

java调用Linux执行Python爬虫,并将数据存储到elasticsearch--(环境脚本搭建)

java调用Linux执行Python爬虫,并将数据存储到elasticsearch中 一.以下博客代码使用的开发工具及环境如下: 1.idea: 2.jdk:1.8 3.elasticsearch:5.2.0 4.Linux 5.Python 6.maven 二.maven坐标: <!--java连接ulinix脚本架包--> <dependency> <groupId>ch.ethz.ganymed</groupId> <artifactId>

Java调用Linux命令(cd的处理)

一.Java调用Linux系统的命令非常简单 这是一个非常常用的调用方法示例: 1 public String executeLinuxCmd(String cmd) { 2 System.out.println("got cmd job : " + cmd); 3 Runtime run = Runtime.getRuntime(); 4 try { 5 Process process = run.exec(cmd); 6 InputStream in = process.getIn

jQuery和java后台的jsonp跨域问题

Jsonp原理: ajax本身是不可以跨域的,通过产生一个script标签来实现跨域.因为script标签的src属性是没有跨域的限制的.其实设置了dataType: 'jsonp'后,$.ajax方法就和ajax XmlHttpRequest没什么关系了,取而代之的则是JSONP协议.JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问. JSONP是一种脚本注入(Script Injection)行

IOS 基于APNS消息推送原理与实现(JAVA后台)--转

Push的原理: Push 的工作机制可以简单的概括为下图 图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider. APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器. 上图可以分为三个阶段. 第一阶段:Push服务器应用程序把要发送的消息.目的iPhone的标识打包,发给APNS. 第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的

fastJson java后台转换json格式数据

什么事JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等

第三章 Linux 软链接与硬链接

Linux 软链接与硬链接 通过实验加深理解 [[email protected]]$ touch f1          #创建一个测试文件f1 [[email protected]]$ ln f1 f2          #创建f1的一个 硬连接   文件f2 [[email protected]]$ ln -s f1 f3       #创建f1的一个 符号连接 文件f3  即软链接 [[email protected]]$ ls -li            # -i参数显示文件的ino