任意文件读写漏洞即因为没有验证请求的资源文件是否合法导致的,此类漏洞在Java中有着较高的几率出现,任意文件读取漏洞原理很简单,但一些知名的中间件:WeblogicTomcatResin又或者是主流MVC框架:Spring MVCStruts2都存在此类漏洞。
示例 - 存在恶意文件读取漏洞代码:

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <%@ page import="java.io.File" %>
  3. <%@ page import="java.io.FileInputStream" %>
  4. <pre>
  5. <%
  6. File file = new File(request.getRealPath("/") + request.getParameter("name"));
  7. FileInputStream in = new FileInputStream(file);
  8. int tempbyte;
  9. while ((tempbyte = in.read()) != -1) {
  10. out.write(tempbyte);
  11. }
  12. in.close();
  13. %>
  14. </pre>

1.1 同级目录任意文件读取漏洞测试

攻击者通过传入恶意的name参数可以读取服务器中的任意文件:http://localhost:8000/modules/filesystem/FileInputStream.jsp?name=./index.jsp,如下图:
2. 任意文件读取 - 图1

1.2 读取WEB-INF/web.xml测试

当攻击者通过传入恶意的name参数值为WEB-INF/web.xml时可以读取Web应用的配置信息,请求:http://localhost:8000/modules/filesystem/FileInputStream.jsp?name=WEB-INF/web.xml,如下图:
2. 任意文件读取 - 图2

1.3 跨目录读取敏感文件测试

开发人员通常使用文件名、文件后缀、文件目录进行拼接的方式来获取待操作文件的绝对路径并进行相关操作,在这种情况下,攻击者如果想要查看服务器中的其他目录,则会使用 ../ 进行目录的跨越,常使用的操作是跨越目录到服务根目录,再向下寻找文件。例如../../../../../../../../etc/passwd
请求:http://localhost:8000/modules/filesystem/FileInputStream.jsp?name=../../../../../../../../../../../../etc/passwd,如下图:
2. 任意文件读取 - 图3