任意url跳转
unam4 opened this issue · 1 comments
unam4 commented
This is the Chinese report, the English report is in(这是中文的漏洞报告,英文的在): Arbitrary URL redirection vulnerability
描述
***@RequestMapping(value = "index")***在登陆时,没有对__url做出限制,导致登陆成功后,跳转到伪造页面。 版本:v5.2.0
漏洞详细
该接口接受到请求后,获取__url的地址。
com.jeesite.modules.sys.web#index()
在请求里面获取__url的值,如果鉴权成功,跳转到构造的url。
测试
url:*****/js/a/login?__url=http://baidu.com/
本地测试:http://localhost:8980/js/a/login?__url=http://baidu.com/
放包成功跳转到构造的url
think-gem commented
解决方案:
// ...
String successUrl = request.getParameter("__url");
if (StringUtils.isBlank(successUrl)){
successUrl = (String)request.getAttribute("__url");
}
// 增加代码:
if (StringUtils.contains(successUrl, "://")){
String domain = getRequestDomain(successUrl);
successUrl = StringUtils.substring(successUrl, domain.length());
if (StringUtils.startsWith(successUrl, request.getContextPath())) {
successUrl = StringUtils.substringAfter(successUrl, request.getContextPath());
}
}
// ...
// 增加方法:
private String getRequestDomain(String url) {
String scheme = StringUtils.substringBefore(url, "://");
String domain = StringUtils.substringAfter(url, "://");
if (StringUtils.contains(domain, "/")) {
domain = StringUtils.substringBefore(domain, "/");
}
return scheme + "://" + domain;
}