初识Host注入及Burp插件开发
字数 1295 2025-08-13 21:33:20
HTTP Host头注入漏洞分析与Burp插件开发指南
1. HTTP Host头基础
HTTP协议从1.0到1.1及后续版本中,Host头指定了请求资源的Internet主机和端口号。在HTTP/1.1中,Host头的主要功能是将客户端请求分发到内部具体的域名中。
1.1 Host头的作用机制
- 虚拟主机区分:当一台服务器托管多个网站时,通过Host头区分不同域名
- 解析流程:
客户端 → 请求 → URL → 解析IP地址 → 服务器 → 解析Host值 → 转发到具体域名
1.2 常见配置场景
- 基于端口的虚拟主机:不同web程序通过不同端口区分
- 基于域名的虚拟主机:多个域名解析到同一IP,通过Host头区分
2. Host头注入漏洞原理
2.1 漏洞成因
- 用户可控制HTTP Host头
- 服务器过度信任客户端提交的Host值
- 应用程序可能支持额外标头:
X-Forwarded-HostX-Host
2.2 常见危险代码示例
<link href=http://_SERVER["HTTP_HOST"]></link> // 触发GET请求
<form method="POST"></form> // 触发POST请求
3. Host头注入的安全风险
3.1 密码重置劫持
攻击流程:
- 攻击者请求密码重置功能
- 修改Host头或添加
X-Forwarded-Host为恶意域名 - 服务器使用伪造Host生成重置链接
- 受害者点击恶意链接,令牌泄露
示例:
请求头:X-Forwarded-Host: evil.com
生成链接:https://evil.com/user/reset_password/...令牌...
3.2 XSS攻击
- 网站根据Host加载CSS样式表
- 恶意Host可插入HTML代码
- 可能导致网络钓鱼攻击
3.3 Web缓存投毒
攻击原理:
- 发送导致有害响应的请求
- 有害响应被缓存并服务其他用户
Nginx特殊行为:
- 只识别最后一个Host头
GET / HTTP/1.1
Host: test.com
Host: vuln.com
3.4 补充风险
- 无效Host头通常被转发到第一个虚拟主机
- Apache配置可能将任意Host请求转发给应用
4. Burp被动检测插件开发
4.1 插件设计思路
- 使用Burp Collaborator生成DNSLOG地址
- 过滤掉403和404响应
- 替换Host字段为DNSLOG地址
- 构造并发送请求
- 检测响应中的注入迹象
4.2 关键代码实现
class BurpExtender(IBurpExtender, IScannerCheck, IBurpCollaboratorClientContext):
def registerExtenderCallbacks(self, callbacks):
# 基本设置
self._callbacks = callbacks
self._helpers = callbacks.getHelpers()
callbacks.setExtensionName('Host Scan')
# 生成DNSLOG payload
self.collaboratorContext = callbacks.createBurpCollaboratorClientContext()
self.payload = self.collaboratorContext.generatePayload(True)
# 注册扫描器
callbacks.registerScannerCheck(self)
def doPassiveScan(self, baseRequestResponse):
# 获取请求头部
request = baseRequestResponse.getRequest()
analyzedRequest = self._helpers.analyzeRequest(request)
request_header = analyzedRequest.getHeaders()
# 构造新请求
new_req_header = [h.replace("Host:", "Host: " + self.payload) for h in request_header]
newMessage = self._helpers.buildHttpMessage(new_req_header, request_body)
# 发送请求并分析响应
newIHttpRequestResponse = self._callbacks.makeHttpRequest(httpService, newMessage)
newResponse = newIHttpRequestResponse.getResponse()
newResponseInfo = self._helpers.analyzeResponse(newResponse)
# 检测注入迹象
issues = []
if str(newResponseStatus) in ['301', '302'] and self.payload in str(newResponseHeader):
issues.append(self.createIssue("Host injection in Header!", "Medium"))
if re.search(r'(http|https)(://|%3A%2F%2F)' + self.payload, newResponseBody):
issues.append(self.createIssue("Host injection in Body!", "Medium"))
if self.collaboratorContext.fetchCollaboratorInteractionsFor(self.payload):
issues.append(self.createIssue("Host injection!", "High"))
return issues
4.3 检测逻辑
- 响应头检测:检查301/302跳转中的Location头
- 响应体检测:搜索响应体中是否包含payload
- 交互检测:通过Collaborator检查是否有DNS/HTTP请求
4.4 扩展测试建议
- 同时测试
X-Forwarded-Host和X-Host标头 - 测试不同位置(参数、重定向等)的Host头注入
5. 防御措施
- 不信任原则:所有客户端可控的值都不可信
- 白名单验证:对Host头实施严格的白名单校验
- 路径处理:
- 优先使用相对路径:
/test/1.php - 如需绝对路径,硬编码域名:
https://example.com/test/1.php
- 优先使用相对路径:
- 禁用不必要标头:如
X-Forwarded-Host、X-Host - 安全编码:对输出到页面的Host值进行HTML编码
6. 参考资源
- 实战web缓存中毒
- 浅谈http中的Cache-Control
- Burp Suite官方文档
- OWASP Host头注入防护指南
通过本文档,您可以全面了解HTTP Host头注入漏洞的原理、危害、检测方法及防御措施,并掌握基于Burp Suite的自动化检测插件开发技术。