| Nom du plugin | Learnify |
|---|---|
| Type de vulnérabilité | Inclusion de fichiers locaux |
| Numéro CVE | CVE-2025-60085 |
| Urgence | Élevé |
| Date de publication CVE | 2026-04-25 |
| URL source | CVE-2025-60085 |
Critical Local File Inclusion in Learnify Theme (≤ 1.15.0) — Immediate Steps for WordPress Site Owners
Date : 2026-04-25 | Auteur : Expert en sécurité de Hong Kong
Résumé
A critical Local File Inclusion (LFI) vulnerability has been disclosed in the Learnify WordPress theme affecting versions ≤ 1.15.0 (CVE-2025-60085). The flaw allows unauthenticated attackers to include and display local files from the webserver. This vulnerability carries a high severity (CVSS 8.1) and can be exploited widely — exposing files such as wp-config.php, environment files, and other readable server-side files. Consequences can include credential disclosure, database compromise, and potentially full site takeover depending on the environment.
If your site uses Learnify, treat this as urgent. The guidance below explains the vulnerability, exploitation techniques, detection indicators, immediate mitigations, and incident response steps tailored for site owners and administrators.
Qu'est-ce que l'inclusion de fichiers locaux (LFI) ?
Local File Inclusion occurs when user-controlled input determines which server-side file an application includes or reads, without adequate validation. In PHP-based applications this can look like:
include($_GET['template']);require_once($_REQUEST['page']);
If an attacker controls that input, they can force the application to read arbitrary local files. Common impacts:
- Disclosure of secrets (database credentials, API keys).
- Information gathering for follow-on attacks.
- Potential Remote Code Execution (RCE) when chained with other misconfigurations or vulnerable wrappers (e.g.,
php://wrappers).
Why this Learnify LFI is dangerous
Faits clés :
- Impact: Learnify themes ≤ 1.15.0.
- CVE: CVE-2025-60085.
- Privilège requis : aucun (non authentifié).
- CVSS : 8.1 (Élevé).
- At disclosure: no guaranteed vendor patch available — site owners must apply mitigations promptly.
This LFI is high-priority because it is unauthenticated, easily scanned at scale, targets files that often contain credentials (like wp-config.php), and can be chained to escalate into more severe compromises.
Technical details (how attackers typically exploit LFI)
Attackers follow common steps when exploiting LFI. Understanding the pattern helps with detection and mitigation.
- Finding the entry point
Look for theme code that includes files using variables influenced by request parameters, e.g.:
include( $theme_dir . '/' . $_GET['tpl'] ); - Path traversal
Payloads include traversal sequences to reach sensitive files:
../../../../etc/passwdou../../../../wp-config.php. - Using wrappers to read files
Wrappers likephp://filtercan force printable output:
?tpl=php://filter/convert.base64-encode/resource=../../../../wp-config.php. - Null byte and encoding tricks
Older servers might be targeted with null byte (%00) truncation or encoded payloads:
?tpl=../../../../wp-config.php%00. - Post-exploitation
Extracted credentials can be used to access the database, create admin users, install backdoors, or upload PHP shells if writeable areas exist.
The disclosure indicates the Learnify inclusion logic did not sufficiently validate user-supplied paths, enabling the methods above.
Indicators and malicious request patterns to look for
Recherchez ces modèles dans les journaux :
php://filter/convert.base64-encode/resource=- Appels répétés
../ou des variantes encodées comme..%2F..%2F - Tentatives de byte nul :
%00 - Requests to theme PHP files with query parameters like
?tpl=ou?page= - Long base64 strings in normal HTML responses (file contents encoded)
Example suspicious request:
GET /wp-content/themes/learnify/somefile.php?template=php://filter/convert.base64-encode/resource=../../../../wp-config.php HTTP/1.1
If you see this pattern, treat it as high priority and investigate immediately.
Immediate action checklist (first hours)
If your site uses Learnify ≤ 1.15.0, perform these steps now:
- Place the site into maintenance mode or apply temporary access controls (IP allowlist) to reduce exposure.
- Switch to a clean theme (WordPress default) or remove the vulnerable theme from public-facing directories. Do not leave the vulnerable theme active.
- If an official patch is published, apply it immediately. If not, use the mitigations below.
- Apply server-level rules to block traversal sequences and
php://wrapper attempts (virtual patching at the webserver layer). - Do not change database credentials until you have reliable backups and have checked for signs of compromise; when safe, rotate DB passwords and secrets.
- Rotate secret keys and salts in
wp-config.phpafter you have remediated and verified integrity. - Scan for webshells, suspicious files, and modified timestamps.
- Restore from a verified clean backup if you detect a compromise.
- Increase monitoring: enable file integrity checks, audit logs and alerting.
If you lack in-house capability, contact your hosting provider or a trusted security consultant and share the indicators above.
How to detect whether your site has been exploited
Even after you remove the vulnerable theme or apply fixes, check for traces of compromise:
- Fichiers nouveaux ou modifiés sous
wp-content/uploads,wp-content/themes,wp-content/plugins, or unexpected locations. - New admin users in WordPress (inspect the
wp_usersle tableau). - Suspicious scheduled tasks or cron entries stored in the database.
- Outbound connections to unknown IPs from the server (check firewall/host logs).
- Unusual CPU/IO usage or traffic spikes.
- Database queries from unfamiliar accounts or unexpected queries in slow logs.
- Unknown PHP files or encoded scripts using
eval,base64_decode, ougzinflate.
Recommended actions: file integrity tools, malware scans, and manual inspection of critical files (wp-config.php, .htaccess, theme and plugin entry points).
Réponse aux incidents : manuel étape par étape
- Contenir
- Take the site offline or block traffic to prevent further damage.
- Revoke compromised credentials and API keys.
- Isolate the server from the network if feasible.
- Mettez le site hors ligne (mode maintenance) si possible.
- Backup logs (webserver, database, application) and, if needed, disk images.
- Preserve timestamps for forensic analysis; do not overwrite logs.
- Éradiquer
- Remove backdoors, shells and malicious scripts.
- Reinstall WordPress core, plugins and themes from verified clean sources.
- Rebuild servers from clean images if server-level persistence is suspected.
- Récupérer
- Restore from a clean backup (from before the compromise).
- Apply security patches and hardening measures.
- Change all passwords and rotate keys and salts.
- Post-récupération
- Strengthen monitoring and logging.
- Conduct a post-mortem to identify failed controls and closing the gaps.
- Update incident response plans and educate the team.
- Notifiez
- Notify stakeholders and your hosting provider. Follow local regulatory or contractual notification requirements where applicable.
Hardening recommendations to reduce LFI risk
- Principe du moindre privilège
Ensure minimal file and directory permissions. Most WordPress files should be readable by the webserver but not writable. Onlywp-content/uploadsshould be writable for uploads. - Configuration PHP
Désactiverautoriser_inclusion_url, restrict viaopen_basedir, and disable unnecessary functions likeexec,shell_exec, if not required by your environment. - Disable built-in editor
Ajouter àwp-config.php:define('DISALLOW_FILE_EDIT', true); - Secure uploads
Prevent execution of PHP files inwp-content/uploadswith server rules (examples below). - Faire tourner les sels et les clés
Use strong, unique salts and rotate them after remediation to invalidate existing sessions. - Backups and testing
Maintain regular, offsite backups and test restores periodically. - Code review and staged upgrades
Review third-party themes/plugins before deployment or restrict their use until verified.
Règles WAF pratiques et atténuations au niveau du serveur
Webserver-level blocks (virtual patching) can buy time when an official patch is unavailable. Test rules on a staging system before applying in production.
Important patterns to detect and block:
- Any parameter value containing
php://filter - Parameters with multiple
../sequences - Null byte attempts (
%00) - Requêtes tentant d'inclure
wp-config.php,.env,/etc/passwd
Example ModSecurity/CRS-style rule:
# Block common LFI attack signatures
SecRule REQUEST_URI|ARGS|ARGS_NAMES|REQUEST_HEADERS "@rx (?i)((\.\./)|(\.\.\\)|php://filter|php%3A%2F%2Ffilter|%00|/etc/passwd|wp-config.php)" \
"id:1009001,phase:1,deny,status:403,log,msg:'Potential LFI attempt blocked',severity:2,tag:'LFI',tag:'OWASP_TOP_10_A03'"
Nginx rule example:
if ($request_uri ~* "(php://filter|%00|\.\./){1,}") {
return 403;
}
Apache .htaccess snippet to block PHP execution in uploads:
# Protect uploads - prevent PHP execution
Order Allow,Deny
Deny from all
Apply such rules carefully — overly broad rules can break legitimate functionality. Prioritise staging/testing and incremental deployment.
Sample detection regex and log analysis tips
Use these patterns for automated log scanning (case-insensitive):
(?i)(php%3A%2F%2Ffilter|php://filter|(\.\./){2,}|(\.\.\\){2,}|%00|wp-config\.php|/etc/passwd)
Alert on log entries such as:
- GET /wp-content/themes/learnify/… ?…=php://filter/convert.base64-encode/resource=../../../../wp-config.php
- Any request using
php://wrappers - Responses returning base64-encoded content in normal HTML pages
Run daily scans of logs for these signatures and notify administrators when matches occur.
Safe test to check for vulnerability (site owners only)
Only perform these checks on sites you own or operate. Do not test third-party sites.
- Use a non-destructive
php://filterrequest targeting a known, harmless file (for instance a themereadme). - Example request:
GET /wp-content/themes/learnify/index.php?tpl=php://filter/convert.base64-encode/resource=inc/readme.html
If the response includes a base64 string that decodes to the file content, the inclusion function is vulnerable. Stop testing and proceed to mitigation immediately.
Remediation decision tree
Choose the appropriate path depending on availability of an official patch:
- If a patched version exists: update immediately, then verify integrity (file scans, password rotations).
- If no patch exists: remove the theme from active use, apply server-level rules to block exploitation, and consider replacing the theme with a maintained alternative.
- If the theme cannot be removed: enforce strict access controls (IP whitelist), apply tight server rules, and increase monitoring and frequent integrity checks.
After remediation: validate and monitor
After applying fixes:
- Re-run automated vulnerability and malware scanners.
- Verify no unexpected admin accounts or scheduled tasks exist.
- Check for unexpected outbound network activity.
- Ensure backups are clean and recent.
- Maintain heightened monitoring for at least 30 days post-remediation.
Questions fréquemment posées (FAQ)
- Q: Can LFI lead to Remote Code Execution?
- A: LFI is primarily a file read/inclusion vulnerability. RCE is possible if an attacker can include a file they control (e.g., an uploaded PHP file) or chain the LFI with other insecure configurations (writable directories, dangerous wrappers).
- Q: I use a child theme of Learnify — am I affected?
- A: Possibly. Child themes inherit parent code. If the vulnerable logic exists in the Learnify parent theme and that parent is ≤ 1.15.0, you are likely impacted. Check the parent theme version and act accordingly.
- Q: I patched the theme — do I still need to rotate credentials?
- A: Yes. Patching prevents new exploitation but does not remove any previous compromise. Rotate DB passwords, API keys, and salts if there was any exposure.
- Q: How can I be notified of similar vulnerabilities?
- A: Subscribe to reputable security advisories and mailing lists, enable automated vulnerability alerts for installed themes/plugins, and keep logging and monitoring active.
Dernières réflexions d'un point de vue de sécurité à Hong Kong
This Learnify LFI disclosure highlights a recurring reality: third-party themes and plugins can introduce critical weaknesses. In Hong Kong’s fast-moving digital environment, the priorities are speed and thoroughness — act quickly to contain exposure, and investigate fully to determine whether credentials or systems were accessed.
Practical priorities: quickly remove or isolate vulnerable components, apply server-level mitigations, verify integrity, rotate secrets, and sustain monitoring. If you manage multiple sites, treat this disclosure as a prompt to inventory theme versions and enforce an upgrade or replacement plan.
For organisations without in-house security capability, engage a qualified security consultant or your hosting support team to assist with containment, forensics and remediation.
Appendix A: Quick checklist (copy/paste)
- [ ] Identify if Learnify ≤ 1.15.0 is installed.
- [ ] Switch to a different theme or deactivate Learnify.
- [ ] Apply server rules to block
php://filterand path traversal attempts. - [ ] Scan for webshells and unauthorized file modifications.
- [ ] Rotate DB credentials and WordPress salts.
- [ ] Restore from clean backup if compromise is detected.
- [ ] Implement file permission hardening.
- [ ] Enable file integrity monitoring and alerting.
- [ ] Monitor logs for 30 days after remediation.
Appendix B: Additional resources and references
- CVE-2025-60085 advisory
- PHP hardening best practices (open_basedir, disable dangerous functions)
- WordPress security handbook and administration guides
- WAF tuning and rule testing guides (test on staging before production)
Important : The actions above are operationally sensitive. If you suspect compromise and lack the skills to follow the incident playbook, seek assistance from a trusted, professional security responder or your hosting provider.