Java代码审计:路径穿越

admin 2022年1月16日14:02:49代码审计评论80 views1321字阅读4分24秒阅读模式
1 路径穿越漏洞
    路径穿越(目录遍历), 应用系统在处理下载文件时未对文件进行过滤,系统后台程序程序中如果不能正确地过滤客户端提交的../和./之类的目录跳转符,攻击者可以通过输入../进行目录跳转,从而下载、删除任意文件。

Java代码审计:路径穿越


2 漏洞代码
    文件路径没做限制,通过../递归下载任意文件
GetMapping("/download")public String download(String filename, HttpServletRequest request, HttpServletResponse response) {    String filePath = System.getProperty("user.dir") + "/logs/" + filename;    try {        File file = new File(filePath);        InputStream is = new BufferedInputStream(new FileInputStream(file));        byte[] buffer = new byte[is.available()];        fis.read(buffer);        fis.close();        response.reset();        response.addHeader("Content-Disposition", "attachment;filename=" + filename);        response.addHeader("Content-Length", "" + file.length());        OutputStream toClient = new BufferedOutputStream(response.getOutputStream());        response.setContentType("application/octet-stream");        toClient.write(buffer);        toClient.flush();        toClient.close();        return "下载文件成功:" + filePath;

Java代码审计:路径穿越


3 安全代码
(1)过滤..和/
public static boolean check_traversal(String content) {    return content.contains("..") || content.contains("/");}
(2)ID参数化
  • 对文件名做映射生成id值,通过参数化下载文件可以有效防止遍历问题
  • 需要注意:控制用户权限,避免通过遍历下载文件(越权)

4 编码建议
  • 文件目录避免外部参数拼接。
  • 保存文件目录建议后台写死并对文件名进行校验(字符类型、长度)。
  • 建议文件保存时,将文件名替换为随机字符串。
  • 如因业务需要不能满足1.2.3的要求,文件路径、文件命中拼接了不可行数据,需判断请求文件名和文件路径参数中是否存在../或..(windows), 如存在应判定路径非法并拒绝请求。

5 代码链接
https://github.com/j3ers3/Hello-Java-Sec
6 历史文章
Java代码审计:SQL注入
Java代码审计:XSS与SSRF
Java代码审计:远程代码执行
Java代码审计:反序列化

原文始发于微信公众号(Reset安全):Java代码审计:路径穿越

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月16日14:02:49
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  Java代码审计:路径穿越 http://cn-sec.com/archives/740793.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: