目录穿越漏洞
目录穿越漏洞常常出现在需要用户提供路径或文件名时,如文件下载,如果没有对类似../
的字符进行过滤,有可能会造成目录穿越漏洞。
示例代码如下:
1 |
|
在url中加入../../flag.txt成功跨目录读取
目录穿越漏洞修复
- 通过ID进行文件索引下载文件
- 合理配置权限
- 对目录进行限制
也可以直接加入以下代码检测跨目录
1 | if(temp.indexOf("..")!=-1||temp.charAt(0)=="/") |
URL跳转漏洞
URL跳转漏洞简介
由于业务需要,很多Web应用需要与内部其他服务器或者第三方服务进行交互,这样就需要重定向的功能,由当前页面跳转到其他页面。由于是从可信站点进行跳转的,因此用户会对跳转后的链接比较信任,假如跳转参数可控,可能跳转到钓鱼网站造成危害。
URL跳转代码实现
ModelAndView方式
1
2
3
4
5
6
7
8
9
public class modelRedirect {
public ModelAndView testforward(HttpServletRequest request, HttpServletResponse response){
String url = request.getParameter("url");
url = "redirect:"+url;
return new ModelAndView(url);
}
}这样就能跳转到其他页面
通过返回String方式
1
2
3public String redirect( String url){
return "redirect:"+url;
}使用sendRedirect方式
1
2
3
4public static void sendRedirect(HttpServletRequest request,HttpServletResponse response) throws IOException{
String url = request.getParameter("url");
response.sendRedirect(url);
}使用RedirectAttributes方式
RedirectAttributes
跟sendRedirect相比多了参数传递的过程。如下传递了id=2
到/hello
对应的页面1
2
3
4
5
6
7
8
public class attrredirect {
public String test4(RedirectAttributes redirectAttributes){
redirectAttributes.addAttribute("id","2");
return "redirect:/hello";
}
}注意需要使用
@Controller
注解通过设置Header来进行跳转
1
2
3
4
5
6
7
8
9
public class headredirect {
public static void setHeader(HttpServletRequest request, HttpServletResponse response){
String url = request.getParameter("url");
response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
response.setHeader("Location",url);
}
}HttpServletResponse.SC_MOVED_TEMPORARILY
表示临时跳转,即302
URL跳转漏洞审计关键字
1 | redirect |
URL跳转漏洞修复
严格控制要跳转的域名
限制通过路径跳转而不是url,如下
1
2String url = request.getParameter("url");
RequestDispatcher rd = request.getRequestDispatcher(url);