本文主旨总结:使用request.getServerName()的请注意 这个方法的数据来源是不可信的可能被操纵 容易产生跨站漏洞
作为一个快乐的补锅匠,这次补锅是真的快乐,因为解除了一个拿到手一脸懵逼,然后慢慢了解的一块内容:安全漏洞。当然是绿盟扫描出来的了。废话不多话,讲重点。
首先绿盟扫描出来的漏洞是这样的:检测到目标URL存在http host头攻击漏洞
如下图:
大概意思就是如果人家改了下host,就可以调到人家指定的网址了(浅入理解,大神看到一定要指点我下。)
比如这样:curl -H 'Host:www.zujuge.com' http://127.0.0.1:8080/import
得到的就是一个跳转页面,因为这个import不存在啊。而跳转页面包含如下代码
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
System.out.println(request.getScheme());
System.out.println(request.getServerName());
System.out.println(request.getServerPort());
%>
<script type="text/javascript">
window.top.location.href="<%=basePath %>login.jsp";
</script>
也就是说request.getServerName()获取了密令访问时候塞的host值,所以导致跳转到不属于本服务的网站。
解决方法简单,直接把<%=basePath %>换成<%=path %>
这个挺有意思的。