本文主旨總結:使用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 %>
這個挺有意思的。