#!/usr/bin/env python3 # -*- coding: utf-8 -*- from __future__ import annotations import re # ==================== Threat Types ==================== THREAT_TYPE_JNDI_INJECTION = "jndi_injection" THREAT_TYPE_NESTED_EXPRESSION = "nested_expression" THREAT_TYPE_SQL_INJECTION = "sql_injection" THREAT_TYPE_XSS = "xss" THREAT_TYPE_PATH_TRAVERSAL = "path_traversal" THREAT_TYPE_COMMAND_INJECTION = "command_injection" THREAT_TYPE_SSRF = "ssrf" THREAT_TYPE_XXE = "xxe" THREAT_TYPE_TEMPLATE_INJECTION = "template_injection" THREAT_TYPE_SENSITIVE_PATH_PROBE = "sensitive_path_probe" # ==================== Scores ==================== SCORE_JNDI_DIRECT = 100 SCORE_JNDI_OBFUSCATED = 100 SCORE_NESTED_EXPRESSION = 80 SCORE_SQL_INJECTION = 90 SCORE_XSS = 70 SCORE_PATH_TRAVERSAL = 60 SCORE_COMMAND_INJECTION = 85 SCORE_SSRF = 75 SCORE_XXE = 85 SCORE_TEMPLATE_INJECTION = 70 SCORE_SENSITIVE_PATH_PROBE = 40 # ==================== JNDI (Log4j) ==================== # # - Direct: ${jndi:ldap://...} / ${jndi:rmi://...} => 100 # - Obfuscated: ${${xxx:-j}${xxx:-n}...:ldap://...} => detect # - Nested expression: ${${...}} => 80 JNDI_DIRECT_PATTERN = r"\$\{\s*jndi\s*:\s*(?:ldap|rmi)\s*://" # Common Log4j "default value" obfuscation variants: # ${${::-j}${::-n}${::-d}${::-i}:ldap://...} # ${${foo:-j}${bar:-n}${baz:-d}${qux:-i}:rmi://...} JNDI_OBFUSCATED_PATTERN = ( r"\$\{\s*" r"(?:\$\{[^{}]{0,50}:-j\}|\$\{::-[jJ]\})\s*" r"(?:\$\{[^{}]{0,50}:-n\}|\$\{::-[nN]\})\s*" r"(?:\$\{[^{}]{0,50}:-d\}|\$\{::-[dD]\})\s*" r"(?:\$\{[^{}]{0,50}:-i\}|\$\{::-[iI]\})\s*" r":\s*(?:ldap|rmi)\s*://" ) NESTED_EXPRESSION_PATTERN = r"\$\{\s*\$\{" # ==================== SQL Injection ==================== SQLI_UNION_SELECT_PATTERN = r"\bunion\b\s+(?:all\s+)?\bselect\b" SQLI_OR_1_EQ_1_PATTERN = r"\bor\b\s+1\s*=\s*1\b" # ==================== XSS ==================== XSS_SCRIPT_TAG_PATTERN = r"<\s*script\b" XSS_JS_PROTOCOL_PATTERN = r"javascript\s*:" XSS_INLINE_EVENT_HANDLER_PATTERN = r"\bon\w+\s*=" # ==================== Path Traversal ==================== PATH_TRAVERSAL_PATTERN = r"(?:\.\./|\.\.\\)+" # ==================== Command Injection ==================== CMD_INJECTION_OPERATOR_WITH_CMD_PATTERN = ( r"(?:;|&&|\|\||\|)\s*" r"(?:bash|sh|zsh|cmd|powershell|pwsh|curl|wget|nc|netcat|python|perl|ruby|php|node|cat|ls|id|whoami|uname|rm)\b" ) CMD_INJECTION_SUBSHELL_PATTERN = r"(?:`[^`]{1,200}`|\$\([^)]{1,200}\))" # ==================== SSRF ==================== SSRF_LOCALHOST_URL_PATTERN = r"\bhttps?\s*:\s*//\s*(?:127\.0\.0\.1\b|localhost\b|0\.0\.0\.0\b)" SSRF_INTERNAL_IP_URL_PATTERN = r"\bhttps?\s*:\s*//\s*(?:10\.|192\.168\.|172\.(?:1[6-9]|2[0-9]|3[0-1])\.)" SSRF_DANGEROUS_PROTOCOL_PATTERN = r"\b(?:file|gopher|dict)\s*:\s*//" # ==================== XXE ==================== XXE_DOCTYPE_PATTERN = r"