一次代码审计中发现的小tips
字数 970 2025-08-23 18:31:25

Java Web 安全:请求转发漏洞分析与利用

1. 请求转发机制概述

在Java Web开发中,getRequestDispatcher().forward()是一种服务器内部请求转发机制,特点包括:

  • 转发在服务器内部完成,客户端无感知
  • 转发后的URL地址栏不会改变
  • 转发可以访问WEB-INF目录下的资源
  • 转发可以共享request范围内的属性

2. 漏洞发现场景

2.1 登录失败转发案例

原始请求:

POST /user/login?error=error HTTP/1.1
User-Agent: xxx
Content-Type: xxx
...
username=admin&password=123456

代码逻辑:

  • 登录失败后根据error参数值转发到相应路由
  • 使用getRequestDispatcher(xxx).forward()实现转发

2.2 漏洞原理

当请求转发路由可控时,可能产生两类安全问题:

  1. 鉴权绕过:转发至需要鉴权的路由
  2. 文件读取:转发至服务器上的实体文件

3. 鉴权绕过漏洞

3.1 漏洞验证

正常访问受保护路由:

/user/index → 显示未授权

通过转发访问:

/api → 转发至 /user/index → 成功绕过鉴权

3.2 实际利用

通过该漏洞可以:

  • 直接调用登录后接口
  • 实现前台RCE(如直接调用后端upload接口实现未授权任意文件上传)

4. 文件读取漏洞

4.1 基本利用

当转发地址为实体文件时:

  • 可以读取部署路径下的文件
  • 仅限于非JSP等可解析文件(如配置文件)
  • 无法使用../进行路径回溯(会报错)

4.2 实际案例

时空智友历史漏洞payload:

POST /login HTTP/1.1
Host: xxxxxx
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15
Content-Length: 100
Connection: close
Content-Type: application/x-www-form-urlencoded
Upgrade-Insecure-Requests: 1
Accept-Encoding: gzip

op=verify%7Clogin&targetpage=&errorpage=/WEB-INF/dwr.xml&mark=&tzo=480&username=admin&password=admin

漏洞限制:

  • 仅能读取部署路径下的部分文件
  • 不能实现真正的任意文件读取

5. 其他相关案例

用友最新通报的漏洞中:

  • /pt路由使用nc.uap.lfw.core.servlet.CoreServlet处理
  • doPost方法中使用自定义forward进行转发
  • 通过反射进行调用

6. 漏洞总结

getRequestDispatcher中转发路由可控时,可能导致:

  1. 鉴权绕过:转发至受保护的功能路由
  2. 有限文件读取:读取WEB-INF等目录下的配置文件

7. 防御措施

  1. 避免用户可控的转发路径
  2. 对转发目标进行严格校验
  3. 鉴权检查应在转发前完成
  4. 限制可转发的目录范围
  5. 对路径中的特殊字符进行过滤

8. 审计要点

代码审计时应关注:

  1. 所有使用getRequestDispatcher().forward()的地方
  2. 检查转发目标是否来自用户可控参数
  3. 验证转发前的权限检查是否完备
  4. 检查可转发的文件类型限制
Java Web 安全:请求转发漏洞分析与利用 1. 请求转发机制概述 在Java Web开发中, getRequestDispatcher().forward() 是一种服务器内部请求转发机制,特点包括: 转发在服务器内部完成,客户端无感知 转发后的URL地址栏不会改变 转发可以访问WEB-INF目录下的资源 转发可以共享request范围内的属性 2. 漏洞发现场景 2.1 登录失败转发案例 原始请求: 代码逻辑: 登录失败后根据error参数值转发到相应路由 使用 getRequestDispatcher(xxx).forward() 实现转发 2.2 漏洞原理 当请求转发路由可控时,可能产生两类安全问题: 鉴权绕过 :转发至需要鉴权的路由 文件读取 :转发至服务器上的实体文件 3. 鉴权绕过漏洞 3.1 漏洞验证 正常访问受保护路由: 通过转发访问: 3.2 实际利用 通过该漏洞可以: 直接调用登录后接口 实现前台RCE(如直接调用后端upload接口实现未授权任意文件上传) 4. 文件读取漏洞 4.1 基本利用 当转发地址为实体文件时: 可以读取部署路径下的文件 仅限于非JSP等可解析文件(如配置文件) 无法使用 ../ 进行路径回溯(会报错) 4.2 实际案例 时空智友历史漏洞payload: 漏洞限制: 仅能读取部署路径下的部分文件 不能实现真正的任意文件读取 5. 其他相关案例 用友最新通报的漏洞中: /pt 路由使用 nc.uap.lfw.core.servlet.CoreServlet 处理 在 doPost 方法中使用自定义forward进行转发 通过反射进行调用 6. 漏洞总结 当 getRequestDispatcher 中转发路由可控时,可能导致: 鉴权绕过 :转发至受保护的功能路由 有限文件读取 :读取WEB-INF等目录下的配置文件 7. 防御措施 避免用户可控的转发路径 对转发目标进行严格校验 鉴权检查应在转发前完成 限制可转发的目录范围 对路径中的特殊字符进行过滤 8. 审计要点 代码审计时应关注: 所有使用 getRequestDispatcher().forward() 的地方 检查转发目标是否来自用户可控参数 验证转发前的权限检查是否完备 检查可转发的文件类型限制