# Java HTTP Host頭攻擊原理以及如何防御
## 什么是Host頭攻擊?
HTTP Host頭攻擊(Host Header Attack)是一種利用服務器對HTTP請求中Host頭處理不當的安全漏洞。攻擊者通過篡改Host頭,可能實現以下惡意行為:
- 密碼重置郵件劫持
- 緩存污染(Cache Poisoning)
- 繞過身份驗證
- 服務端請求偽造(SSRF)
## 攻擊原理分析
### 1. 傳統Web服務器配置問題
```java
// 不安全的代碼示例:直接使用Host頭構造URL
String resetUrl = "http://" + request.getHeader("Host") + "/reset?token=" + token;
當服務器: 1. 過度信任客戶端提供的Host頭 2. 未進行規范化驗證 3. 用于敏感操作(如密碼重置鏈接生成)
基本Host頭注入:
GET / HTTP/1.1
Host: evil.com
端口篡改:
GET / HTTP/1.1
Host: example.com:9999
CRLF注入:
GET / HTTP/1.1
Host: example.com\r\nX-Forwarded-Host: evil.com
@GetMapping("/redirect")
public String redirect(@RequestParam String url) {
// 危險的重定向實現
return "redirect:" + url;
}
String adminUrl = "http://" + hostHeader + "/admin/panel";
String emailBody = "請點擊重置密碼:" + generateResetLink(request.getHeader("Host"));
# Nginx配置示例
server {
listen 80;
server_name example.com;
if ($host != "example.com") {
return 403;
}
}
return "redirect:/dashboard"; // 而非完整URL
@Component
public class HostHeaderFilter implements Filter {
private final String validHost = "example.com";
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
String host = request.getHeader("Host");
if (!validHost.equals(host)) {
((HttpServletResponse) res).sendError(HttpServletResponse.SC_BAD_REQUEST);
return;
}
chain.doFilter(req, res);
}
}
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.headers()
.httpStrictTransportSecurity()
.and()
.addFilterBefore(new HostHeaderFilter(), ChannelProcessingFilter.class);
}
}
// 正確做法 String domain = “trusted-domain.com”;
2. **使用白名單驗證**:
```java
private static final Set<String> ALLOWED_DOMNS = Set.of(
"example.com", "www.example.com");
public boolean isValidDomain(String host) {
return ALLOWED_DOMNS.contains(host.toLowerCase());
}
URI trustedUri = new URIBuilder()
.setScheme("https")
.setHost("example.com")
.setPath("/reset")
.build();
使用Burp Suite修改Host頭測試
自動化掃描工具檢查:
nmap -p 80 --script http-host-header-attack example.com
單元測試用例:
@Test
void testHostHeaderValidation() {
MockHttpServletRequest request = new MockHttpServletRequest();
request.addHeader("Host", "evil.com");
assertThrows(SecurityException.class,
() -> securityFilter.doFilter(request, new MockHttpServletResponse(), null));
}
Host頭攻擊是Web應用常見的中危漏洞,Java開發者應: 1. 永遠不信任客戶端提供的Host頭 2. 使用白名單機制驗證域名 3. 關鍵操作使用固定域名 4. 定期進行安全審計
通過結合服務器配置、框架安全和代碼規范的多層防御,可有效消除此類風險。 “`
注:實際使用時可根據具體技術棧調整代碼示例,建議配合OWASP Cheat Sheet等權威指南實施防御措施。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。