thinkgem/jeesite5

任意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()
image
image
image
在请求里面获取__url的值,如果鉴权成功,跳转到构造的url。

测试

url:*****/js/a/login?__url=http://baidu.com/

本地测试:http://localhost:8980/js/a/login?__url=http://baidu.com/
image
image
image
放包成功跳转到构造的url
image

解决方案:

// ...
		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;
	}