深入解析目录遍历漏洞探讨其在 Java 代码审计中的应用
通过用户输入,后端接收到参数直接拼接到指定路径下读取用户的文件名,看似正常,但是用户输入的参数不可控制,黑客将非法的特殊字符作为文件名的一部分,操作到其他路径下,甚至是跳转到服务器敏感目录,读取敏感的配置文件,例如服务器的密码文件,程序数据库,redis等核心配置文件,因此具有一定的风险; 人工代码审计 关键字 1 )new FileInputStream( path 2 )new FileOutputStream( path 3 )new File( path 4 )RandomAccessFile fp = new RandomAccessFile(fname,"r"); 5)mkdirs 6 )getOriginalFilename 7 )entry.getName( ... 类和函数 1)sun.nio.ch.FileChannelImpl 2)java.io.File.list/listFiles 3)java.io.FileInputStream 4)java.io.FileOutputStream 5)java.io.FileSystem/Win32FileSystem/WinNTFileSystem/UnixFileSystem 6)sun.nio.fs.UnixFileSystemProvider/WindowsFileSystemProvider 7)java.io.RandomAccessFile 8)sun.nio.fs.CopyFile 9)sun.nio.fs.UnixChannelFactory 10)sun.nio.fs.WindowsChannelFactory 11)java.nio.channels.AsynchronousFileChannel 12)FileUtil/IOUtil 13)filePath/download/deleteFile/move/getFile 在使用这些函数,关键字,类时,对用户传递来的文件对象/文件名/文件路径,是否进行了正确的处理: 是否限制了可操作文件的路径,文件类型,文件所有者; 是否将敏感文件进行了排除 查找getPath(),getAbsolutePath(),查看是否有错误的路径判断; 在排查程序的安全策略配置文件,全局搜索permission,Java.io.FilePermission,grant的字样,是否给程序的某部分路径赋予了读写权限; 问题代码示例 1)文件获取响应文件路径或者创建响应的目录时,对读入的文件路径没有进行过滤与限制,用户可控; //创建读取 要拷贝的文件 InputStream inStream = new FileInputStream(file1); //创建 要复制到的文件,filename未经校验 OutputStream inStream = new FileOutputStream(new File(file2+"\\"+filename)); 2)直接获取文件名称,未进行校验,创建文件; String orgName = mf.getOriginalFilename();//获取文件名 然后 File file = new File(orgName); file.mkdirs();//创建文件根目录 3)路径操作,压缩项覆盖,应用接收恶意zip压缩包,会造成受保护的文件或目录被覆盖等危险; //开始解压 Enumeration entries = zipFile.entries(); //遍历entries 获得entry while(entries.hasMoreElements()){ ZipEntry entry = (ZipEntry)entries.nextElement(); ... File targetFile = new File(entry.getName()); ... targetFile.getParentFile().mkdirs(); } (编辑:银川站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |