Java代码审计之目录穿越和URL跳转
前言
目录穿越以及URL跳转,是Java代码审计中常见的两种漏洞,本文主要就是针对于这两种漏洞的基本利用分析。
目录穿越
目录穿越漏洞产生的本质是路径可控,一旦涉及文件的读取问题 便会涉及java.io.File类,因此在审计这类漏洞时可以优先查找 java.io.File引用,并根据经验来判断Paths、path、System.getProperty("user.dir")等各类可能会用来构造路径的关 键字。
若项目采用Spring MVC这类框架也可以先查看一下路由,判断是 否存在如path之类的路由
危害
漏洞危害:获取敏感信息、下载任意 文件等。
测试
接下来我们一起看一个十分常见的目录穿越漏洞的原型,通过搜 索关键字或查看路由找到可能存在漏洞的文件
@RestController
public class DirectoryTraversalController {
@RequestMapping("/download")
public String downloadFile(@RequestParam("file")String file, HttpServletResponse response){
String filePath = System.getProperty("user.dir") file;
System.out.println(filePath);
File imageFile = new File(filePath);
response.setCharacterEncoding("UTF-8");
if (imageFile.exists()){
FileInputStream fis = null;
OutputStream os = null;
try{
fis = new FileInputStream(imageFile);
os = response.getOutputStream();
int count = 0;
byte[] b = new byte[1024];
while((count=fis.read(b))!=-1){
os.write(b,0,count);
os.flush();
}
os.close();
}catch (Exception e){
e.printStackTrace();
}finally {
try{
os.close();
fis.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
return "Success!";
}
}
程序通过System.getProperty获取当前路径,随后与 file变量进行拼接构成新的路径,而file参数是通过 String file传入的,这里没做过滤,因此可能会导致目录穿越漏洞。
防御
对于目录穿越漏洞的防御相对简单,一般有以下方法:对文件名 进行过滤,防止出现“./”等特殊符号;采用ID索引的方法来下载文 件,而不是直接通过文件名;对目录进行限制;合理配置权限等。
- 通过ID进行文件索引下载文件
- 合理配置权限
- 对目录进行限制
也可以直接加入以下代码检测../
if(file.contains("..")||file.charAt(0)=='/'){
return "no no no!";
}
URL跳转漏洞
由于业务需要,很多Web应用需要与内部其他服务器或者第三方服务进行交互,这样就需要重定向的功能,由当前页面跳转到其他页面。由于是从可信站点进行跳转的,因此用户会对跳转后的链接比较信任,假如跳转参数可控,可能跳转到钓鱼网站造成危害。
URL重定向常见方式
下面是URL跳转典型的实现代码:通过Header的重定向功能实现 URL的跳转,后面会讲解其他几种Java语言中可以实现URL跳转的代码:
ModelAndView
@RequestMapping("/redirect1")
public ModelAndView ModelAndView(HttpServletRequest request, HttpServletResponse response){
String url = request.getParameter("url");
url = "redirect:" url;
return new ModelAndView(url);
}
通过String返回
@RequestMapping("/redirect2")
public String redirect(@RequestParam("url") String url){
return "redirect:" url;
}
sendRedirect
@RequestMapping("/redirect3")
public static void sendRedirect(HttpServletRequest request,HttpServletResponse response) throws IOException {
String url = request.getParameter("url");
response.sendRedirect(url);
}
RedirectAttributes
RedirectAttributes
跟sendRedirect相比多了参数传递的过程。如下传递了id=2
到/hello
对应的页面
@RequestMapping("/redirect4")
public String RedirectAttributes(RedirectAttributes redirectAttributes,String url){
redirectAttributes.addAttribute("id",url);
return "redirect:/index";
}
根据指定的url跳转到127.0.0.1:8081/index?id=url
Header跳转
可以通过设置Header来进行跳转
response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARIL Y)设置返回的状态码:
- SC_MOVED_PERMANENTLY 是301永久重定向
- SC_MOVED_TEMPORARILY 是302临时重定向
@RequestMapping("/redirect5")
public static void setHeader(HttpServletRequest request, HttpServletResponse response){
String url = request.getParameter("url");
response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
response.setHeader("Location",url);
}
防御
1、将跳转的url参数设为不可控,例:
public static void sendRedirect(HttpServletRequest request,HttpServletResponse response) throws IOException {
String url = "http://sentiment.com";
response.sendRedirect(url);
}
2、利用RequestDispatcher实现服务器内跳转
RequestDispatcher.forward()方法仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址。
public static void sendRedirect(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException {
String url = request.getParameter("url");
RequestDispatcher rd = request.getRequestDispatcher(url);
rd.forward(request,response);
}
常见关键字
redirect
sendRedirect
ModelAndView
Location
addAttribute
结语
今天主要是对Java的目录穿越以及URL跳转漏洞进行了一个简单的总结,并记录了一些我们在代码审计中应重点注意的关键字,希望对正在学习Java代码审计的小伙伴有所帮助。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanekca
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
photoshop蒙版画笔没反应怎么办
PHP中文网 06-24