(1)风险概述
    路径遍历,即利用路径回溯符“../”跳出程序本身的限制目录实现下载任意文件。例如Web应用源码目录、Web应用配置文件、敏感的系统文件(/etc/passwd、/etc/paswd)等。
    例如一个正常的Web功能请求:
    http://www.test.com/get-files.jsp?file=report.pdf
    如果Web应用存在路径遍历漏洞,则攻击者可以构造以下请求服务器敏感文件:
    http://www.test.com/get-files.jsp?file=../../../../../../../../../../../../etc/passwd
    (2)缺陷编码示例:
    以下是一段存在文件路径遍历缺陷的代码,服务端没有对传入的imgName参数进行合法性验证,而imgName参数值就是客户端请求下载的文件,攻击者通过控制imgName参数可以遍历服务器上的敏感文件:

    1. protected void doPost(HttpServletRequest request,
    2. HttpServletResponse response) throws ServletException, IOException {
    3. try {
    4. byte data[] = new byte[1];
    5. //取得用户提交的图片文件名,没有检测是否为图片,也没有检测是否包含../../目录跳转的字符
    6. String imgName = request.getParameter("imgName");
    7. String imgKey = MD5Encrypt.MD5(imgName);//本地
    8. if (imageCache.containsKey(imgKey)) {
    9. data = (byte[]) imageCache.get(imgKey);
    10. } else {
    11. String imagePath = Consts.IMG_LOCAL_PAHT + imgName;
    12. //没有对该参数进行严格的验证和过滤,就拼接成完整的图片路径
    13. InputStream inputStream = null;
    14. File imageFile = new File(imagePath);
    15. logger.debug(imagePath + " " + imageFile.exists());
    16. if (imageFile.exists() && imageFile.isFile()) {
    17. inputStream = new FileInputStream(imagePath);
    18. int i = inputStream.available();
    19. data = new byte[i];
    20. inputStream.read(data);
    21. inputStream.close();
    22. imageCache.put(imgKey, data);
    23. } else {
    24. }
    25. }
    26. //将文件内容输出到客户端
    27. response.setContentType("image/*");
    28. OutputStream outputStream = response.getOutputStream();
    29. outputStream.write(data);
    30. outputStream.close();
    31. }