一次代码审计中发现的小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 漏洞原理
当请求转发路由可控时,可能产生两类安全问题:
- 鉴权绕过:转发至需要鉴权的路由
- 文件读取:转发至服务器上的实体文件
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中转发路由可控时,可能导致:
- 鉴权绕过:转发至受保护的功能路由
- 有限文件读取:读取WEB-INF等目录下的配置文件
7. 防御措施
- 避免用户可控的转发路径
- 对转发目标进行严格校验
- 鉴权检查应在转发前完成
- 限制可转发的目录范围
- 对路径中的特殊字符进行过滤
8. 审计要点
代码审计时应关注:
- 所有使用
getRequestDispatcher().forward()的地方 - 检查转发目标是否来自用户可控参数
- 验证转发前的权限检查是否完备
- 检查可转发的文件类型限制